Müssen Sie einen Branch erstellen, um eine bestimmte Git-Revision auszuchecken?

Lesezeit: 5 Minuten

Benutzer-Avatar
Nick

Eine häufige Sache, die ich gerne machen würde, ist, meine Arbeitskopie auf eine bestimmte Revision zurückzusetzen, einige Tests durchzuführen und sie dann wieder an den Kopf meines aktuellen Masters zu bringen. In der Vergangenheit habe ich naiv einen “Git-Checkout-Hash” gemacht, nur um den Kopf zu verlieren. Seitdem habe ich gelernt, dass ich einen Zweig erstellen und überprüfen, zurückwechseln und den Zweig löschen kann, aber es fühlt sich an wie zu viele Schritte für eine einfache Überprüfung. Gibt es im SVN-Sprachgebrauch eine Möglichkeit, schnell zurückzukehren und dann schnell zur Spitze des Stamms in Git zurückzukehren?

Bearbeiten: Ich denke, meine Verwirrung rührt von der Tatsache her, dass ich beim Auschecken eines Hashs und dann beim Git-Protokoll die Änderungen nicht sehe, die nach dem Auschecken des Hashs aufgetreten sind (was vernünftig ist, wenn Sie darüber nachdenken). Aber die akzeptierte Antwort ist richtig; “git checkout branch” stellt den Kopf auf den vorherigen Zweig zurück.

  • Könnten Sie “den Kopf verlieren” erläutern? Es scheint mir nichts verloren zu sein.

    – Wok

    14. September 2012 um 13:16 Uhr

Angenommen, Sie befinden sich bereits in einem Zweig (was Sie bei Änderungen, die Sie behalten möchten, immer sein sollten), können Sie dies einfach tun

git checkout <revision to check out>

Dadurch verlassen Sie den Zweig des Themas, an dem Sie gerade gearbeitet haben (kein Zweig), in dem die Arbeitskopie direkt auf eine Commit-ID und nicht wie üblich auf einen Zweignamen verweist.

Um dann einfach zurückzugehen:

git checkout <old branch name>

Eine hilfreiche Art, sich das vorzustellen, ist folgende: git checkout verändert Branches nie; es ändert lediglich, was Ihre Arbeitskopie gerade betrachtet (dh HEAD), was entweder ein Zweig sein kann (in diesem Fall werden Commits den Zweig aktualisieren) oder ein zufälliger Commit-Hash.

Solange sich die Änderungen, die Sie behalten möchten, in einem Zweig befinden, müssen Sie sich also keine Sorgen machen, dass git checkout sie verliert.

  • +1 für die Erklärung von Arbeitskopien verweist auf einen zufälligen Commit-Hash

    – Abe Petrillo

    29. Mai 2012 um 9:40 Uhr

  • Schließen Sie „Master“ in das ein, was Sie „Zweig“ nennen?

    – Wok

    14. September 2012 um 13:14 Uhr

  • @wok: Ja. Es gibt nichts Besonderes am Meister.

    – bdonlan

    15. September 2012 um 6:11 Uhr


Sie können einen Zweig bei dem bestimmten Commit erstellen, das Sie auschecken möchten (von der Handbuchseite).

git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]

also ausfüllen <start-point> als SHA1 möchten Sie Ihren neuen Zweig <branchname> zu beginnen und Sie werden Ihren “Kopf” nicht von einem expandierenden Zweig lösen.

Es gibt noch andere Dinge, die Sie wahrscheinlich tun möchten, um einige Ihrer Arbeitsdateien in dem gewünschten Zustand zu halten ….

Benutzer-Avatar
araqnid

Ja, Sie können jede beliebige Revision mit “git checkout” besuchen, wie Sie es beschreiben. Wenn Sie statt einer Verzweigung nach einer willkürlichen Revision fragen, wird Git jedoch keine offensichtliche Möglichkeit haben, Ihre Änderungen zu verfolgen. Sie können sehen, wo Sie vorher waren, indem Sie das Reflog (“git reflog show”) konsultieren – aber im Allgemeinen wären Sie vorher in einem Zweig gewesen, also möchten Sie vermutlich nur mit “git checkout master” oder ähnlichem dorthin zurückkehren.

Beachten Sie, dass diese Methode nicht automatisch mit nicht festgeschriebenen Änderungen in Ihrem Arbeitsbereich umgeht – entweder committen oder verstauen Sie Ihre Änderungen, bevor Sie zwischen Branches wechseln, oder verwenden Sie „git checkout -m“, um sie herumzutragen, während Sie sich bewegen (und seien Sie darauf vorbereitet, damit umzugehen mit Zusammenführungskonflikten, wenn die vorgenommenen Änderungen nicht trivial sind).

Ich denke, in den letzten Git-Versionen wurde die Abkürzung “@{-1}” für “wo ich war, bevor ich mich das letzte Mal bewegte” eingeführt, was in diesem Fall tatsächlich das sein könnte, was Sie wollen. (Ich habe es nicht verwendet, nur in den Versionshinweisen darüber gelesen).

  • “Wenn Sie nach einer willkürlichen Revision statt nach einem Zweig fragen, können Sie natürlich keine Änderungen vornehmen.” — Du kann verpflichten. Es ist nur so, dass Sie an „(no branch)“ arbeiten werden (wie durch „git branch“ gezeigt), also wird es schwierig sein, den Commit zu finden, nachdem Sie einen anderen Branch ausgecheckt haben, es sei denn, Sie schreiben den Hash des Commits auf oder graben ihn aus dem aus Protokolle.

    – Esko Luontola

    11. Mai 2009 um 23:56 Uhr

  • Wenn Sie Git-Erweiterungen verwenden, werden Sie gefragt, ob Sie auschecken oder einen Zweig erstellen möchten, wenn Sie sich nicht in einem Zweig befinden, was nett ist. Aber Git-Erweiterungen können für Neulinge wie mich gefährlich sein, weil ich gerade erst verstehe, wie wichtig es ist, Revision vs. Branch zu überprüfen.

    – Chance

    13. April 2015 um 15:20 Uhr

Benutzer-Avatar
Esko Luontola

Wenn Sie möchten, dass Git die Spitze einer Reihe von Änderungen anzeigt, müssen Sie sie verzweigen oder markieren. Aber selbst wenn Sie keinen Branch machen, geht keiner der Commits verloren. Es verbleibt im Repository als Garbage Node (dh nicht erreichbar über einen Branch oder Tag) und wird nur einige Tage/Wochen später entfernt, wenn Sie “git gc” ausführen.

Wenn Sie also einen einfachen Zugriff auf die Änderungen haben möchten, erstellen Sie am besten einen temporären Zweig und arbeiten dort. Wenn Sie Commits außerhalb eines Zweigs durchführen und dann einen anderen Zweig auschecken, müssen Sie den Befehl „git reflog“ verwenden oder in die Protokolle („.git/logs“-Verzeichnis) schauen, um herauszufinden, was der Hash der Änderungen war du hast verloren. Wenn Sie den Hash kennen, können Sie „git checkout hash“ oder „git checkout -b new_branch hash“ ausführen und den Tipp wiederherstellen.

1159650cookie-checkMüssen Sie einen Branch erstellen, um eine bestimmte Git-Revision auszuchecken?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy