Jak wrócić do ostatniego zatwierdzenia po sprawdzeniu poprzedniego zatwierdzenia?

476

Czasami sprawdzam niektóre poprzednie wersje kodu do sprawdzenia lub przetestowania. Widziałem instrukcje, co zrobić, jeśli chcę zmodyfikować poprzednie zatwierdzenia - ale przypuszczam, że nie wprowadzam żadnych zmian. Po zakończeniu np. git checkout HEAD^Jak wrócić do końca gałęzi? ..git log nie pokazuje mi już SHA ostatniego zatwierdzenia.

Lew Aleksiejjew
źródło
11
Jeśli chodzi o git logzdanie twojego pytania, zawsze możesz biegać git log --all(lub bardziej pożytecznie git log --oneline --graph --all).
Wildcard,

Odpowiedzi:

605

Jeśli wiesz, że zatwierdzenie, do którego chcesz powrócić, jest głową jakiegoś oddziału lub jest otagowane, możesz po prostu

git checkout branchname

Możesz także użyć, git reflogaby zobaczyć, na co inne zobowiązania wskazane przez HEAD (lub inne referencje) wskazywały w przeszłości.


Edytowano, aby dodać:

W nowszych wersjach Git, jeśli tylko pobiegłeś git checkoutlub coś innego, aby przenieść HEADraz, możesz to zrobić

git checkout -

aby wrócić do miejsca, w którym znajdowało się przed ostatnią kasą. Było to motywowane przez analogię do idiomu powłoki, cd -aby wrócić do dowolnego katalogu roboczego, w którym wcześniej był.

Phil Miller
źródło
27
Chciałbym wspomnieć, że typowym przykładem jest „git checkout master”. Jedną z trudności, z jaką nauczyłem się korzystać z git, było to, że nie wiedziałem, jakie konkretne słowa kluczowe (np. „Master”) mogę faktycznie zastąpić słowami zastępczymi, takimi jak „nazwa gałęzi”.
AbePralle
3
mastertak naprawdę nie jest słowem kluczowym HEAD. Jest to tylko domyślna nazwa oddziału w nowym repozytorium. Możesz uruchomić, git branchaby uzyskać listę oddziałów w repozytorium i git tag -llistę tagów. Podobnie originjest domyślną nazwą pilota, z którego klonowane jest repozytorium, ale nie ma w tym nic specjalnego.
Phil Miller
3
Jeśli nie było to jasne, git reflogpodaje listę skrótów, w którym momencie możesz użyć git checkout [commit-hash].
jbnunn
Usunąłem plik i wypróbowałem polecenie, ale nie resetuje go ono całkowicie. Przede wszystkim nie jest rekurencyjny. Następnie, gdy próbuję tego na pliku, który usunąłem, git następnie mówi mi, że HEAD jest odłączony. Co robić?
Daniel S.
1
@DanielS .: Pytanie i moja odpowiedź dotyczyły zatwierdzeń , podczas gdy mówisz o plikach. Git traktuje je raczej inaczej.
Phil Miller
27

Git Checkout Master

master jest wskazówką lub ostatnim zatwierdzeniem. gitk pokaże ci tylko to, gdzie jesteś na drzewie w tym czasie. git reflog pokaże wszystkie zatwierdzenia, ale w tym przypadku chcesz tylko wskazówkę, więc git checkout master.

Bruce Wells
źródło
1
To. Lubgit checkout branchname
Alex
19

Natrafiłem na to pytanie już teraz i mam coś do dodania

Aby przejść do ostatniego zatwierdzenia:

git checkout $(git log --branches -1 --pretty=format:"%H")

Wyjaśnienie:

git log --branchespokazuje dziennik zatwierdzeń ze wszystkich lokalnych oddziałów
-1limit do jednego zatwierdzenia → najnowszy
--pretty=format:"%H"format zatwierdzenia , aby pokazać tylko hash zatwierdzenia,
git checkout $(...)użyj danych wyjściowych podpowłoki jako argumentu do kasy

Uwaga:

Spowoduje to jednak odłączenie głowy (ponieważ kasujemy bezpośrednio do zatwierdzenia). Można tego uniknąć, wyodrębniając nazwę gałęzi za pomocą sed, wyjaśnionego poniżej.


Aby przejść do gałęzi ostatniego zatwierdzenia:

git checkout $(git log --branches -1 --pretty=format:'%D' | sed 's/.*, //g')

Wyjaśnienie:

git log --branchespokazuje dziennik zatwierdzeń ze wszystkich lokalnych oddziałów
-1ograniczenie do jednego zatwierdzenia → najnowszy
--pretty=format:"%D"format zatwierdzenia , aby pokazać tylko nazwy referencji
| sed 's/.*, //g'ignoruj ​​wszystkie oprócz ostatniego z wielu referencji (*)
git checkout $(...)użyj danych wyjściowych podpowłoki jako argumentu do kasy

*) HEAD i gałęzie zdalne są wymienione jako pierwsze, gałęzie lokalne są wymienione jako ostatnie w kolejności malejącej alfabetycznie, więc pozostała będzie alfabetycznie nazwa pierwszego oddziału

Uwaga:

To zawsze użyje (alfabetycznie) pierwszej gałęzi tylko wtedy, gdy istnieje wiele dla tego zatwierdzenia.


W każdym razie, myślę, że najlepszym rozwiązaniem byłoby wyświetlenie nazw referencji dla ostatniego zatwierdzenia, aby wiedzieć, gdzie sprawdzić:

git log --branches -1 --pretty=format:'%D'

Np. Utwórz alias git topdla tego polecenia.

816–8055
źródło
1
Jakoś wygłupiłem drugie polecenie ... Naprawiłem je, teraz poprawnie sprawdzi cię w gałęzi ostatniego zatwierdzenia.
816-8055,
Alias ​​Bash / zsh dla polecenia powrotu do głowyalias git-head='git checkout $(git log --branches -1 --pretty=format:"%D" | sed "s/.*, //g")'
Cześć Angel
9

Spójrz na graficzny GUI ... gitkpokazuje wszystkie zatwierdzenia. Czasami łatwiej jest pracować graficznie ... ^^

tanascius
źródło
tak, tak właśnie robiłem w przeszłości - ale w tej chwili nie mam GUI
Leo Alekseyev
7

W tym celu możesz użyć jednego z następujących poleceń git:

git checkout master
git checkout branchname
hothead1000
źródło
4

pokaż wszystkie gałęzie i zatwierdź
git log - gałęzie --oneline

pokaż ostatnie zatwierdzenie
git log - gałęzie -1 --online

pokaż przed ostatnim zatwierdzeniem
git log - rozgałęzienia -2 --online

abdesselam
źródło
Czy pierwsze polecenie faktycznie zatwierdzi kod, który jest obecnie przetwarzany, czy też źle go interpretuję?
Lazerbeak12345
3
git reflog //find the hash of the commit that you want to checkout
git checkout <commit number>>
Atif Majeed
źródło
0

Jeśli masz gałąź inną niż master, jednym z łatwych sposobów jest sprawdzenie tej gałęzi, a następnie sprawdzenie master. Voila, wróciłeś na szczyt mistrza. Prawdopodobnie istnieją mądrzejsze sposoby ...

ConorR
źródło
0

Możesz po prostu zrobić git pull origin branchname. Spowoduje to ponowne pobranie ostatniego zatwierdzenia.

Ankit Singh
źródło
Nie polecam tego, jeśli nie chcesz pobierać z góry. Konflikty scalania należy obsługiwać tylko wtedy, gdy są one gotowe.
Lazerbeak12345
Cóż, w takim przypadku głowa pozostanie odłączona, nawet jeśli przejdziesz do ostatniego zatwierdzenia.
Ankit Singh
-2

Jeśli twoje ostatnie zatwierdzenie znajduje się w gałęzi master, możesz po prostu użyć

git checkout master
Jackie Xu
źródło