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:
Jeśli jesteś w pewnym oddziale
mybranch
, po prostu idź dalej igit checkout commit_hash
. Następnie możesz wrócić do swojego oddziału przezgit checkout mybranch
. Miałem dzisiaj tę samą grę, dzielącą błąd na dwie części :) Ponadto powinieneś wiedzieć o git bisect .źródło
git checkout commit_hash
jeśli jesteś w czystym repozytorium i nie potrzebujesz rozgałęzienia. Może być łatwiejsze w niektórych przypadkach użycia (takich jak mój).git bisect
odniesieniem; co za niezwykle przydatne narzędzie!Najpierw użyj,
git log
aby wyświetlić dziennik, wybierz żądane zatwierdzenie, zanotuj skrót sha1, który służy do identyfikacji zatwierdzenia. Następnie uruchomgit 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.źródło
git checkout <original_branch>
.git checkout HEAD
jest efektywnie NOOPgit 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.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ś:Jest to często wygodniejsze niż:
Jak można się spodziewać,
git checkout @{-2}
zabierze Cię z powrotem do gałęzi, w której byłeś dwie latagit checkout
temu, 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.źródło
git checkout -
jest to skrótowy skrót dlagit checkout @{-1}
@{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.git merge -
celu scalenia gałęzi, którą ostatnio wyewidencjonowałeś w aktualnie wyrejestrowanej gałęzi. To jest jakcd -
uderzenie.