Wiele zależy od tego, co rozumiesz przez „cofnięcie”.
Tymczasowo przełącz na inne zatwierdzenie
Jeśli chcesz tymczasowo wrócić do niego, wygłupiać się, a następnie wrócić do tego, gdzie jesteś, wszystko, co musisz zrobić, to sprawdzić pożądane zatwierdzenie:
# This will detach your HEAD, that is, leave you with no branch checked out:
git checkout 0d1d7fc32
Lub jeśli chcesz dokonywać zatwierdzeń, gdy tam jesteś, idź i stwórz nowy oddział, gdy jesteś przy nim:
git checkout -b old-state 0d1d7fc32
Aby wrócić do miejsca, w którym byłeś, po prostu sprawdź gałąź, w której byłeś. (Jeśli dokonałeś zmian, jak zwykle podczas zmiany gałęzi, będziesz musiał sobie z nimi poradzić, jeśli to konieczne. Możesz zresetować, aby je wyrzucić; możesz ukryć, wykupić, ukryć pop, aby zabrać je ze sobą; możesz zatwierdzić je do oddziału tam, jeśli chcesz tam oddziału.)
Twarde usuwanie niepublikowanych zatwierdzeń
Z drugiej strony, jeśli naprawdę chcesz pozbyć się wszystkiego, co zrobiłeś od tego czasu, są dwie możliwości. Po pierwsze, jeśli nie opublikowałeś żadnego z tych zatwierdzeń, po prostu zresetuj:
# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32
# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
Jeśli się zepsujesz, już wyrzuciłeś swoje lokalne zmiany, ale możesz przynajmniej wrócić do poprzedniego stanu, resetując ponownie.
Cofnij opublikowane zatwierdzenia z nowymi zatwierdzeniami
Z drugiej strony, jeśli opublikowałeś pracę, prawdopodobnie nie chcesz zresetować gałęzi, ponieważ to skutecznie przepisuje historię. W takim przypadku rzeczywiście można cofnąć zatwierdzenia. W Git revert ma bardzo konkretne znaczenie: utwórz zatwierdzenie z odwrotną łatką, aby go anulować. W ten sposób nie przepisujesz żadnej historii.
# This will create three separate revert commits:
git revert a867b4af 25eee4ca 0766c053
# It also takes ranges. This will revert the last two commits:
git revert HEAD~2..HEAD
#Similarly, you can revert a range of commits using commit hashes:
git revert a867b4af..0766c053
# Reverting a merge commit
git revert -m 1 <merge_commit_sha>
# To get just one, you could use `rebase -i` to squash them afterwards
# Or, you could do it manually (be sure to do this at top level of the repo)
# get your index and work tree into the desired state, without changing HEAD:
git checkout 0d1d7fc32 .
# Then commit. Be sure and write a good message describing what you just did
git commit
Strona git-revert
podręcznika zawiera wiele z tego w swoim opisie. Innym przydatnym linkiem jest ta sekcja git-scm.com omawiająca git-revert .
Jeśli zdecydujesz, że mimo wszystko nie chcesz przywracać, możesz przywrócić przywrócenie (jak opisano tutaj) lub przywrócić do stanu sprzed przywrócenia (patrz poprzednia sekcja).
Pomocna może być również ta odpowiedź:
Jak przenieść HEAD z powrotem do poprzedniej lokalizacji? (Odłączona głowa)