W3docs

HEAD desanclado

Entiende el estado HEAD desanclado en Git: qué significa, cuándo ocurre, cómo conservar tu trabajo y volver a una rama.

Definición

Un HEAD desanclado ocurre cuando HEAD apunta directamente a un commit en lugar de a una rama. Normalmente HEAD hace referencia al nombre de una rama (como main), y esa rama apunta al último commit; así, al hacer un commit, la rama avanza contigo. En el estado de HEAD desanclado esa cadena se rompe: HEAD queda sobre un commit concreto sin ninguna rama que lleve tus nuevos commits hacia adelante.

HEAD apuntando a través de una rama frente a HEAD apuntando directamente a un commit

Cómo funciona HEAD normalmente

HEAD es una referencia que le indica a Git "dónde estás ahora mismo." En el estado habitual "anclado", las referencias forman una cadena: HEAD → rama → commit. HEAD no apunta directamente a un commit, sino al nombre de una rama, y esa rama apunta al último commit.

Cuando creas un nuevo commit, Git avanza el puntero de la rama al nuevo commit y, como HEAD apunta a la rama, la sigue automáticamente. Tu historial queda anclado a una rama con nombre.

Puedes ver esta cadena tú mismo. El archivo .git/HEAD contiene una referencia simbólica:

cat .git/HEAD
# ref: refs/heads/main      <- attached: HEAD points at a branch

Qué desancla HEAD

HEAD se desancla cada vez que haces checkout de algo que no es una rama — lo más habitual: un commit concreto, una etiqueta o una referencia de seguimiento remoto:

git checkout a1b2c3d      # a commit hash
git checkout v1.0.0       # a tag
git checkout origin/main  # a remote-tracking ref
git switch --detach main  # explicitly detach at main's tip

Git te avisa cuando esto ocurre. El mensaje tiene este aspecto:

Note: switching to 'a1b2c3d'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by switching back to a branch.

Tras el desanclaje, .git/HEAD ya no apunta a una rama — contiene un hash de commit directamente:

cat .git/HEAD
# a1b2c3d4e5f6...          <- detached: HEAD points at a commit directly

El comando git checkout hace dos cosas a la vez (cambiar de rama y mover HEAD). Los capítulos sobre git switch y git checkout explican por qué Git separó estas funciones.

Cuándo es útil un HEAD desanclado

Un HEAD desanclado no es un error — es una herramienta normal. Lo usas deliberadamente cuando quieres inspeccionar o construir sobre el historial sin tocar ninguna rama:

  • Inspeccionar una versión antigua — haz checkout de un commit o etiqueta para leer el código tal como era en ese momento.
  • Compilar o probar una versión antigua — haz checkout de v1.0.0, ejecuta la compilación y luego vuelve a tu rama.
  • Bisectar un buggit bisect hace checkout de commits en modo HEAD desanclado mientras busca el commit que introdujo el error.
  • Probar un experimento desechable — haz algunos commits experimentales, decide que fueron un callejón sin salida y abandónalos sin dejar ninguna rama.

Por qué importa

Explorar con un HEAD desanclado es perfectamente seguro — ese es precisamente su propósito. El peligro aparece solo cuando haces commits en ese estado. Como ninguna rama está rastreando tu trabajo, esos nuevos commits solo son accesibles a través del propio HEAD. En el momento en que cambias a otra rama, HEAD se mueve y nada apunta a los commits que creaste. Quedan "colgantes": siguen en el repositorio por un tiempo, pero sin ninguna referencia que los retenga, y eventualmente los elimina la recolección de basura.

La solución es sencilla: dale un nombre a esos commits antes de irte.

Conservar el trabajo realizado en un HEAD desanclado

Si hiciste commits con el HEAD desanclado y quieres conservarlos, crea una rama antes de moverte. Esto ancla los commits a un nombre:

git switch -c my-rescued-work

Tus commits desanclados ahora viven en la nueva rama, seguros y accesibles. El equivalente con el comando antiguo es git checkout -b my-rescued-work.

Un ejemplo completo

Aquí está el ciclo completo — desanclar, hacer commits y guardar el trabajo:

git checkout a1b2c3d          # detach HEAD onto an old commit
# ... edit files ...
git commit -am "Experiment"   # commit lives only on HEAD now
git switch -c experiment      # name it -> commit is now safe on a branch
git log --oneline experiment  # the new commit is reachable by name

Una vez que existe la rama, puedes fusionarla, rebasearla o eliminarla como cualquier otra rama.

Volver al estado normal

Para salir de un HEAD desanclado sin conservar ningún commit nuevo, simplemente cambia a una rama:

git switch main

Si hiciste commits en el estado desanclado, olvidaste crear una rama y ya te has movido, no entres en pánico — git reflog registra cada posición que ha visitado HEAD, incluidos commits a los que no apunta ninguna rama. Encuentra el hash del commit perdido allí y recupéralo en una nueva rama:

git reflog
# a1b2c3d HEAD@{1}: commit: Experiment   <- your lost commit
# 8120552 HEAD@{2}: checkout: moving from main to 8120552
git switch -c recovered a1b2c3d

Las entradas del reflog caducan (90 días por defecto para el historial accesible, 30 para el inaccesible), así que recupéralos cuanto antes.

Temas relacionados

  • git switch — la forma moderna y más segura de moverse entre ramas.
  • git checkout — el comando original que puede tanto cambiar de rama como desanclar HEAD.
  • git branch — crea la rama que rescata el trabajo desanclado.
  • git reflog — recupera commits después de haber abandonado un HEAD desanclado.
  • git tag — hacer checkout de una etiqueta es una forma habitual de acabar en un HEAD desanclado.

Práctica

Práctica
¿Cuáles de las siguientes afirmaciones sobre el HEAD desanclado son correctas?
¿Cuáles de las siguientes afirmaciones sobre el HEAD desanclado son correctas?
Was this page helpful?