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)?

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 .


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?


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

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

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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.