Qué es una ref
Una ref es un nombre que apunta a un objeto — usualmente un commit. Las branches son refs bajo refs/heads/, los tags bajo refs/tags/, los remote-tracking bajo refs/remotes/, y pseudo-refs como HEAD, FETCH_HEAD, ORIG_HEAD viven en la raíz de .git.
Inspeccionar 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>
El reflog
Cada cambio a una ref se registra: movimientos del tip de la branch, commits, resets, rebases, fetches. El reflog es una red de seguridad por clone independiente del grafo de objetos.
git reflog
git reflog show feature
git reflog show HEAD@{2.weeks.ago}
git log -g --oneline
Recupera un commit "perdido":
git checkout HEAD@{1}
git branch rescue HEAD@{5}
Expiración del reflog
git config gc.reflogExpire never
git config gc.reflogExpireUnreachable 60.days
Pseudo-refs especiales
HEAD apunta a la branch actual. ORIG_HEAD registra el tip anterior antes de operaciones destructivas. FETCH_HEAD registra los tips fetched. MERGE_HEAD existe durante un merge en progreso.
Backend reftable
git init --ref-format=reftable
Errores comunes
Confiar en el reflog para siempre: caduca. Editar .git/refs/ a mano: usa git update-ref para atomicidad. Confundir HEAD@{2} (índice del reflog) con HEAD~2 (ancestría de commits).