Por Anónimo (no verificado) , 29 Abril 2026

Introducción

Git mantiene varias refs "auxiliares" especiales en .git/ para registrar estado durante operaciones multi-paso. Conocerlas convierte recuperaciones aterradoras en líneas únicas.

ORIG_HEAD

ORIG_HEAD se establece cada vez que una operación "peligrosa" mueve HEAD mucho: merge, rebase, reset, am. Captura la punta previa para que puedas deshacer:

git merge feature
# decidir que fue un error
git reset --hard ORIG_HEAD

El mismo truco después de un mal rebase o reset:

git rebase main
git reset --hard ORIG_HEAD     # de vuelta al estado pre-rebase

MERGE_HEAD

Durante un merge, MERGE_HEAD registra la punta del branch que se está mergeando. Existe desde el inicio de git merge hasta que se crea el merge commit o se aborta el merge:

git merge feature
cat .git/MERGE_HEAD
git merge --abort                # elimina MERGE_HEAD

Si terminaste de resolver conflictos y quieres escribir el merge commit:

git commit                       # usa MERGE_HEAD para registrar el segundo padre

MERGE_MSG y AUTO_MERGE

Los archivos compañeros incluyen .git/MERGE_MSG (el mensaje de commit preparado) y, desde Git 2.40, AUTO_MERGE (un tree que contiene la mejor auto-resolución de Git). Este último es útil para diff contra tu resolución manual.

CHERRY_PICK_HEAD y REVERT_HEAD

Durante un cherry-pick o revert, Git registra el commit fuente:

git cherry-pick a1b2c3d
cat .git/CHERRY_PICK_HEAD
git cherry-pick --abort
git cherry-pick --continue        # tras resolver conflictos

El mismo patrón aplica a git revert con REVERT_HEAD.

BISECT_HEAD y REBASE_HEAD

Al hacer bisect o rebase, Git también escribe BISECT_HEAD o REBASE_HEAD para rastrear el estado en progreso. Herramientas como git status usan estos para imprimir mensajes precisos de "estás a mitad de X".

FETCH_HEAD

Después de un fetch, FETCH_HEAD lista lo que se descargó, una ref por línea. git pull lo lee para saber qué mergear:

git fetch origin main
cat .git/FETCH_HEAD
git merge FETCH_HEAD

Juntándolo todo

git status                         # referencia todos estos según se necesite
ls .git/*HEAD                      # listar refs auxiliares actuales

Detectando operaciones en progreso

git status lee estas refs auxiliares para decirte qué está en progreso. Los scripts pueden hacer lo mismo probando la existencia de los archivos:

if test -f "$(git rev-parse --git-dir)/MERGE_HEAD"; then
    echo "merge in progress"
fi
if test -f "$(git rev-parse --git-dir)/CHERRY_PICK_HEAD"; then
    echo "cherry-pick in progress"
fi
if test -d "$(git rev-parse --git-dir)/rebase-merge"; then
    echo "interactive rebase in progress"
fi

Esto es exactamente lo que las integraciones de prompt de shell como __git_ps1 hacen para renderizar (main|MERGING).

Errores comunes

Intentar eliminar MERGE_HEAD manualmente para escapar de un merge; usa git merge --abort. Olvidar que existe ORIG_HEAD y recrear commits a mano después de un mal reset. Confundir FETCH_HEAD (último fetch, transitorio) con refs de seguimiento remoto como origin/main (persistente). Y finalmente, scriptear alrededor de estas refs asumiendo que existen; MERGE_HEAD solo existe durante un merge, así que siempre prueba el archivo antes de leerlo.