Biorąc pod uwagę zmianę, która została zatwierdzona przy użyciu commit
, a następnie cofnięta przy użyciu revert
, jaki jest najlepszy sposób na cofnięcie tego cofnięcia?
Najlepiej byłoby to zrobić z nowym zatwierdzeniem, aby nie ponownie zapisywać historii.
Odpowiedzi:
Jeśli jeszcze nie wprowadziłeś tej zmiany,
git reset --hard HEAD^
W przeciwnym razie cofnięcie przywracania jest całkowicie w porządku.
Innym sposobem jest
git checkout HEAD^^ -- .
i wtedygit add -A && git commit
.źródło
git cherry-pick
lub alternatywniegit revert
są to najprostsze sposoby cofnięcia cofnięcia.Otherwise, reverting the revert is perfectly fine.
a następnie wyjaśnienie, cogit checkout HEAD^^ -- .
się dzieje.git add -A
... chyba że chcesz dodać każdy plik do kontroli wersji, co najprawdopodobniej nie jest tym, czego chcesz.git cherry-pick <original commit sha>
Wykona kopię oryginalnego zatwierdzenia, zasadniczo ponownie stosując zatwierdzenie
Cofnięcie cofnięcia spowoduje to samo, z komunikatem zatwierdzania przez program Messier:
git revert <commit sha of the revert>
Każdy z tych sposobów pozwoli ci
git push
bez zastępowania historii, ponieważ tworzy ona nowe zatwierdzenie po przywróceniu.Podczas wpisywania zatwierdzenia sha zwykle potrzebujesz tylko pierwszych 5 lub 6 znaków:
git cherry-pick 6bfabc
źródło
Cofnięcie zatwierdzenia jest jak każde inne zatwierdzenie w git. Czyli możesz to cofnąć, jak w:
Ma to oczywiście sens dopiero po wprowadzeniu zmian, a zwłaszcza wtedy, gdy nie można wymusić wypchnięcia gałęzi docelowej (co jest dobrym pomysłem na gałęzi głównej ). Jeśli zmiana nie została wprowadzona, po prostu wybierz polecenie „wiśnia”, cofnij lub po prostu usuń zatwierdzenie przywrócenia, jak w przypadku innych postów.
W naszym zespole mamy zasadę korzystania z cofania w zatwierdzeniach Revert, które zostały popełnione w głównej gałęzi, przede wszystkim w celu utrzymania historii w czystości, abyś mógł zobaczyć, które zatwierdzenie przywraca co:
W ten sposób możesz prześledzić historię i odkryć całą historię, a nawet ci bez wiedzy o spuściźnie mogliby sami to wypracować. Natomiast jeśli wybierzesz wiśni lub rebase rzeczy, to cenna informacja jest tracona (chyba, że włączenie go w komentarzu).
Oczywiście, jeśli zatwierdzenie cofnęło się i cofnęło więcej niż raz, staje się to dość nieuporządkowane.
źródło
Cofnięcie cofnięcia załatwi sprawę
Na przykład,
Jeśli
abcdef
jest to twoje zatwierdzenie ighijkl
jest to potwierdzenie, które masz po cofnięciu zatwierdzeniaabcdef
, uruchom:Spowoduje to cofnięcie cofnięcia
źródło
Dla mnie to wygląda głupio. Byłem jednak w tej samej sytuacji i cofnąłem się, aby wycofać zatwierdzenia. Zrobiłem liczbę zmian, więc musiałem cofać dla każdego „cofnięcia zatwierdzenia”.
Teraz moja historia zobowiązań wygląda trochę dziwnie.
To jest projekt dla zwierząt, więc jest OK. Ale w przypadku projektu z prawdziwego życia wolałbym przejść do ostatniego zatwierdzenia przed przywróceniem przywrócić cały przywrócony kod razem w jednym zatwierdzeniu i bardziej rozsądnym komentarzu.
źródło
Oto jak to zrobiłem:
jeśli gałąź
my_branchname
została uwzględniona w scaleniu, które zostało cofnięte. I chciałem cofnąćmy_branchname
:Najpierw robię
git checkout -b my_new_branchname
odmy_branchname
.Następnie robię,
git reset --soft $COMMIT_HASH
gdzie$COMMIT_HASH
jest hash zatwierdzenia zatwierdzenia tuż przed pierwszym zatwierdzeniemmy_branchname
(patrzgit log
).Następnie dokonuję nowego zatwierdzenia, a
git commit -m "Add back reverted changes"
następnie wypycham nowy oddział, a
git push origin new_branchname
następnie wysłałem żądanie ściągnięcia dla nowego oddziału.
źródło
Lub możesz
git checkout -b <new-branch>
igit cherry-pick <commit>
wcześniej do igit rebase
upuścićrevert
zatwierdzenia. wyślij żądanie ściągnięcia jak poprzednio.źródło
Jeśli nie podoba ci się pomysł „cofnięcia przywrócenia” (szczególnie gdy oznacza to utratę informacji historycznych dla wielu zatwierdzeń), zawsze możesz udać się do dokumentacji git na temat „Przywracania błędnego scalenia” .
Biorąc pod uwagę następującą sytuację wyjściową
(W to początkowe cofnięcie scalenia M; D i E są poprawkami do początkowo uszkodzonej gałęzi / zatwierdzenia funkcji)
Teraz możesz po prostu odtwarzać zmiany od A do E, aby żadne z nich nie „należało” do odwróconego scalenia:
Nowa kopia oddziału może teraz zostać
master
ponownie połączona z :źródło
Aby odzyskać zmiany etapowe i etapowe, które zostały cofnięte po zatwierdzeniu:
Aby odzyskać wszystkie nieetapowe usunięcia:
źródło