2016-01-08 6 views
5

Czy istnieje sposób identyfikowania zatwierdzeń "zabezpieczeń" (zatwierdzeń, które edytują te same linie i spowodują konflikt) dla określonego zatwierdzenia?git revert: Czy możliwe jest zidentyfikowanie potencjalnie sprzecznych commitów przed faktycznym powrotem?

bardzo uproszczony przykład

$ git init 
$ echo test > test 
$ git add test 
$ git commit -m "First commit" 
$ echo test1 > test 
$ git commit -am "Second commit" 
$ git l 
* 95a29dd Second commit 
* 30a68e6 First commit 
$ type test 
test1 

Zakładając, że w tym momencie z jakiegokolwiek powodu chcę przywrócić 30a68e6.

$ git revert 30a68e6 
error: could not revert 30a68e6... First commit 
hint: after resolving the conflicts, mark the corrected paths 
hint: with 'git add <paths>' or 'git rm <paths>' 
hint: and commit the result with 'git commit' 

Oczywiście, będzie to prowadzić do konfliktu, ponieważ 95a29dd, edycja tej samej linii.

Czy można się wcześniej dowiedzieć, że cofnięcie 30a68e6 spowodowałoby konflikt, a jeśli tak, to z jakim commit (tj. 95a29dd)?

Aby podać trochę kontekstu, potrzebuję tego, ponieważ potrzebuję pewnych przywilejów, które mają być automatycznie przywrócone. W takim przypadku, jeśli wiem, że należy cofnąć 30a68e6, chcę móc zidentyfikować zatwierdzenia "zabezpieczenia", które powinny zostać przywrócone jako pierwsze, aby uniknąć konfliktu (np. 30a68e6). Wiem, że samo przywrócenie wszystkiego, co jest 30a68e6..HEAD, działałoby, ale chciałbym uniknąć cofnięcia zatwierdzeń, które nie będą w konflikcie z 30a68e6.

+0

Ściśle związane: http://stackoverflow.com/q/29517440/2541573 – Jubobs

+0

w pewnym sensie: https://github.com/felipec/git-related – max630

Odpowiedz

0

git revert powinno być łatwe do cofnięcia. Sprawdź kod powrotu przywracania i uruchom git revert --abort, jeśli nie powiodło się (kod powrotu 1) lub git reset --hard HEAD~1, jeśli powiodło się (kod powrotu 0) i nie chcesz go zachować.

Możesz połączyć to z git bisect, aby przeszukać historię, w zależności od potrzeb.

+0

Wiem, jak cofnąć odwracanie git, ale to nie daje mi informacji, które konflikty były w konflikcie. –

+0

Myślę, że algorytm scalania nie polega na interweniującym Zatwierdza, więc być może będziesz musiał znaleźć sposób, aby ręcznie przetestować interweniujące zatwierdzenia, albo z podziałem na bisect, albo z czymś innym. – oyvind

+0

To może być interesujące: http://stackoverflow.com/q/8435343/1463246. Chodzi o 'git log' dla linii. – oyvind

2

(Zastrzeżenie:. Ta odpowiedź jest podobna do mojej odpowiedzi na Is there some kind of 'git rebase --dry-run', which would notify me of conflicts in advance?)

Czy jest możliwe aby dowiedzieć się z góry, że powracanie 30a68e6 spowodowałoby konflikt, a jeśli tak, to z czego zobowiązują (tj 95a29dd)?

W czasie pisania (Git v2.7.0), Git nie ma możliwości dowiedzenia się, przed faktyczną próbą odwrócenia, tego, czy nie napotkasz na konflikty.

Jeśli jednak uruchomisz git revert i uderzysz w konflikt, proces zostanie zatrzymany i zakończy się z niezerowym stanem. Co można zrobić, to sprawdzić status wyjścia operacji revert, a jeśli jest różna od zera, należy uruchomić git revert --abort anulować Przywróć:

git revert ... || git revert --abort

+0

Dzięki za odpowiedź. Działa to częściowo, ponieważ nadal nie pozwala mi stwierdzić, które zatwierdzenie spowodowało konflikt. Czy może czegoś brakuje? –

Powiązane problemy