2010-08-24 4 views
203

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

Jetzt möchte ich zurück auf die neueste Version, aber ich kenne den Hash dafür nicht. Wenn ich git log eintippe, sehe ich es nicht.

Wie kann ich das tun? Gibt es auch eine einfachere Möglichkeit, Versionen zu ändern, als Hashes einzugeben - so etwas wie "gehe zurück zu zwei Versionen" oder "gehe zu den chronologisch jüngsten"?

Antwort

247

git checkout master sollte den Trick tun. Um zwei Versionen zurückgehen, könnten Sie so etwas wie git checkout HEAD~2 sagen, aber besser einen temporären Zweig erstellen basierend auf dieser Zeit, so git checkout -b temp_branch HEAD~2

+4

Cool! 'git checkout master' ist genau so, wie ich von einem Zweig zurückwechsle. Bedeutet das, dass ich, wenn ich eine vorherige Version auschecke, im Wesentlichen eine Zweigstelle erstelle? –

+3

@Nathan: In git ist ein Ast wirklich meistens ein beweglicher Zeiger auf eine bestimmte Revision. So konzeptuell erschaffen Sie einen Zweig, aber nicht in dem Sinne, dass Git an Zweige denkt. – DLH

+2

Also im einfachsten Fall, wo ich eine Reihe von linearen Änderungen habe, wenn ich eine frühere Revision auschecke, bewege ich den HEAD-Zeiger dorthin, was bedeutet, dass "git log" relativ zu diesem Punkt angezeigt wird? Und wenn ich Master auschecke, verschiebe ich den Zeiger auf die neueste Version des Master-Zweigs? –

4

Sie können mit Zweignamen überprüfen, für eine Sache.

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

Ich wollte nur vorschlagen gitk --all - Ich fand es enorm hilfreich, wenn Sie mit Git beginnen.

+3

+1 für 'gitk --all' behoben. ** SO ** nützlich. – DLH

6

Ich fange gerade an, tiefer in git zu graben, also nicht sicher, ob ich richtig verstehe, aber ich denke, die richtige Antwort auf die Frage OP ist, dass Sie git log --all mit einer Formatspezifikation wie diesem laufen lassen können: git log --all --pretty=format:'%h: %s %d'. Dies markiert die aktuelle ausgecheckte Version als (HEAD) und Sie können einfach den nächsten aus der Liste holen.

BTW, einen Alias ​​wie diese zu Ihrem .gitconfig mit einer etwas besseren Format hinzufügen und git hist --all ausführen können:

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

Hinsichtlich der relativen Versionen, fand ich diese post, aber es spricht nur über ältere Versionen, es gibt wahrscheinlich nichts, um auf die neueren Versionen zu verweisen.

22

Dies hat den Trick für mich (ich war noch auf dem Master-Zweig):

git reset --hard origin/master

+23

** reset --hard ** ist ein Overkill und zeigt Ihnen, dass Sie sich der vorgenommenen Änderungen nicht bewusst sind. Dies kann dazu führen, dass Code verloren geht. – Thomio

+0

In meinem Fall wollte ich versehentlich gelöschte Änderungen entfernen. Ich weiß, dass es andere Methoden geben kann, um das zu erreichen. Ich stimme zu, wenn Sie nicht Ihre ungespeicherten Änderungen verlieren möchten, ist dies ein Datenverlust. –

29

Wenn Sie zu einem bestimmten Kasse verpflichten, erstellt git einen freistehenden Zweig. Also, wenn Sie anrufen:

$ git branch 

Sie so etwas wie sehen:

* (detached from 3i4j25) 
    master 
    other_branch 

Um zurück zum Hauptzweig Kopf zu kommen Sie gerade brauchen, um wieder zu Ihrem Master-Zweig zur Kasse:

$ git checkout master 

Dieser Befehl löscht automatisch den gelösten Zweig.

Wenn git checkout nicht funktioniert, haben Sie wahrscheinlich Dateien zwischen Zweigen geändert. Um zu verhindern, dass Sie Code verlieren, müssen Sie mit diesen Dateien umgehen.Sie haben drei Möglichkeiten:

  1. Stash Ihre Änderungen (Sie können sie später Pop):

    $ git stash 
    
  2. verwerfen die Änderungen zurückgesetzt-ing den freistehenden Zweig:

    $ git reset --hard 
    
  3. erstellen eine neue Verzweigung mit den vorherigen Änderungen und begehen sie:

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

Danach fragen Sie Ihren Master Zweig zurück (neueste Version):

$ git checkout master 
0

Eine elegante und einfache Lösung ist

git stash 

verwenden Es wird Zurückkehren zur aktuellsten lokalen Version der Zweigstelle und Speichern der Änderungen im Stash. Wenn Sie diese Aktion rückgängig machen möchten, gehen Sie wie folgt vor:

git stash apply 
2

Wenn Sie zurück zu einer früheren Version gehen,

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

Sie können Ihre Funktion log (Hash) mit diesem Befehl auch in dieser Situation sehen;

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

master kann mit einem anderen Zweignamen ersetzt werden.

Dann checken Sie es aus, Sie können wieder auf die Funktion zugreifen.

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

auf die neueste Version zurückzukehren:

git checkout <branch-name> 

Zum Beispiel git checkout master oder git checkout dev