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?

Paweł
źródło

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 .

Alexander Pavlov
źródło
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.

Femaref
źródło
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.

Benjohn
źródło
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