Einführung
Normalerweise zeigt HEAD auf eine Branch-Ref, die wiederum auf einen Commit zeigt. In Detached HEAD zeigt HEAD direkt auf einen Commit. Detached HEAD ist nicht kaputt; es ist ein bewusster Modus, der zum Inspizieren der Historie nützlich und zum gedankenlosen Committen gefährlich ist.
Wie man dorthin kommt
git checkout v1.2.3
git switch --detach v1.2.3
git checkout HEAD~5
git checkout origin/main # Remote-Tracking ist quasi-readonly
Jeder dieser Befehle setzt HEAD direkt auf einen Commit statt auf einen Branch.
Inspizieren
cat .git/HEAD
# a1b2c3d4... (roher SHA, nicht "ref: ...")
git status
# HEAD detached at v1.2.3
Warum es existiert
- Ein altes Release inspizieren, ohne einen Branch zu beeinflussen.
- Bisecten (
git bisectverwendet Detached HEAD). - Ein schnelles Experiment bauen, das Sie verwerfen können.
- Auf einem Tag operieren, der unbeweglich bleiben soll.
In Detached HEAD committen
Sie können in Detached HEAD committen, und das Commit-Objekt wird normal erzeugt. Der Haken: Kein Branch zeigt darauf. Wechseln Sie weg und der Commit wird unerreichbar.
git switch --detach v1.2.3
echo fix > patch.txt
git add patch.txt
git commit -m "Quick fix"
git switch main # der neue Commit ist jetzt verwaist
Verankern Sie ihn vor dem Wechsel:
git switch -c hotfix/1.2.4
Wiederherstellung nach versehentlichem Detach
Wenn Sie schon weggewechselt haben, hat das Reflog den Commit:
git reflog
# a1b2c3d HEAD@{1}: commit: Quick fix
git switch -c hotfix/1.2.4 a1b2c3d
Wenn Detached HEAD nicht detached ist
Bare-Repositories haben oft HEAD als symbolische Ref auf refs/heads/main, auch wenn es keinen Working Tree gibt. Submodules checken absichtlich Detached HEAD auf dem aufgezeichneten Commit aus; das ist normal.
Warnungen konfigurieren
git config --global advice.detachedHead true # Standard: Hinweise zeigen
Anfänger sollten dies eingeschaltet lassen; der Warntext erklärt genau, wie man wiederherstellt.
Sicher im detached Modus arbeiten
Wenn Sie absichtlich experimentieren wollen, ohne einen Branch zu beeinflussen, ist Detached HEAD das richtige Werkzeug. Der Trick ist, wichtige Arbeit vor dem Wegwechseln zu verankern. Ein verlässliches Muster:
git switch --detach v1.2.3
# ... experimentieren, committen ...
git tag tmp/experiment # Lesezeichen
git switch main
# später
git switch -c rescued tmp/experiment
git tag -d tmp/experiment
Der tmp/-Tag-Namespace macht offensichtlich, dass dies wegwerfbare Anker sind. Manche Teams reservieren für diesen Zweck ein ganzes Präfix und lassen CI es ignorieren.
Häufige Fehler
Die Warnung als beängstigenden Fehler behandeln und in Panik geraten. Sie ist informativ. Bedeutende Arbeit in Detached HEAD verrichten und dann git switch main ausführen, ohne zuerst einen Branch zu erstellen; per Reflog wiederherstellen, aber besser zuerst verankern. Detached HEAD mit einem korrupten Repository verwechseln; nichts ist korrupt, Ihnen fehlt nur ein Branch-Label. Schließlich: Im detached Modus pushen: git push braucht an beiden Enden einen Branch. Erstellen Sie entweder einen lokalen Branch und pushen Sie ihn, oder verwenden Sie git push origin HEAD:refs/heads/new.