Von Gast (nicht überprüft) , 29 April 2026

Einführung

HEAD ist die wichtigste Referenz in Git. Sie sagt Git, von welchem Commit Ihr nächster Commit abstammen wird. Die meiste Zeit zeigt HEAD auf einen Branch, und dieser Branch zeigt auf einen Commit; HEAD kann aber auch direkt auf einen Commit zeigen (detached HEAD).

Wo es lebt

HEAD ist eine einzelne Datei unter .git/HEAD. Inspizieren Sie sie:

cat .git/HEAD
# ref: refs/heads/main

Diese eine Zeile sagt: "HEAD zeigt aktuell auf den Branch main". Wenn Sie committen, rückt Git main vor und HEAD folgt.

HEAD inspizieren

git rev-parse HEAD              # Commit-SHA
git symbolic-ref HEAD           # zugrunde liegender Ref-Name
git log -1 HEAD --oneline

Detached HEAD

Das direkte Auschecken eines Commits, Tags oder Remote-Tracking-Branches versetzt HEAD in den detached-Zustand:

git checkout v1.2.3
# You are in 'detached HEAD' state.

.git/HEAD enthält nun einen rohen SHA. Neue Commits gehen nirgendwo hin außer ins Reflog; wechseln Sie zurück auf einen echten Branch (oder erstellen Sie einen), bevor Sie sie verlieren:

git switch -c experiment

HEAD-Kurzformen

  • HEAD: der aktuelle Commit.
  • HEAD^ oder HEAD~1: Elternteil.
  • HEAD~3: drei Commits zurück über den ersten Elternteil.
  • HEAD^2: zweiter Elternteil eines Merge-Commits.
  • HEAD@{1}: vorherige Position aus dem Reflog.
git log HEAD~5..HEAD --oneline
git diff HEAD^ HEAD

Andere spezielle HEADs

  • ORIG_HEAD: vorheriges HEAD vor einer "gefährlichen" Operation (Merge, Reset).
  • MERGE_HEAD: Spitze des Branches, der gemerged wird.
  • FETCH_HEAD: Spitze dessen, was gerade gefetcht wurde.
  • CHERRY_PICK_HEAD: Commit, der gerade per Cherry-Pick angewendet wird.

HEAD in Skripten

Skripte müssen oft den aktuellen Branch-Namen kennen. Verwenden Sie Plumbing statt Porcelain-Ausgaben zu parsen:

branch=$(git symbolic-ref --short -q HEAD) || branch="(detached)"
sha=$(git rev-parse HEAD)
short=$(git rev-parse --short HEAD)

symbolic-ref --short -q HEAD beendet sich im Detached-Zustand mit Nicht-Null, was es zu einem perfekten Detektor macht. git branch --show-current (Git 2.22+) ist eine freundlichere Alternative, die im Detached-Zustand leere Ausgabe liefert. Beide sind über Versionen hinweg stabil; die Ausgabe von git status ist es nicht.

HEAD und Worktrees

Verlinkte Worktrees haben jeweils ihr eigenes HEAD. Das .git/HEAD des Hauptrepositories ist eines von vielen; jeder Worktree hat sein eigenes unter .git/worktrees/<name>/HEAD. Das bedeutet, zwei Worktrees desselben Repositories können gleichzeitig auf verschiedenen Branches sein:

git worktree add ../wt-feature feature/login
git -C ../wt-feature rev-parse HEAD
git -C . rev-parse HEAD

Die beiden HEADs sind unabhängig. Branch-Checkout ist über Worktrees hinweg exklusiv: Ein Branch kann gleichzeitig nur in einem Worktree ausgecheckt sein, was versehentliche gleichzeitige Bearbeitungen desselben Branches von zwei Orten verhindert.

Häufige Fehler

Glauben, dass HEAD ein Synonym für "aktueller Branch" sei. Ist es nicht; es ist ein Zeiger, der üblicherweise auf einen zeigt. HEAD~3 und HEAD^3 als äquivalent behandeln: Sie unterscheiden sich bei Merge-Commits. .git/HEAD manuell editieren, um Branches zu wechseln; verwenden Sie stattdessen git switch oder git checkout. Und schließlich: "Detached HEAD"-Warnungen ignorieren und ins Leere committen; wenn Sie sich dort mit neuen Commits wiederfinden, führen Sie sofort git switch -c <newbranch> aus, um sie zu verankern.