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

Einführung

Eine symbolische Ref ist eine Referenz, deren Wert ein anderer Ref-Name statt eines Objekt-Hashes ist. Das kanonische Beispiel ist HEAD, das üblicherweise ref: refs/heads/main enthält. Symbolische Refs erlauben Git, "den aktuellen Branch" als Daten statt als Zustand zu verfolgen.

Lesen und Schreiben

git symbolic-ref HEAD
# refs/heads/main

git symbolic-ref refs/remotes/origin/HEAD
# refs/remotes/origin/main

git symbolic-ref HEAD refs/heads/feature/login   # ohne Checkout ändern
git symbolic-ref --short HEAD                      # Kurzform: main
git symbolic-ref --delete refs/remotes/origin/HEAD

HEAD als symbolische Ref

Wenn Sie committen, löst Git HEAD auf, um den aktuellen Branch zu finden, und aktualisiert die Spitze jenes Branches. Wenn HEAD detached ist, hört es auf, symbolisch zu sein, und enthält einen rohen SHA.

cat .git/HEAD
# ref: refs/heads/main         (symbolisch)
# vs. nach Detach:
# a1b2c3d4...                  (roh)

Remote HEAD

Jeder Remote kann ein symbolisches HEAD haben, das seinen Standard-Branch angibt. Setzen oder erneuern:

git remote set-head origin --auto       # Server abfragen
git remote set-head origin main         # explizit setzen
git remote set-head origin --delete

Das ist es, was git log origin zu origin/main auflöst.

Wofür sie nützlich sind

  • "Aktueller Branch" kann sich ändern, ohne die Historie umzuschreiben.
  • Tools können fragen "was ist der Standard?", ohne Namen hardzucodieren.
  • Hooks können generisch auf den aktuell ausgecheckten Branch zielen.

Worktrees und Per-Worktree-HEAD

Jeder verlinkte Worktree (git worktree add) hat sein eigenes HEAD, gespeichert unter .git/worktrees/<name>/HEAD. Jedes kann auf einen anderen Branch zeigen:

git worktree add ../wt-feature feature/login
cat ../wt-feature/.git
# gitdir: /path/to/main/.git/worktrees/wt-feature
cat .git/worktrees/wt-feature/HEAD
# ref: refs/heads/feature/login

Erkennung

git symbolic-ref -q HEAD && echo "on a branch" || echo "detached"

Den Standard umbenennen

Um master sicher in main umzubenennen:

git branch -m master main
git symbolic-ref HEAD refs/heads/main
git push -u origin main
git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/main

Symbolische Auflösung inspizieren

git rev-parse löst einen Namen über symbolische Refs ganz bis zu einem SHA auf, während git symbolic-ref nur einer Ebene folgt. Das Paar ist nützlich für Skripte:

git symbolic-ref HEAD                       # refs/heads/main
git symbolic-ref --short HEAD               # main
git rev-parse HEAD                          # SHA
git rev-parse --symbolic-full-name HEAD     # refs/heads/main
git rev-parse --symbolic-full-name @{u}     # refs/remotes/origin/main

Verwenden Sie --symbolic-full-name, wenn Sie den kanonischen Ref-Namen wollen, egal welche Kurzform der Nutzer eintippte.

Häufige Fehler

.git/HEAD manuell editieren und das abschließende Newline vergessen, sodass Git es nicht mehr parsen kann. Verwenden Sie git symbolic-ref. refs/remotes/origin/HEAD als maßgeblich behandeln, obwohl es tatsächlich gecached ist; aktualisieren mit git remote set-head origin --auto. Eine symbolische Ref, die auf einen fehlenden Branch zeigt, mit einem echten Fehler verwechseln; git symbolic-ref -q beendet sich mit Nicht-Null, was Skripte handhaben können. Schließlich: Die zugrunde liegende Ref löschen, ohne die symbolische zu aktualisieren, und einen Dangling-Symref hinterlassen; Tools können das melden, aber es ist harmlos und leicht mit einem weiteren symbolic-ref zu beheben.