Cofanie zatwierdzenia jest trochę przerażające, jeśli nie wiesz, jak to działa. Ale to naprawdę niezwykle proste, jeśli rozumiesz.
Powiedzmy, że masz to, gdzie C to HEAD, a (F) to stan twoich plików.
(F)
A-B-C
↑
master
Chcesz nuke zatwierdzić C i nigdy więcej go nie widzieć i stracić wszystkie zmiany w lokalnie zmodyfikowanych plikach . Robisz to:
git reset --hard HEAD~1
Wynik to:
(F)
A-B
↑
master
Teraz B jest GŁOWĄ. Ponieważ użyłeś --hard
, twoje pliki są resetowane do stanu w zatwierdzeniu B.
Ach, ale załóżmy, że popełnienie C nie było katastrofą, ale tylko odrobiną. Chcesz cofnąć zatwierdzenie, ale zachowaj zmiany w celu trochę edycji przed wykonaniem lepszego zatwierdzenia. Zaczynając odtąd od nowa, z C jako GŁOWĄ:
(F)
A-B-C
↑
master
Możesz to zrobić, pomijając --hard
:
git reset HEAD~1
W takim przypadku wynikiem jest:
(F)
A-B-C
↑
master
W obu przypadkach HEAD jest tylko wskaźnikiem do ostatniego zatwierdzenia. Kiedy zrobisz a git reset HEAD~1
, każesz Gitowi przesunąć wskaźnik HEAD do tyłu o jeden zatwierdzenie. Ale (chyba że używasz --hard
) pozostawiasz swoje pliki takie, jakie były. Teraz git status
pokazuje zmiany, które zameldowałeś w C. Nic nie straciłeś!
Dla najlżejszego dotyku możesz nawet cofnąć zatwierdzenie, ale zostawić swoje pliki i indeks :
git reset --soft HEAD~1
To nie tylko pozostawia pliki w spokoju, ale nawet sam indeks . Gdy to zrobisz git status
, zobaczysz, że te same pliki znajdują się w indeksie jak poprzednio. W rzeczywistości, zaraz po tym poleceniu, możesz to zrobić git commit
i będziesz powtarzać to samo zatwierdzenie, które właśnie wykonałeś.
Jeszcze jedno: Załóżmy, że niszczysz zatwierdzenie jak w pierwszym przykładzie, ale potem odkryłeś, że w końcu go potrzebujesz ? Pech, prawda?
Nie, wciąż istnieje sposób na odzyskanie go. Wpisz, git reflog
a zobaczysz listę (częściowych) zatwierdzeń shas (czyli skrótów ), w których się przeprowadzałeś. Znajdź zniszczone zatwierdzenie i zrób to:
git checkout -b someNewBranchName shaYouDestroyed
Wskrzesiłeś to zatwierdzenie. Zobowiązania w rzeczywistości nie są niszczone w Git przez około 90 dni, więc zazwyczaj możesz wrócić i uratować jeden, którego nie chciałeś się pozbyć.