¿Qué es HEAD en Git?
Verás la documentación de Git que dice cosas como
La rama debe estar completamente fusionada en HEAD.
HEAD
Pero ¿qué es exactamente Git ?
Puedes pensar en HEAD como la "rama actual". Cuando cambias de rama con git checkout
, la revisión HEAD cambia para apuntar a la punta de la nueva rama.
Puedes ver a qué apunta HEAD haciendo:
cat .git/HEAD
En mi caso, el resultado es:
$ cat .git/HEAD
ref: refs/heads/master
Es posible que HEAD haga referencia a una revisión específica que no esté asociada con el nombre de una sucursal. Esta situación se llama CABEZA separada .
Para citar a otras personas :
Un encabezado es simplemente una referencia a un objeto de confirmación. Cada encabezado tiene un nombre (nombre de rama o nombre de etiqueta, etc.). De forma predeterminada, hay un encabezado en cada repositorio llamado master. Un repositorio puede contener cualquier número de cabezas. En cualquier momento dado, se selecciona un jefe como “jefe actual”. Este encabezado tiene el alias de HEAD, siempre en mayúsculas".
Tenga en cuenta esta diferencia: un “encabezado” (minúscula) se refiere a cualquiera de los encabezados nombrados en el repositorio; “HEAD” (mayúscula) se refiere exclusivamente al encabezado actualmente activo. Esta distinción se utiliza con frecuencia en la documentación de Git.
Otra buena fuente que cubre rápidamente el funcionamiento interno de git (y por lo tanto una mejor comprensión de heads/HEAD) se puede encontrar aquí . Las referencias (ref:) o cabezas o ramas pueden considerarse como notas adhesivas pegadas en las confirmaciones en el historial de confirmaciones. Por lo general, apuntan al final de una serie de confirmaciones, pero se pueden mover con git checkout
o git reset
etc.
Hay un error, quizás sutil, pero importante, en algunas de estas respuestas. Pensé en agregar mi respuesta para aclararlo.
Qué es
HEAD
?
LA CABEZA eres TÚ
HEAD
es una referencia simbólica que señala dónde se encuentra en su historial de confirmaciones. Te sigue a donde quiera que vayas, hagas lo que hagas, como una sombra. Si te comprometes, HEAD
se moverá. Si pagas algo, HEAD
se moverá. Hagas lo que hagas, si te has mudado a algún lugar nuevo en tu historial de confirmaciones, HEAD
se ha movido contigo. Para abordar un error común: no puedes separarte de HEAD
... Eso no es lo que es un estado HEAD desapegado. Si alguna vez te encuentras pensando: "¡oh no, estoy en un estado de CABEZA separada! ¡He perdido la CABEZA!" Recuerda, es tu CABEZA. LA CABEZA eres tú. No te has desprendido de la CABEZA, tú y tu CABEZA se han desprendido de algo más.
¿A qué se puede unir HEAD?
HEAD
Puede apuntar a una confirmación, sí, pero normalmente no es así. Déjame decirlo de nuevo. Normalmente HEAD
no apunta a un compromiso. Apunta a una referencia de sucursal. Está adjunta a esa rama, y cuando haces ciertas cosas (por ejemplo, commit
o reset
), la rama adjunta se moverá junto con HEAD
. Puedes ver a qué apunta mirando debajo del capó.
cat .git/HEAD
Normalmente obtendrás algo como esto:
ref: refs/heads/master
A veces obtendrás algo como esto:
a3c485d9688e3c6bc14b06ca1529f0e78edd3f86
Eso es lo que sucede cuando HEAD
apunta directamente a una confirmación. Esto se llama HEAD separado porque HEAD
apunta a algo más que una referencia de rama. Si realiza una confirmación en este estado, master
, al no estar vinculado a HEAD
, ya no se moverá con usted. No importa dónde esté ese compromiso. Podría estar en la misma confirmación que su rama maestra, pero si HEAD
apunta a la confirmación en lugar de a la rama, se desconecta y una nueva confirmación no se asociará con una referencia de rama.
Puedes ver esto gráficamente si intentas el siguiente ejercicio. Desde un repositorio de git, ejecuta esto. Obtendrás algo ligeramente diferente, pero las partes clave estarán ahí. Cuando llegue el momento de verificar la confirmación directamente, simplemente use cualquier hash abreviado que obtenga del primer resultado (aquí está a3c485d
).
git checkout master
git log --pretty=format:"%h: %d" -1
# a3c485d: (HEAD -> master)
git checkout a3c485d -q # (-q is for dramatic effect)
git log --pretty=format:"%h: %d" -1
# a3c485d: (HEAD, master)
Bien, entonces hay una pequeña diferencia en el resultado aquí. Verificar la confirmación directamente (en lugar de la rama) nos da una coma en lugar de una flecha. ¿Qué piensas, estamos en un estado HEAD desapegado? HEAD todavía se refiere a una revisión específica asociada con el nombre de una sucursal. Todavía estamos en la rama maestra, ¿no?
Ahora intenta:
git status
# HEAD detached at a3c485d
No. Estamos en estado de 'CABEZA separada'.
Puedes ver la misma representación de (HEAD -> branch)
vs. (HEAD, branch)
con git log -1
.
En conclusión
HEAD
eres tu. Apunta a lo que sea que hayas consultado, estés donde estés. Normalmente eso no es un compromiso, es una rama. Si HEAD
apunta a una confirmación (o etiqueta), incluso si es la misma confirmación (o etiqueta) a la que también apunta una rama, usted (y HEAD
) han sido separados de esa rama. Como no tiene una rama adjunta, la rama no lo seguirá cuando realice nuevas confirmaciones. HEAD
, sin embargo, lo hará.
HEAD es sólo un puntero especial que apunta a la sucursal local en la que se encuentra actualmente.
Del libro Pro Git , capítulo 3.1 Bifurcación de Git: ramas en pocas palabras , en la sección Creación de una nueva rama :
¿Qué pasa si creas una nueva sucursal? Bueno, al hacerlo se crea un nuevo puntero para que puedas moverte. Digamos que crea una nueva rama llamada prueba. Esto se hace con el comando git branch:
$ git branch testing
Esto crea un nuevo puntero en el mismo compromiso en el que se encuentra actualmente.
¿Cómo sabe Git en qué rama te encuentras actualmente? Mantiene un puntero especial llamado HEAD. Tenga en cuenta que esto es muy diferente al concepto de HEAD en otros VCS a los que esté acostumbrado, como Subversion o CVS. En Git, este es un puntero a la sucursal local en la que te encuentras actualmente. En este caso, todavía estás en el nivel maestro. El comando git branch solo creó una nueva rama, no cambió a esa rama.
Recomiendo esta definición del desarrollador de github Scott Chacon [ referencia de video ]:
Head es su sucursal actual. Es una referencia simbólica. Es una referencia a una sucursal. Siempre tienes HEAD, pero HEAD apuntará a uno de estos otros punteros, a una de las ramas en las que te encuentras. Es el padre de su próxima confirmación. Es lo que debería ser lo último que se registró en su directorio de trabajo... Este es el último estado conocido de su directorio de trabajo.
El video completo brindará una introducción justa a todo el sistema git, por lo que también te recomiendo que lo veas todo si tienes tiempo.