Tymczasowo przełącz kopię roboczą na określony zatwierdzenie Git


248

Jak przejść do konkretnego zatwierdzenia Git bez utraty wszystkich zatwierdzeń dokonanych po nim ?

Chcę, aby lokalne pliki zostały zmienione, ale baza danych zatwierdzeń pozostanie nienaruszona, tylko wskaźnik bieżącej pozycji jest ustawiony na aktualnie wybrany zatwierdzenie.

Chcę zmienić stan plików na określone zatwierdzenie, uruchomić projekt, a po zakończeniu przywrócić pliki do ostatniego zatwierdzenia.

Jak to zrobić bez spakowania folderu całego projektu?


Odpowiedzi:


344

Jeśli jesteś w pewnym oddziale mybranch, po prostu idź dalej i git checkout commit_hash. Następnie możesz wrócić do swojego oddziału przez git checkout mybranch. Miałem dzisiaj tę samą grę, dzielącą błąd na dwie części :) Ponadto powinieneś wiedzieć o git bisect .


6
Uwaga: możesz to zrobić, git checkout commit_hashjeśli jesteś w czystym repozytorium i nie potrzebujesz rozgałęzienia. Może być łatwiejsze w niektórych przypadkach użycia (takich jak mój).
— enderland

@enderland: twoja GŁOWICA zawsze wskazuje jakąś gałąź, zwykle :)
— Alexander Pavlov

Miałem problem, w którym musiałem użyć całego skrótu zatwierdzenia, ponieważ częściowy nie został zaakceptowany.
— mightyiam

6
Głosowanie za git bisectodniesieniem; co za niezwykle przydatne narzędzie!
— Niek

54

Najpierw użyj, git logaby wyświetlić dziennik, wybierz żądane zatwierdzenie, zanotuj skrót sha1, który służy do identyfikacji zatwierdzenia. Następnie uruchom git checkout hash. Po skończeniu, git checkout original_branch. Ma to tę zaletę, że nie przesuwa HEAD, po prostu przełącza kopię roboczą do określonego zatwierdzenia.


4
Myślę, że masz na myśli git checkout <original_branch>. git checkout HEADjest efektywnie NOOP
— Abe Voelker,

3
git reset --hard <hash>zmienia HEAD bieżącej gałęzi, a wraz z nią git checkout <hash>dostajesz odłączoną kasę, która nie zmienia żadnej gałęzi, i możesz łatwo powrócić bez znajomości oryginalnego identyfikatora skrótu twojej gałęzi, jak pokazano w tej odpowiedzi.
— jofel

@Femaref Pytanie dla początkujących: biorąc pod uwagę kontekst tego pytania (tymczasowo przełącz się na wcześniejsze zatwierdzenie), dlaczego przesuwanie HEAD byłoby zaletą lub wadą?
— orzechowy o natty

@nuttyaboutnatty Zakładając, że moja edycja jest zatwierdzona, powinna odpowiedzieć na twoje pytanie. HEAD zostaje przeniesiony w każdym przypadku; ale w kasie odniesienie do HEAD, do którego wskazuje odwołanie, nie jest przenoszone.
— echristopherson

15

Oprócz innych odpowiedzi tutaj pokazujących, jak git checkout <the-hash-you-want>warto wiedzieć, możesz wrócić do miejsca, w którym korzystałeś:

git checkout @{-1}

Jest to często wygodniejsze niż:

git checkout what-was-that-original-branch-called-again-question-mark

Jak można się spodziewać, git checkout @{-2}zabierze Cię z powrotem do gałęzi, w której byłeś dwie lata git checkouttemu, i podobnie w przypadku innych liczb. Jeśli pamiętasz, gdzie byłeś dla większej liczby, powinieneś zdobyć za to jakiś medal.


Niestety ze względu na produktywność git checkout @{1}nie zabierze Cię do gałęzi, w której będziesz pracował w przyszłości, co jest wstydem.


1
Zauważ, że git checkout -jest to skrótowy skrót dlagit checkout @{-1}
— Natanael

@Nathanael OMGOD , nie ma mowy … to wszystko zmienia! Fajnie, dziękuję! … Zamierzałem uwzględnić to w odpowiedzi, ale myślę, że warto wiedzieć o ogólnej @{n}składni, ponieważ działa ona z wieloma poleceniami git. Trudno było mi dodać twoją stenografię, nie czyniąc odpowiedzi dość mylącą. Zamiast tego głosowałem za twoim komentarzem - mam nadzieję, że ludzie go zobaczą. Dzięki jeszcze raz.
— Benjohn

1
Nie ma problemu. W każdym razie ta dyskusja jest styczna do rzeczywistego pytania. Więcej bonusu! Często używam tej samej składni do łączenia funkcji w wydanie. na przykładgit merge - celu scalenia gałęzi, którą ostatnio wyewidencjonowałeś w aktualnie wyrejestrowanej gałęzi. To jest jak cd -uderzenie.
— Natanael
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.