Znalazłem dobre wyjaśnienie dotyczące sposobu cofnięcia scalenia z tego linku i skopiowałem wklejone wyjaśnienie poniżej i byłoby pomocne na wypadek, gdyby poniższy link nie działał.
Jak przywrócić wadliwe scalenie
Alan (alan@clueserver.org) powiedział:
Mam gałąź główną. Mamy gałąź, nad którą pracują niektórzy programiści. Twierdzą, że jest gotowy. Scalamy go z gałęzią master. Coś psuje, więc cofamy scalanie. Wprowadzają zmiany w kodzie. doprowadzają go do punktu, w którym mówią, że jest w porządku, a my ponownie się scalamy. Po zbadaniu okazuje się, że zmiany kodu dokonane przed przywróceniem nie znajdują się w gałęzi master, ale zmiany kodu po nim są w gałęzi master. i poprosił o pomoc w wyjściu z tej sytuacji.
Historia natychmiast po „przywróceniu scalenia” wyglądałaby następująco:
---o---o---o---M---x---x---W
/
---A---B
gdzie A i B znajdują się po stronie rozwoju, który nie był tak dobry, M jest scaleniem, które przenosi te przedwczesne zmiany do linii głównej, x są zmianami niezwiązanymi z tym, co zrobiła gałąź boczna i już dokonała na linii głównej, a W jest „ revert of the merge M "(czy W nie wygląda M na odwrót?). IOW, „diff W ^ .. W” jest podobne do „diff -RM ^ .. M”.
Takie „cofnięcie” scalenia można wykonać za pomocą:
$ git revert -m 1 M
Po tym, jak twórcy bocznej gałęzi naprawią swoje błędy, historia może wyglądać następująco:
---o---o---o---M---x---x---W---x
/
---A---B-------------------C---D
gdzie C i D mają naprawić to, co zostało zepsute w A i B, i możesz już mieć inne zmiany w linii głównej po W.
Jeśli scalisz zaktualizowaną gałąź boczną (z D na jej końcu), żadna ze zmian dokonanych w A lub B nie nastąpi, ponieważ zostały cofnięte przez W. Tak właśnie widział Alan.
Linus wyjaśnia sytuację:
Cofnięcie zwykłego zatwierdzenia po prostu skutecznie anuluje to, co zrobił, i jest dość proste. Ale cofnięcie zatwierdzenia scalania powoduje również cofnięcie danych, które zmieniło zatwierdzenie, ale nie ma absolutnie żadnego wpływu na historię , jaką miało scalenie. Zatem scalanie będzie nadal istniało i nadal będzie postrzegane jako łączenie dwóch gałęzi razem, a przyszłe połączenia zobaczą to scalenie jako ostatni wspólny stan - a przywrócenie, które odwróciło wprowadzone scalenie, nie wpłynie na to wcale. Tak więc „cofnięcie” cofa zmiany danych, ale tak naprawdę nie jest„cofnij” w tym sensie, że nie cofnie to wpływu zatwierdzenia na historię repozytorium. Jeśli więc myślisz o „cofnięciu” jako „cofnięciu”, to zawsze będziesz tęsknił za tą częścią powrotów. Tak, usuwa dane, ale nie, nie cofa historii. W takiej sytuacji powinieneś najpierw przywrócić poprzednią wersję, dzięki czemu historia wyglądałaby tak:
---o---o---o---M---x---x---W---x---Y
/
---A---B-------------------C---D
gdzie Y oznacza cofnięcie W. Takie „cofnięcie cofnięcia” można wykonać za pomocą:
$ git revert W
Ta historia (ignorując możliwe konflikty między zmianami W i W..Y) byłaby równoznaczna z brakiem W lub Y w historii:
---o---o---o---M---x---x-------x----
/
---A---B-------------------C---D
a ponowne połączenie gałęzi bocznej nie spowoduje konfliktu wynikającego z wcześniejszego cofnięcia i cofnięcia cofnięcia.
---o---o---o---M---x---x-------x-------*
/ /
---A---B-------------------C---D
Oczywiście zmiany wprowadzone w C i D nadal mogą kolidować z tym, co zostało zrobione przez dowolny z x, ale jest to zwykły konflikt scalania.