Ich hatte heute einen abgetrennten Kopf, das gleiche Problem wie in: Git Push sagt alles auf dem neuesten Stand, obwohl ich lokale Änderungen habe
Soweit ich weiß, habe ich nichts Außergewöhnliches getan, sondern nur mein lokales Repo festgelegt und gepusht.
Wie bin ich zu einem gekommen detached HEAD
?
branch-name@{n}
der n-ten vorherigen Position vonbranch-name
. Aber egal was passiert, irgendwann muss es eine gegeben habengit checkout <rev>
. Wenn das nicht klingelt, haben Sie wahrscheinlich das getan, was Will erwähnt hat - versuchtgit checkout <file>
und versehentlich eine Revision angegeben.git status
:all conflicts fixed: run "git rebase --continue"
git checkout remotes/origin/my-branch
anstelle vongit checkout my-branch
oder tippengit checkout origin/my-branch
.Antworten:
Wenn Sie ein Commit auschecken, das nicht der Name eines Ihrer Zweige ist, erhalten Sie einen getrennten HEAD. Ein SHA1, der die Spitze eines Zweigs darstellt, ergibt immer noch einen abgetrennten KOPF. Nur eine Kasse eines lokalen Zweignamen vermeidet diesen Modus.
Siehe Festschreiben mit einem abgetrennten KOPF
Wenn Sie beispielsweise einen "Remote-Zweig" auschecken, ohne ihn zuerst zu verfolgen, erhalten Sie möglicherweise einen abgetrennten HEAD.
Siehe git: Zweig wechseln, ohne den Kopf abzunehmen
Mit Git 2.23 (August 2019) müssen Sie den verwirrenden
git checkout
Befehl nicht mehr verwenden.git switch
Sie können auch einen Zweig auschecken und einen abgetrennten KOPF erhalten, außer:--detach
OptionSehen:
Vs. mit dem neuen
git switch
Befehl:Wenn Sie einen neuen lokalen Zweig erstellen möchten, der einen Remote-Zweig verfolgt:
Kein Fehler mehr!
Kein unerwünschter losgelöster KOPF mehr!
quelle
git commit files creates a new commit containing the contents of the latest commit, plus a snapshot of files taken from the working directory. Additionally, files are copied to the stage.
Was bedeutet "Dateien werden auf die Bühne kopiert"? Ich dachte, die Dateien sind festgeschrieben, was bedeutet, dass die Bühne gelöscht ist?master
es ined489
der Abbildung oben istgit checkout ed489
, erhalten Sie einen abgetrennten KOPF, während diesgit checkout master
nicht der Fall ist ."You can think of this as an anonymous branch"
:) Ich mag die AnalogieIch habe das gerade zufällig reproduziert:
listet die entfernten Zweige auf
Ich möchte eine lokal auschecken, also schneide ich Paste aus:
Presto! Freistehender HEAD-Zustand
Lösung 1:
origin/
Fügen Sie beim Auschecken nicht die Vorderseite meiner Filialspezifikation ein:Lösung 2:
Fügen Sie einen
-b
Parameter hinzu, der einen lokalen Zweig von der Fernbedienung erstelltgit checkout -b origin/Feature/f1234
odergit checkout -b Feature/f1234
Es wird automatisch auf den Ursprung zurückgesetztquelle
git checkout -b Feature/f1234
<=>git branch Feature/f1234
undgit checkout Feature/f1234
.origin/branchname
, wird darauf hingewiesenorigin/origin/branchname
, dass der erste Name der von Ihnen verwendete Remote-Name-b
ist. Wenn dies nicht der Fall ist, wird einanonymous
Zweig erstellt, der getrennt ist. In ähnlicher Weise müssten Sie beim Auschecken von einer anderen Fernbedienung-b
Parameter angeben, da git sonst nicht erkennen kann, dass es sich um eine neue Fernbedienung handeltorigin/remote/branchname
.Versuchen
Auf diese Weise erhalten Sie einen Verlauf darüber, wie Ihre HEAD- und Zweigzeiger in der Vergangenheit verschoben wurden.
z.B :
88ea06b HEAD @ {0}: Kasse: Übergang von ENTWICKLUNG zu Fernbedienungen / Ursprung / SomeNiceFeature e47bf80 HEAD @ {1}: Ursprung ziehen ENTWICKLUNG: Schnellvorlauf
Der Anfang dieser Liste ist ein Grund, warum Sie möglicherweise auf den Status DETACHED HEAD stoßen ... und einen Remote-Tracking-Zweig auschecken.
quelle
Dies kann leicht passieren, wenn Sie versuchen, vorgenommene Änderungen rückgängig zu machen, indem Sie Dateien erneut auschecken und die Syntax nicht ganz richtig einstellen.
Sie können sich die Ausgabe von ansehen
git log
- Sie können hier das Ende des Protokolls seit dem letzten erfolgreichen Commit einfügen, und wir können alle sehen, was Sie getan haben. Oder Sie können es einfügen und im#git
Freenode-IRC nachfragen .quelle
Dies kann passieren, wenn Sie ein Tag mit dem gleichen Namen wie ein Zweig haben.
Beispiel: Wenn "release / 0.1" der Tag-Name ist, dann
erzeugt bei "release / 0.1" abgelösten HEAD. Wenn Sie erwarten, dass Release / 0.1 ein Filialname ist, werden Sie verwirrt.
quelle
Detached HEAD
bedeutet, dass das, was derzeit ausgecheckt ist, keine lokale Niederlassung ist.Einige Szenarien, die zu einem
Detached HEAD
Status führen:Wenn Sie einen Remote-Zweig auschecken , sagen wir
origin/master
. Dies ist ein schreibgeschützter Zweig. Wenn Sie also ein Commit daraus erstellen, istorigin/master
es frei schwebend , dh nicht mit einem Zweig verbunden.Wenn Sie ein bestimmtes Tag auschecken oder festschreiben . Wenn Sie von hier aus ein neues Commit ausführen, ist es wieder frei schwebend , dh nicht mit einem Zweig verbunden. Beachten Sie, dass beim Auschecken eines Zweigs neue Commits immer automatisch an der Spitze platziert werden.
Wenn Sie zurückgehen und ein bestimmtes Commit oder Tag auschecken möchten, um von dort aus zu arbeiten, können Sie einen neuen Zweig erstellen, der von diesem Commit ausgeht, und von zu diesem wechseln
git checkout -b new_branch_name
. Dies verhindert denDetached HEAD
Status, da Sie jetzt einen Zweig ausgecheckt und kein Commit mehr haben.quelle
Ein einfacher zufälliger Weg ist es,
git checkout head
einen Tippfehler zu machenHEAD
.Versuche dies:
was gibt
quelle
checkout -b
die wie eine Kasse aussehen, aber tatsächlich verzweigen), aber eine andere Liste ist nur willkommen.Die andere Möglichkeit, in einen git-getrennten Kopfzustand zu gelangen, besteht darin, zu versuchen, einen Commit für einen Remote-Zweig durchzuführen. Etwas wie:
Beachten Sie, dass Sie bei jedem weiteren Versuch, origin / foo auszuchecken, wieder in einen Zustand mit losgelöstem Kopf versetzt werden!
Die Lösung besteht darin, einen eigenen lokalen foo-Zweig zu erstellen, der origin / foo verfolgt, und dann optional zu pushen.
Dies hat wahrscheinlich nichts mit Ihrem ursprünglichen Problem zu tun, aber diese Seite enthält viele Google-Treffer für "Git Detached Head" und dieses Szenario ist stark unterdokumentiert.
quelle
Wenn Sie zu einem Commit auschecken
git checkout <commit-hash>
oder zu einem Remote-Zweig auschecken, wird Ihr HEAD getrennt und versucht, ein neues Commit darauf zu erstellen.Commits, die von keinem Zweig oder Tag erreicht werden können, werden nach 30 Tagen gesammelt und aus dem Repository entfernt.
Eine andere Möglichkeit, dies zu lösen, besteht darin, einen neuen Zweig für das neu erstellte Commit zu erstellen und ihn zu überprüfen.
git checkout -b <branch-name> <commit-hash>
Dieser Artikel zeigt, wie Sie zum getrennten HEAD- Status gelangen können.
quelle