Las pseudo-refs poco celebradas
Más allá de HEAD, Git mantiene un pequeño zoológico de refs actualizadas automáticamente que registran lo que acaba de pasar. Conocerlas convierte "borré mi trabajo" en una recuperación de una línea.
HEAD
Apunta a la branch actual (e.g., ref: refs/heads/main) o, cuando está desacoplado, a un SHA de commit directamente.
ORIG_HEAD
Establecida por operaciones destructivas (merge, rebase, reset, am) al tip anterior. La recuperación clásica:
git reset --hard ORIG_HEAD
FETCH_HEAD
Actualizada por git fetch. Cada línea es <sha>\t[not-for-merge]\t<descripción>.
git fetch origin
git log HEAD..FETCH_HEAD
git diff HEAD FETCH_HEAD -- src/
MERGE_HEAD y CHERRY_PICK_HEAD
cat .git/MERGE_HEAD
git rev-parse --verify MERGE_HEAD && echo "merge en progreso"
REVERT_HEAD, BISECT_*
Marcadores similares existen para revert, bisect, rebase y AM.
Selectores del reflog
git reset --hard HEAD@{1}
git checkout @{-1}
git checkout -
Errores comunes
Confundir ORIG_HEAD con el reflog — ORIG_HEAD se sobrescribe en la próxima op destructiva.
Flujo práctico de recuperación
git reflog
git branch rescue HEAD@{14}
git reset --hard rescue