Jak mogę cofnąć zakres zatwierdzeń w git? Patrząc na dokumentację gitrevisions , nie widzę, jak określić zakres, którego potrzebuję. Na przykład:
A -> B -> C -> D -> E -> HEAD
Chcę zrobić odpowiednik:
git revert B-D
gdzie wynik byłby:
A -> B -> C -> D -> E -> F -> HEAD
gdzie F zawiera odwrotność BD włącznie.
Odpowiedzi:
Jakiej wersji Git używasz?
Przywracanie wielu zatwierdzeń jest obsługiwane tylko w Git1.7.2 +: zobacz „Przywracanie starego zatwierdzenia przy użyciu wielokrotnego przywracania ”, aby uzyskać więcej informacji.
Bieżąca
git revert
strona podręcznika dotyczy tylko aktualnej wersji Gita (1.7.4+).Jako OP Alex Spurling relacjonuje w komentarzach:
Aktualizacja do wersji 1.7.4 działa dobrze.
Odpowiadając na moje własne pytanie, szukałem składni:
B^
oznacza „pierwszy nadrzędny zatwierdzenie B”: to pozwala na włączenieB
do przywrócenia.Zobacz
git rev-parse
sekcję „ OKREŚLANIE WERSJI ”, która zawiera<rev>^
np.HEAD^
Składnię: zobacz więcej w „ Co oznacza^
znak daszka ( )? ”)Zauważ, że każde przywrócone zatwierdzenie jest zatwierdzane osobno.
Henrik N wyjaśnia w komentarzach :
Jak pokazano poniżej, możesz cofnąć przywracanie bez dokonywania od razu:
źródło
git revert OLDER_COMMIT^..NEWER_COMMIT
^
do parametru wersji oznacza pierwszego rodzica tego obiektu zatwierdzenia".Jeśli chcesz przywrócić zakres zatwierdzenia B do D (przynajmniej w wersji 2 git) w pojedynczym zatwierdzeniu, możesz zrobić
Powoduje to cofnięcie zmian dokonanych przez zatwierdzenia z zatwierdzenia rodzica B (wykluczone) do zatwierdzenia D (uwzględnione), ale nie tworzy żadnego zatwierdzenia z cofniętymi zmianami. Przywrócenie modyfikuje tylko drzewo robocze i indeks.
Nie zapomnij o zatwierdzeniu zmian później
Możesz również cofnąć wiele niepowiązanych zatwierdzeń w jednym zatwierdzeniu, używając tej samej metody. na przykład, aby przywrócić B i D, ale nie C
Odniesienie: https://www.kernel.org/pub/software/scm/git/docs/git-revert.html
Dzięki Honza Haering za korektę
źródło
git revert -n B..D
nie powracają popełnienia B, C i D. tylkogit revert -n B^..D
powraca B a.git revert -n master~5..master~2
:, jest tam napisane, że zawiera piąte najnowsze zatwierdzenie. Alemaster~5
tak naprawdę jest szóstym ostatnim zatwierdzeniem. Zobacz wybór wersji w dokumentacji git, aby uzyskać szczegółowe informacje o..
notacji :-)To
git revert OLDER_COMMIT^..NEWER_COMMIT
nie działa dla mnie.Użyłem
git revert -n OLDER_COMMIT^..NEWER_COMMIT
i wszystko jest w porządku. Używam wersji git1.7.9.6
.źródło
-n
lub--no-commit
przywróci wszystkie zmiany w zakresie w pojedynczym zatwierdzeniu, zamiast tworzyć odwrócone zatwierdzenie dla każdego zatwierdzenia w zakresie. Wynik końcowy jest taki sam, jak w programie, te same zmiany zostaną cofnięte. Zależy tylko, jak chcesz, aby wyglądała Twoja historia git.Służy
git rebase -i
do zgniatania odpowiednich zatwierdzeń w jedno. Wtedy masz tylko jedno zobowiązanie do przywrócenia.źródło