Git: jak odwrócić scalenie zatwierdzenia?


124

Dzięki SVN łatwo jest scalić zatwierdzenie odwrotne, ale jak to zrobić z Gitem?



Nie sądzę, żeby to miało na myśli to pytanie. Odwrotne scalanie w SVN również przywraca zmiany z zatwierdzenia do zmian lokalnych, dzięki czemu można je edytować i zatwierdzać ponownie.
Dormouse

Odpowiedzi:


105

Aby utworzyć nowy zatwierdzenie, które `` cofa '' zmiany poprzedniego zatwierdzenia, użyj:

$ git revert <commit>

Możliwe jest również faktyczne usunięcie zatwierdzenia z dowolnego punktu w przeszłości poprzez zmianę bazy, a następnie zresetowanie, ale naprawdę nie chcesz tego robić, jeśli już wypchnąłeś swoje zatwierdzenia do innego repozytorium (lub ktoś inny wyciągnął z ciebie) .


31
Prawdopodobnie będziesz musiał podać -m <parent number>opcję, git revertaby określić, która zmiana ma zostać cofnięta. Jeśli chcesz cofnąć scalenie niepublikowanej historii, użyj git reset --hard HEAD^1.
Jakub Narębski

3
Jakub: to prawda, jeśli przywracasz zatwierdzenie przez scalanie, ale w terminologii Subversion „odwrotne scalanie” jest po prostu nazwą przywracania dowolnego rodzaju zatwierdzenia.
Ben James

4
Zwróć uwagę, że użycie -moznacza, że ​​przyszłe scalanie z niescalonej gałęzi nie będzie zawierało zmian sprzed tego scalenia! Zobacz schacon.github.com/git/howto/revert-a-faulty-merge.txt, aby zapoznać się z właściwymi sposobami ponownego scalenia niepołączonej gałęzi.
Martijn Pieters

125

Aby przywrócić scalania popełnić, trzeba użyć: git revert -m <parent number>. Na przykład, aby cofnąć ostatnie zatwierdzenie scalające, używając rodzica z numerem 1, użyj:

git revert -m 1 HEAD

Aby cofnąć zatwierdzenie scalające przed ostatnim zatwierdzeniem, należy:

git revert -m 1 HEAD^

Użyj, git show <merge commit SHA1>aby zobaczyć rodziców, numeracja to kolejność, w jakiej się pojawiają, npMerge: e4c54b3 4725ad2

Dokumentacja git merge: http://schacon.github.com/git/git-merge.html

dyskusja o git merge (myląca, ale bardzo szczegółowa): http://schacon.github.com/git/howto/revert-a-faulty-merge.txt


36
Jak uzyskać „numer” powiązany z rodzicem? Czy gałęzie mają wewnętrzny numeryczny „identyfikator”?
daniyalzade,

7
Użyj, git show <merge commit SHA1>aby zobaczyć rodziców, numeracja to kolejność, w jakiej się pojawiają, np.Merge: e4c54b3 4725ad2
supermetoda

8
Przykład: git revert -m 1 SHA1To polecenie działało dla mnie, aby cofnąć zatwierdzenie scalające, które było kilkoma zatwierdzeniami scalającymi przed nagłówkiem i miało wiele zatwierdzeń pod spodem.
c.apolzon

3
Kim są rodzice? E4c54b3 czy 4725ad2?
Dolphin

1
To wciąż nie dostarcza wystarczających informacji o tym, jak wyniki git show odnoszą się do numerów rodziców. Czy „kolejność pojawiania się” jest oparta na 1? Oparte na 0? W tym przykładzie, jaki jest SHA1 rodzica 1? e4c54b3 czy 4725ad2?
cowlinator

4

Jeśli dobrze Cię rozumiem, mówisz o zrobieniu

svn merge -rn:n-1

wycofać się z wcześniejszego zatwierdzenia, w takim przypadku prawdopodobnie szukasz

git revert

0
git reset --hard HEAD^ 

Użyj powyższego polecenia, aby cofnąć scalone zmiany.


3
To odrzuca zatwierdzenie scalające, które nie robi tego, o co prosi oryginalny plakat. OP próbuje zrobić odwrotną łatkę, aby cofnąć poprzednie zmiany, a nie całkowicie usunąć historię poprzednich zmian.

-1

Jeśli nie chcesz zatwierdzać lub chcesz zatwierdzić później (wiadomość o zatwierdzeniu będzie nadal przygotowana dla ciebie, którą możesz również edytować):

git revert -n <commit>
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.