Qu'est-ce qu'une ref
Une ref est un nom qui pointe vers un objet — généralement un commit. Les branches sont des refs sous refs/heads/, les tags sous refs/tags/, le remote-tracking sous refs/remotes/, et les pseudo-refs comme HEAD, FETCH_HEAD, ORIG_HEAD vivent à la racine de .git.
Inspecter les refs
git for-each-ref
git for-each-ref --sort=-committerdate --format='%(refname:short) %(committerdate:relative)' refs/heads
git symbolic-ref HEAD
git update-ref refs/heads/foo <sha>
Le reflog
Chaque changement à une ref est journalisé : déplacements de tip de branche, commits, resets, rebases, fetches. Le reflog est un filet de sécurité par clone, indépendant du graphe d'objets.
git reflog
git reflog show feature
git reflog show HEAD@{2.weeks.ago}
git log -g --oneline
git checkout HEAD@{1}
git branch rescue HEAD@{5}
Expiration du reflog
git config gc.reflogExpire never
git config gc.reflogExpireUnreachable 60.days
Pseudo-refs spéciales
HEAD pointe vers la branche actuelle. ORIG_HEAD enregistre le tip précédent avant les ops destructrices. FETCH_HEAD enregistre les tips fetched. MERGE_HEAD existe pendant un merge en cours.
Backend reftable
git init --ref-format=reftable
Erreurs courantes
Faire confiance au reflog pour toujours : il expire. Confondre HEAD@{2} (index reflog) avec HEAD~2 (ancêtre).