Par Anonyme (non vérifié) , 29 avril 2026

Introduction

Une ref symbolique est une référence dont la valeur est un autre nom de ref plutôt qu'un hachage d'objet. L'exemple canonique est HEAD, qui contient généralement ref: refs/heads/main. Les refs symboliques permettent à Git de suivre « la branche courante » comme donnée, pas comme état.

Lire et écrire

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   # changer sans checkout
git symbolic-ref --short HEAD                      # forme courte : main
git symbolic-ref --delete refs/remotes/origin/HEAD

HEAD comme ref symbolique

Quand vous commitez, Git résout HEAD pour trouver la branche courante et met à jour la pointe de cette branche. Quand HEAD est détaché, il cesse d'être symbolique et contient un SHA brut.

cat .git/HEAD
# ref: refs/heads/main         (symbolique)
# vs après détachement :
# a1b2c3d4...                  (brut)

HEAD distant

Chaque remote peut avoir un HEAD symbolique indiquant sa branche par défaut. Définir ou rafraîchir :

git remote set-head origin --auto       # interroger le serveur
git remote set-head origin main         # définir explicitement
git remote set-head origin --delete

C'est ce qui fait que git log origin résout vers origin/main.

Pourquoi les utiliser

  • La « branche courante » peut changer sans réécrire l'historique.
  • Les outils peuvent demander « quelle est la branche par défaut ? » sans coder en dur les noms.
  • Les hooks peuvent cibler la branche actuellement extraite de manière générique.

Worktrees et HEAD par worktree

Chaque worktree lié (git worktree add) a son propre HEAD, stocké sous .git/worktrees/<name>/HEAD. Chacun peut pointer vers une branche différente :

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

Détection

git symbolic-ref -q HEAD && echo "sur une branche" || echo "détaché"

Renommer la branche par défaut

Pour renommer master en main en sécurité :

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

Inspecter la résolution symbolique

git rev-parse résout un nom à travers les refs symboliques jusqu'à un SHA, tandis que git symbolic-ref ne suit qu'un niveau. La paire est utile pour les scripts :

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

Utilisez --symbolic-full-name quand vous voulez le nom de ref canonique peu importe le raccourci tapé par l'utilisateur.

Erreurs fréquentes

Éditer .git/HEAD à la main et oublier le saut de ligne final, laissant Git incapable de l'analyser. Utilisez git symbolic-ref. Traiter refs/remotes/origin/HEAD comme faisant autorité alors qu'il est en réalité mis en cache ; rafraîchissez avec git remote set-head origin --auto. Confondre une ref symbolique pointant vers une branche manquante avec une vraie erreur ; git symbolic-ref -q sort avec un code non nul, que les scripts peuvent gérer. Enfin, supprimer la ref sous-jacente sans mettre à jour la symbolique, laissant un symref pendant ; les outils peuvent le signaler mais c'est inoffensif et facile à corriger avec un autre symbolic-ref.