Wie komme ich zur neuesten Version in Git zurück?

303

Ich bin kürzlich von SVN zu Git gewechselt und bin über etwas verwirrt. Ich musste die vorherige Version eines Skripts über einen Debugger ausführen, also tat git checkout <previous version hash>und tat ich, was ich tun musste.

Jetzt möchte ich zur neuesten Version zurückkehren, aber ich kenne den Hash dafür nicht. Wenn ich tippe git log, sehe ich es nicht.

Wie kann ich das machen? Gibt es auch eine einfachere Möglichkeit, Versionen zu ändern, als Hashes einzugeben - etwa "Zwei Versionen zurückgehen" oder "Zur chronologisch neuesten Version wechseln"?

Nathan Long
quelle

Antworten:

371

git checkout mastersollte den Trick machen. Um zwei Versionen zurückzugehen, könnte man so etwas sagen git checkout HEAD~2, aber es ist besser, einen temporären Zweig basierend auf dieser Zeit zu erstellengit checkout -b temp_branch HEAD~2

Ana Betts
quelle
7
Cool! git checkout masterGenau so wechsle ich von einem Zweig zurück. Bedeutet das also, dass ich beim Auschecken einer früheren Version im Wesentlichen einen Zweig erstelle?
Nathan Long
4
@ Nathan: In Git ist ein Zweig eigentlich meistens ein beweglicher Zeiger auf eine bestimmte Revision. Konzeptionell erstellen Sie also eine Art Zweig, aber nicht in dem Sinne, dass Git an Zweige denkt.
DLH
2
Im einfachsten Fall, wenn ich eine Reihe linearer Änderungen habe, bewege ich beim Auschecken einer früheren Revision den HEAD-Zeiger dorthin, was bedeutet git log, dass er relativ zu diesem Punkt angezeigt wird. Und wenn ich den Master auschecke, bewege ich den Zeiger auf die neueste Version des Master-Zweigs?
Nathan Long
7
@ Nathan: Genau. HEAD wird als symbolische Referenz bezeichnet - es ist im Allgemeinen ein Zeiger auf eine andere Referenz (den aktuell ausgecheckten Zweig). git checkoutist eine Möglichkeit, den KOPF zu bewegen. Wenn Sie HEAD abgenommen haben, haben Sie direkt auf das angegebene Commit hingewiesen. Wenn Sie den Master erneut auschecken, zeigt er zurück zum Master. (Und viele, viele Befehle wie git lognehmen tatsächlich einen Revisionsbereich, der standardmäßig HEAD ist.)
Cascabel
3
Ja - HEAD ist das "Pronomen", mit dem auf "Die Version des Codes im Arbeitsverzeichnis" verwiesen wird. Es ist auch das Pronomen für "Die Eltern von allem, was Sie als nächstes begehen"
Ana Betts
54

Wenn Sie zu einem bestimmten Commit auschecken, erstellt git einen getrennten Zweig. Also, wenn Sie anrufen:

$ git branch 

Sie werden so etwas sehen wie:

* (detached from 3i4j25)
  master
  other_branch

Um zum Hauptzweigkopf zurückzukehren, müssen Sie nur noch einmal zu Ihrem Hauptzweig auschecken:

$ git checkout master

Dieser Befehl löscht automatisch den getrennten Zweig.

Wenn git checkoutdies nicht funktioniert, haben Sie wahrscheinlich Dateien geändert, die zwischen Zweigen in Konflikt stehen. Um zu verhindern, dass Sie Code Git verlieren, müssen Sie sich mit diesen Dateien befassen. Sie haben drei Möglichkeiten:

  1. Verstecken Sie Ihre Änderungen (Sie können sie später einfügen):

    $ git stash
    
  2. Verwerfen Sie die Änderungen, die den getrennten Zweig zurücksetzen:

    $ git reset --hard
    
  3. Erstellen Sie einen neuen Zweig mit den vorherigen Änderungen und übernehmen Sie diese:

    $ git checkout -b my_new_branch
    $ git add my_file.ext
    $ git commit -m "My cool msg"
    

Danach können Sie zu Ihrem Hauptzweig zurückkehren (neueste Version):

$ git checkout master
Thomio
quelle
36

Dies hat den Trick für mich getan (ich war immer noch in der Hauptniederlassung):

git reset --hard origin/master
Averasko
quelle
34
reset --hard ist ein Overkill und zeigt, dass Sie sich der vorgenommenen Änderungen nicht bewusst sind. Dies kann dazu führen, dass Code verloren geht.
Thomio
1
In meinem Fall wollte ich ungedrückte, versehentlich festgeschriebene Änderungen loswerden. Ich weiß, dass es andere Methoden geben kann, um dies zu erreichen. Ich bin damit einverstanden, dass Datenverlust verloren geht, wenn Sie Ihre nicht gepuschten festgeschriebenen Änderungen nicht verlieren möchten.
Csaba Toth
8

So kehren Sie zur neuesten Version zurück:

git checkout <branch-name> 

Zum Beispiel git checkout masterodergit checkout dev

Reggie Pinkham
quelle
7

Sie können zum einen mithilfe von Filialnamen auschecken.

Ich weiß, dass es verschiedene Möglichkeiten gibt, den KOPF zu bewegen, aber ich überlasse es einem Git-Experten, sie aufzuzählen.

Ich wollte nur vorschlagen gitk --all- ich fand es enorm hilfreich, wenn ich mit git anfing.

Jay
quelle
7

Ich fange gerade erst an, mich eingehender mit Git zu beschäftigen, bin mir also nicht sicher, ob ich es richtig verstehe, aber ich denke, die richtige Antwort auf die Frage des OP ist, dass Sie git log --allmit einer Formatspezifikation wie der folgenden arbeiten können : git log --all --pretty=format:'%h: %s %d'. Dies markiert die aktuell ausgecheckte Version als (HEAD)und Sie können einfach die nächste aus der Liste auswählen.

Übrigens, fügen Sie Ihrem Alias ​​einen solchen Alias .gitconfigmit einem etwas besseren Format hinzu, und Sie können Folgendes ausführen git hist --all:

  hist = log --pretty=format:\"%h %ai | %s%d [%an]\" --graph

In Bezug auf die relativen Versionen habe ich diesen Beitrag gefunden , aber es geht nur um ältere Versionen, es gibt wahrscheinlich nichts, was auf die neueren Versionen verweisen könnte.

haridsv
quelle
6

Einige der Antworten hier setzen voraus, dass Sie sich in der Hauptniederlassung befinden, bevor Sie sich entschieden haben, ein älteres Commit auszuchecken. Dies ist nicht immer der Fall.

git checkout -

Weist Sie zurück auf den Zweig, in dem Sie zuvor waren (unabhängig davon, ob es sich um einen Master handelte oder nicht).

Itai Noam
quelle
Da kein Zweig erforderlich ist, zeigt er HEAD auf die Stelle, auf die er zuvor gezeigt hat. wenn Sie tun git checkout hash2nach git checkout hash1, git checkout -werden Sie zu unterstützen hash1.
Mikhail Vasin
3

Wenn Sie zu einer früheren Version zurückkehren,

$ git checkout HEAD~2
Previous HEAD position was 363a8d7... Fixed a bug #32

Mit diesem Befehl können Sie Ihr Feature-Protokoll (Hash) auch in dieser Situation anzeigen.

$ git log master --oneline -5
4b5f9c2 Fixed a bug #34
9820632 Fixed a bug #33
...

master kann durch einen anderen Filialnamen ersetzt werden.

Wenn Sie es dann auschecken, können Sie zur Funktion zurückkehren.

$ git checkout 4b5f9c2
HEAD is now at 4b5f9c2... Fixed a bug #34
kujiy
quelle
1

Bei Git 2.23+ (August 2019) ist es am besten, git switchanstelle des verwirrendengit checkout Befehls zu verwenden.

So erstellen Sie einen neuen Zweig basierend auf einer älteren Version:

git switch -c temp_branch HEAD~2

So kehren Sie zum aktuellen Hauptzweig zurück:

git switch master
VonC
quelle
0

Eine elegantere und einfachere Lösung ist die Verwendung

git stash

Es kehrt zur am häufigsten gesendeten lokalen Version des Zweigs zurück und speichert auch Ihre Änderungen im Stash. Wenn Sie diese Aktion rückgängig machen möchten, gehen Sie wie folgt vor:

git stash apply
Ilya Gazman
quelle
Ich weiß, dass es sehr alt ist, aber ich muss einen Kommentar dazu abgeben (da ich denke, dass diese Lösung nicht verwendet werden sollte) - ich würde diese Lösung nicht verwenden, da sie dieses Problem nicht löst, sondern ein anderes Problem. Mit dieser Stash-Lösung "speichern" Sie jedes Mal, wenn Sie zu einem vorherigen Commit auschecken möchten, tatsächlich Daten, was für diesen Fall sehr unnötig ist. Der richtige und elegantere Weg ist (wie bereits erwähnt), einfach <branch> auszuchecken.
Maayao