Wechseln Sie vorübergehend die Arbeitskopie zu einem bestimmten Git-Commit

248

Wie kann ich zu einem bestimmten Git-Commit wechseln, ohne alle danach vorgenommenen Commits zu verlieren ?

Ich möchte, dass lokale Dateien geändert werden, aber die Datenbank der Commits bleibt intakt. Nur der aktuelle Positionszeiger wird auf das aktuell ausgewählte Commit gesetzt.

Ich möchte den Dateistatus in ein bestimmtes Commit ändern, das Projekt ausführen und nach Abschluss die Dateien wieder auf das letzte Commit zurücksetzen.

Wie geht das, ohne den gesamten Projektordner zu komprimieren?

Paul
quelle

Antworten:

344

Wenn Sie in einer bestimmten Filiale sind mybranch, fahren Sie einfach fort und git checkout commit_hash. Dann können Sie mit zu Ihrer Filiale zurückkehren git checkout mybranch. Ich hatte das gleiche Spiel, das heute einen Fehler halbiert :) Außerdem solltest du etwas über Git-Halbierung wissen .

Alexander Pawlow
quelle
6
Beachten Sie, dass Sie dies nur tun können, git checkout commit_hashwenn Sie sich in einem sauberen Repository befinden und keine Verzweigung durchführen müssen. Könnte für einige Anwendungsfälle (wie meine) einfacher sein.
Enderland
@enderland: Ihr KOPF zeigt normalerweise immer auf einen Zweig :)
Alexander Pavlov
Ich hatte ein Problem, bei dem ich den gesamten Commit-Hash verwenden musste, weil ein Teil nicht akzeptiert wurde.
Mayyiam
6
Upvote für die git bisectReferenz; Was für ein äußerst nützliches Werkzeug!
Niek
54

Verwenden Sie zunächst git log, um das Protokoll anzuzeigen, das gewünschte Commit auszuwählen und den sha1-Hash zu notieren, mit dem das Commit identifiziert wird. Als nächstes laufen git checkout hash. Nachdem Sie fertig sind , git checkout original_branch. Dies hat den Vorteil, dass der HEAD nicht verschoben wird, sondern lediglich die Arbeitskopie auf ein bestimmtes Commit umgeschaltet wird.

Femaref
quelle
4
Ich denke du meinst git checkout <original_branch>. git checkout HEADist effektiv ein NOOP
Abe Voelker
3
git reset --hard <hash>Ändert den HEAD des aktuellen Zweigs, während git checkout <hash>Sie eine getrennte Kasse erhalten, die keinen Zweig ändert, und Sie können problemlos zurückkehren, ohne die ursprüngliche Hash-ID Ihres Zweigs zu kennen, wie in dieser Antwort gezeigt.
Jofel
@Femaref Anfängerfrage: Warum wäre es angesichts des Kontextes dieser Frage (vorübergehend zu einem früheren Commit wechseln) ein Vorteil oder ein Nachteil, den HEAD zu bewegen oder nicht zu bewegen?
verrückt nach natty
@nuttyaboutnatty Angenommen, meine Bearbeitung ist genehmigt, sollte sie Ihre Frage beantworten. HEAD wird auf jeden Fall tatsächlich bewegt; Beim Auschecken wird die Verzweigungsreferenz, auf die HEAD zeigt, jedoch nicht selbst verschoben.
Echristopherson
15

Zusätzlich zu den anderen Antworten hier, die Ihnen zeigen, wie git checkout <the-hash-you-want>es sich lohnt zu wissen, können Sie wieder zu Ihrem Verwendungszweck wechseln:

git checkout @{-1}

Dies ist oft bequemer als:

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

Wie Sie vielleicht erwarten, git checkout @{-2}kehren Sie zu der Filiale zurück, in der Sie vor zwei git checkoutSekunden waren, und dies gilt auch für andere Nummern. Wenn Sie sich erinnern können, wo Sie für größere Zahlen waren, sollten Sie eine Art Medaille dafür bekommen.


Leider git checkout @{1}führt Sie die Produktivität nicht zu der Branche, in der Sie in Zukunft tätig sein werden, was eine Schande ist.

Benjohn
quelle
1
Beachten Sie, dass dies git checkout -ein Kurzalias fürgit checkout @{-1}
Nathanael
@Nathanael OMGOD , auf keinen Fall ... das ändert alles! Nett, danke! … Ich wollte dies in die Antwort aufnehmen, aber ich denke, es ist auch nützlich, die allgemeine @{n}Syntax zu kennen , da sie mit vielen Git-Befehlen funktioniert. Es fiel mir schwer, Ihre Kurzschrift hinzuzufügen, ohne die Antwort ziemlich verwirrend zu machen. Stattdessen habe ich Ihren Kommentar abgestimmt - ich hoffe, die Leute werden ihn sehen. Danke noch einmal.
Benjohn
1
Kein Problem. Diese Diskussion ist ohnehin tangential zur eigentlichen Frage. Eher ein Bonus! Ich verwende oft dieselbe Syntax, um Features in einer Version zusammenzuführen. zB git merge -um den zuletzt ausgecheckten Zweig mit dem aktuell ausgecheckten Zweig zusammenzuführen. Es ist wie cd -in Bash.
Nathanael