Jak mogę przełączyć moje repozytorium git na określone zatwierdzenie

210

W moim repozytorium git wykonałem 5 zatwierdzeń, jak poniżej w moim dzienniku git:

commit 4f8b120cdafecc5144d7cdae472c36ec80315fdc
Author: Michael 
Date:   Fri Feb 4 15:26:38 2011 -0800

commit b688d46f55db1bc304f7f689a065331fc1715079
Author: Michael
Date:   Mon Jan 31 10:37:42 2011 -0800

commit b364f9dcec3b0d52666c4f03eb5f6efb7e1e7bda
Author: Michael
Date:   Wed Jan 26 13:33:17 2011 -0800

commit 4771e26619b9acba3f059b491c6c6d70115e696c
Author: Michael 
Date:   Wed Jan 26 11:16:51 2011 -0800

commit 6e559cb951b9bfa14243b925c1972a1bd2586d59
Author: Michael 
Date:   Fri Jan 21 11:42:27 2011 -0800

Jak mogę cofnąć moje poprzednie 4 zatwierdzenia lokalnie w oddziale? Innymi słowy, jak mogę stworzyć gałąź bez moich ostatnich 4 zatwierdzeń (załóżmy, że mam SHA tego zatwierdzenia z dziennika git)?

Michał
źródło

Odpowiedzi:

256

Aby utworzyć nowy oddział (lokalnie):

  • Z hashem commita (lub jego częścią)

    git checkout -b new_branch 6e559cb
    
  • lub cofnąć 4 zatwierdzenia z HEAD

    git checkout -b new_branch HEAD~4
    

Po utworzeniu nowej gałęzi (lokalnie) możesz zechcieć zreplikować tę zmianę na pilocie o tej samej nazwie: Jak mogę przesłać zmiany do oddziału zdalnego


Aby odrzucić ostatnie trzy zmiany , zobacz odpowiedź Lunaryorna poniżej .


Aby przenieść aktualną gałąź HEAD do określonego zatwierdzenia bez tworzenia nowej gałęzi , zobacz odpowiedź Arpiagara poniżej .

Artefacto
źródło
177

Wszystkie powyższe polecenia tworzą nową gałąź, z najnowszym zatwierdzeniem określonym w poleceniu, ale na wypadek, gdybyś chciał, aby Twoja bieżąca gałąź została HEADprzeniesiona do określonego zatwierdzenia, poniżej znajduje się polecenie:

 git checkout <commit_hash>

To odłącza i skieruj HEADprzepisowym popełnić i ratuje od utworzenia nowego oddziału, gdy użytkownik chce tylko zobaczyć stan oddziału do tego konkretnego popełnić.


Możesz wtedy wrócić do ostatniego zatwierdzenia i naprawić odłączony HEAD:

Naprawić odłączoną głowicę Git?

arpiagar
źródło
1
To odłączyłoby głowę. Niewygodny.
Igor Ganapolsky
nawet jeśli <commit_hash>jest w innej gałęzi, która jest przed nami?
Ciasto piekarz
2
Powiązane pytanie po prostu mówi git checkout master, obok jednego lub dwóch skrajnych przypadków, które mogą mieć zastosowanie w określonych sytuacjach.
i336_
70

Jeśli chcesz odrzucić ostatnie cztery zatwierdzenia, użyj:

git reset --hard HEAD^^^^

Alternatywnie możesz określić skrót zatwierdzenia, do którego chcesz zresetować:

git reset --hard 6e559cb
lunaryorn
źródło
4
To pomija etap rozgałęziania. Jeśli wykona dokładnie to, co jest tutaj pokazane, na stałe straci te najlepsze zatwierdzenia.
Jimmy Cuadra
3
Cóż, niekoniecznie na stałe - można by uzyskać SHA z poprzedniej głowicy git reflogi zresetować ją z powrotem - ale byłoby to wyrzuceniem ich, tak.
Amber
1
Jeśli zatwierdzenia zostaną najpierw wciśnięte, a następnie zresetowane, można je ponownie przywrócić za pomocą jednego pociągnięcia.
Rick Smith
17

Po prostu zaznacz commit, od którego chcesz zacząć nową gałąź i utwórz nową gałąź

git checkout -b newbranch 6e559cb95
KingCrunch
źródło
2

Jak mogę cofnąć moje poprzednie 4 zatwierdzenia lokalnie w oddziale?

Co oznacza, że ​​nie tworzysz nowej gałęzi i nie przechodzisz w stan odłączony. Nowy sposób to:

git switch --detach revison

radzimir
źródło