Wie komme ich zum letzten Commit zurück, nachdem ich ein vorheriges Commit ausgecheckt habe?

476

Manchmal überprüfe ich eine frühere Version des Codes, um sie zu untersuchen oder zu testen. Ich habe Anweisungen gesehen, was zu tun ist, wenn ich frühere Commits ändern möchte - aber ich nehme an, ich nehme keine Änderungen vor. Nachdem ich zB fertig bin git checkout HEAD^, wie komme ich zurück zur Spitze des Zweigs? .. git logzeigt mir nicht mehr die SHA des letzten Commits.

Leo Alekseyev
quelle
11
In Bezug auf den git logSatz Ihrer Frage können Sie immer git log --all(oder nützlicher git log --oneline --graph --all) laufen .
Wildcard

Antworten:

605

Wenn Sie wissen, dass das Commit, zu dem Sie zurückkehren möchten, der Leiter eines Zweigs ist oder mit einem Tag versehen ist, können Sie dies einfach tun

git checkout branchname

Sie können auch verwenden, um git reflogzu sehen, auf welche anderen Commits Ihr HEAD (oder ein anderer Ref) in der Vergangenheit hingewiesen hat.


Bearbeitet, um hinzuzufügen:

In neueren Versionen von Git können Sie dies auch tun , wenn Sie nur ausgeführt haben git checkoutoder etwas anderes, um Ihre HEADeinmal zu verschieben

git checkout -

um dorthin zurückzukehren, wo es vor der letzten Kasse war. Dies wurde durch die Analogie zur Shell-Sprache motiviert, zu dem cd -Arbeitsverzeichnis zurückzukehren, in dem man sich zuvor befand.

Phil Miller
quelle
27
Ich möchte erwähnen, dass das typische Beispiel "Git Checkout Master" wäre. Eine der Schwierigkeiten, die ich beim Erlernen der Verwendung von git hatte, bestand darin, nicht zu wissen, welche spezifischen Schlüsselwörter (z. B. "master") Platzhalterwörter wie "branchname" tatsächlich ersetzen können.
AbePralle
3
masterist eigentlich kein Schlüsselwort, so wie es HEADist. Dies ist nur der Standardzweigname in einem neuen Repository. Sie können git brancheine Liste der Zweige in Ihrem Repository und git tag -leine Liste der Tags abrufen. Ebenso originist der Standardname der Fernbedienung, von der ein Repository geklont wird, aber es gibt nichts Besonderes.
Phil Miller
3
Wenn es nicht klar war, erhalten git reflogSie eine Liste mit Hashes, die Sie verwenden können git checkout [commit-hash].
Jbnunn
Ich habe eine Datei gelöscht und den Befehl ausprobiert, aber er wird nicht vollständig zurückgesetzt. Erstens ist es nicht rekursiv. Wenn ich dies dann für die gelöschte Datei versuche, teilt mir git anschließend mit, dass HEAD getrennt ist. Was ist zu tun?
Daniel S.
1
@ DanielS.: Die Frage und meine Antwort betrafen Commits , während Sie über Dateien sprechen. Git behandelt sie ziemlich unterschiedlich.
Phil Miller
27

Git Checkout Master

Master ist der Tipp oder das letzte Commit. gitk zeigt Ihnen nur an, wo Sie sich gerade im Baum befinden. git reflog zeigt alle Commits an, aber in diesem Fall möchten Sie nur den Tipp, also git checkout master.

Bruce Wells
quelle
1
Diese. Odergit checkout branchname
Alex
19

Kam gerade über diese Frage und habe etwas hinzuzufügen

So gehen Sie zum letzten Commit:

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

Erläuterung:

git log --branchesZeigt das Protokoll der Festschreibungen aller lokalen Zweige an und
-1beschränkt sich auf ein Festschreiben. → Das neueste Festschreibungsformat ,
--pretty=format:"%H"um nur die
git checkout $(...)Festschreibungs- Hash- Ausgabe der Unterschale als Argument für das Auschecken anzuzeigen

Hinweis:

Dies führt jedoch zu einem abgetrennten Kopf (da wir direkt zum Commit auschecken). Dies kann vermieden werden, indem der Zweigname mit sed(siehe unten) extrahiert wird.


So wechseln Sie zum Zweig des letzten Commits:

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

Erläuterung:

git log --branchesZeigt das Protokoll der Festschreibungen aller lokalen Zweige
-1an. Begrenzt auf ein Festschreiben → Das neueste Festschreibungsformat
--pretty=format:"%D", um nur die Referenznamen anzuzeigen.
| sed 's/.*, //g'Ignorieren Sie alle bis auf die letzte von mehreren Verweisen. (*)
git checkout $(...)Verwenden Sie die Ausgabe der Unterschale als Argument für das Auschecken

*) HEAD- und Remote-Zweige werden zuerst aufgelistet, lokale Zweige werden zuletzt in alphabetisch absteigender Reihenfolge aufgelistet, sodass der verbleibende Name der alphabetisch erste Zweig ist

Hinweis:

Dies verwendet immer nur den (alphabetisch) ersten Zweignamen, wenn für dieses Commit mehrere vorhanden sind.


Wie auch immer, ich denke, die beste Lösung wäre nur, die Ref-Namen für das letzte Commit anzuzeigen, um zu wissen, wohin Sie auschecken müssen:

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

Erstellen Sie beispielsweise den Alias git topfür diesen Befehl.

816-8055
quelle
1
Irgendwie habe ich den zweiten Befehl vermasselt ... Es wurde behoben. Jetzt werden Sie korrekt aus dem Zweig des letzten Commits ausgecheckt.
816-8055
Bash / zsh Alias ​​für den Befehl, zum Kopf zurückzukehrenalias git-head='git checkout $(git log --branches -1 --pretty=format:"%D" | sed "s/.*, //g")'
Hi-Angel
9

Schauen Sie sich die grafische Benutzeroberfläche an ... gitksie zeigt alle Commits. Manchmal ist es einfacher, grafisch zu arbeiten ... ^^

Tanascius
quelle
Ja, so habe ich es in der Vergangenheit gemacht - aber ich habe momentan keine GUI zur Verfügung
Leo Alekseyev
7

Sie können hierfür einen der folgenden git-Befehle verwenden:

git checkout master
git checkout branchname
Hitzkopf1000
quelle
4

zeige alle Zweige und
setze git log --branches --oneline fest

show last commit
git log --branches -1 --oneline

Vor dem letzten Commit
anzeigen git log --branches -2 --oneline

Abdesselam
quelle
Wird der erste Befehl tatsächlich festschreiben, welcher Code gerade bereitgestellt wird, oder verstehe ich das falsch?
Lazerbeak12345
3
git reflog //find the hash of the commit that you want to checkout
git checkout <commit number>>
Atif Majeed
quelle
0

Wenn Sie einen anderen Zweig als den Master haben, können Sie diesen Zweig auf einfache Weise auschecken und dann den Master auschecken. Voila, du bist wieder an der Spitze des Meisters. Es gibt wahrscheinlich intelligentere Wege ...

ConorR
quelle
0

Sie können einfach tun git pull origin branchname. Das letzte Commit wird erneut abgerufen.

Ankit Singh
quelle
Ich empfehle dies nicht, wenn Sie nicht von Upstream ziehen möchten. Zusammenführungskonflikte sollten nur behandelt werden, wenn sie dazu bereit sind.
Lazerbeak12345
In diesem Fall bleibt der Kopf auch dann getrennt, wenn Sie zum letzten Commit auschecken.
Ankit Singh
-2

Wenn sich Ihr letztes Commit im Hauptzweig befindet, können Sie es einfach verwenden

git checkout master
Jackie Xu
quelle