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

Introducción

HEAD es la referencia más importante en Git. Le dice a Git de qué commit descenderá tu próximo commit. La mayoría del tiempo HEAD apunta a un branch, y ese branch apunta a un commit; pero HEAD también puede apuntar directamente a un commit (HEAD desconectado).

Dónde vive

HEAD es un único archivo en .git/HEAD. Inspecciónalo:

cat .git/HEAD
# ref: refs/heads/main

Esa única línea dice "HEAD apunta actualmente al branch main". Cuando haces commit, Git avanza main y HEAD sigue.

Inspeccionando HEAD

git rev-parse HEAD              # SHA del commit
git symbolic-ref HEAD           # nombre de la ref subyacente
git log -1 HEAD --oneline

HEAD desconectado

Hacer checkout de un commit, tag o branch de seguimiento remoto directamente pone a HEAD en estado desconectado:

git checkout v1.2.3
# You are in 'detached HEAD' state.

.git/HEAD ahora contiene un SHA crudo. Los nuevos commits no van a ningún lado salvo al reflog; vuelve a un branch real (o crea uno) antes de perderlos:

git switch -c experiment

Atajos de HEAD

  • HEAD: el commit actual.
  • HEAD^ o HEAD~1: padre.
  • HEAD~3: tres commits atrás vía primer padre.
  • HEAD^2: segundo padre de un merge commit.
  • HEAD@{1}: posición previa desde el reflog.
git log HEAD~5..HEAD --oneline
git diff HEAD^ HEAD

Otros HEADs especiales

  • ORIG_HEAD: HEAD anterior antes de una operación "peligrosa" (merge, reset).
  • MERGE_HEAD: punta del branch siendo mergeado.
  • FETCH_HEAD: punta de lo que se acaba de hacer fetch.
  • CHERRY_PICK_HEAD: commit siendo cherry-picked.

HEAD en scripts

Los scripts a menudo necesitan saber el nombre del branch actual. Usa plumbing en lugar de parsear la salida de porcelain:

branch=$(git symbolic-ref --short -q HEAD) || branch="(detached)"
sha=$(git rev-parse HEAD)
short=$(git rev-parse --short HEAD)

symbolic-ref --short -q HEAD sale con código distinto de cero en estado desconectado, lo que lo hace un detector perfecto. git branch --show-current (Git 2.22+) es una alternativa más amigable que muestra salida vacía cuando está desconectado. Ambos son estables entre versiones; la salida de git status no lo es.

HEAD y worktrees

Los worktrees vinculados tienen cada uno su propio HEAD. El .git/HEAD del repositorio principal es uno de muchos; cada worktree tiene el suyo bajo .git/worktrees/<name>/HEAD. Esto significa que dos worktrees del mismo repositorio pueden estar en branches diferentes simultáneamente:

git worktree add ../wt-feature feature/login
git -C ../wt-feature rev-parse HEAD
git -C . rev-parse HEAD

Los dos HEADs son independientes. El checkout de branch es exclusivo entre worktrees: un branch solo puede estar checkeado en un worktree a la vez, previniendo ediciones concurrentes accidentales del mismo branch desde dos ubicaciones.

Errores comunes

Creer que HEAD es sinónimo de "branch actual". No lo es; es un puntero que usualmente apunta a uno. Tratar HEAD~3 y HEAD^3 como equivalentes: difieren en merge commits. Editar .git/HEAD a mano para cambiar de branch; usa git switch o git checkout en su lugar. Y finalmente, ignorar las advertencias de "HEAD desconectado" y commitear al vacío; si te encuentras ahí con nuevos commits, haz git switch -c <newbranch> inmediatamente para anclarlos.