Ich entwickle ein Bereitstellungsskript für mein Git-Projekt und habe gerade angefangen, Tags zu verwenden. Ich habe ein neues Tag namens hinzugefügt v2.0
:
git tag -a v2.0 -m "Launching version 2.0"
Und ich habe dieses Tag in das Remote-Repository verschoben
git push --tags
Wenn ich versuche, das Bereitstellungsskript auszuführen und das v2.0
Tag auszuchecken, wird folgende Meldung angezeigt:
Sie befinden sich im Status "Freistehender KOPF". Sie können sich umschauen, experimentelle Änderungen vornehmen und diese festschreiben, und Sie können alle in diesem Zustand vorgenommenen Festschreibungen verwerfen, ohne Auswirkungen auf Zweige zu haben, indem Sie eine weitere Prüfung durchführen. Wenn Sie einen neuen Zweig erstellen möchten, um die von Ihnen erstellten Commits beizubehalten, können Sie dies (jetzt oder später) tun, indem Sie -b erneut mit dem Befehl checkout verwenden. Beispiel: git checkout -b new_branch_name HEAD ist jetzt bei
Ist das normal? Das Repository ist in der Schwebe, denn wenn ich das tue:
git branch
Ich bekomme diese Ausgabe:
* (no branch)
master
Entschuldigung, wenn dies offensichtlich ist, aber ich konnte es nicht herausfinden.
quelle
Antworten:
Okay, zuerst ein paar Begriffe etwas vereinfacht.
In
git
a isttag
(wie viele andere Dinge) das, was man als Baum bezeichnet . Es ist eine Möglichkeit, sich auf einen Punkt in der Geschichte des Projekts zu beziehen. Treeishes können ein Tag, ein Commit, ein Datumsbezeichner, ein Ordnungsbezeichner oder viele andere Dinge sein.Jetzt
branch
ist a wie ein Tag, aber beweglich. Wenn Sie sich in einem Zweig befinden und einen Commit durchführen, wird der Zweig in den neuen Commit verschoben, den Sie vorgenommen haben, und gibt die aktuelle Position an.Ihr
HEAD
ist Zeiger auf einen Zweig, der als "aktuell" betrachtet wird. Normalerweise , wenn Sie ein Repository klonen,HEAD
wird zeigen auf ,master
die wiederum weisen auf eine zu begehen. Wenn Sie dann so etwas tungit checkout experimental
, wechseln Sie denHEAD
to-Punkt zu demexperimental
Zweig, der möglicherweise auf ein anderes Commit verweist.Nun die Erklärung.
Wenn Sie a ausführen
git checkout v2.0
, wechseln Sie zu einem Commit, auf das a nicht verweistbranch
. DasHEAD
ist jetzt "losgelöst" und zeigt nicht auf einen Zweig. Wenn Sie sich jetzt (wie Sie möchten) für ein Commit entscheiden, müssen Sie keinen Verzweigungszeiger aktualisieren, um dieses Commit zu verfolgen. Wenn Sie zu einem anderen Commit zurückkehren, verlieren Sie dieses neue Commit, das Sie vorgenommen haben. Das sagt Ihnen die Nachricht.Normalerweise können Sie sagen
git checkout -b v2.0-fixes v2.0
. Dadurch wird ein neuer Verzweigungszeiger an dem Commit erstellt, auf den der Baum zeigtv2.0
(in diesem Fall ein Tag), und dann wird IhrHEAD
to-Punkt darauf verschoben . Wenn Sie jetzt Commits vornehmen, können Sie diese (mithilfe desv2.0-fixes
Zweigs) verfolgen und wie gewohnt arbeiten. Es ist nichts "Falsches" an dem, was Sie getan haben, besonders wenn Sie sich nur denv2.0
Code ansehen möchten . Wenn Sie dort jedoch Änderungen vornehmen möchten, die Sie verfolgen möchten, benötigen Sie eine Verzweigung.Sie sollten einige Zeit damit verbringen, das gesamte DAG-Modell von git zu verstehen. Es ist überraschend einfach und macht alle Befehle ziemlich klar.
quelle
git reflog
, was ein großartiger Befehl ist, über den Sie Bescheid wissen sollten! Wenn keine Speicherbereinigung stattgefunden hat, ist es anscheinend "unmöglich", ein Commit zu verlieren.Ja, das ist normal. Dies liegt daran, dass Sie ein einzelnes Commit auschecken, das keinen Kopf hat. Insbesondere ist es (früher oder später) kein Leiter einer Branche.
Aber normalerweise gibt es kein Problem mit diesem Zustand. Sie können einen neuen Zweig aus dem Tag erstellen, wenn Sie sich dadurch sicherer fühlen :)
quelle