¿Qué es HEAD en Git?

Resuelto bobobobo asked hace 14 años • 27 respuestas

Verás la documentación de Git que dice cosas como

La rama debe estar completamente fusionada en HEAD.

HEADPero ¿qué es exactamente Git ?

bobobobo avatar Feb 21 '10 05:02 bobobobo
Aceptado

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 .

Greg Hewgill avatar Feb 20 '2010 23:02 Greg Hewgill

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 checkouto git resetetc.

Silfheed avatar Dec 07 '2010 21:12 Silfheed

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Ú

HEADes 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, HEADse moverá. Si pagas algo, HEADse moverá. Hagas lo que hagas, si te has mudado a algún lugar nuevo en tu historial de confirmaciones, HEADse 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?

HEADPuede apuntar a una confirmación, sí, pero normalmente no es así. Déjame decirlo de nuevo. Normalmente HEADno apunta a un compromiso. Apunta a una referencia de sucursal. Está adjunta a esa rama, y ​​cuando haces ciertas cosas (por ejemplo, commito 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 HEADapunta directamente a una confirmación. Esto se llama HEAD separado porque HEADapunta 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 HEADapunta 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

HEADeres 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á.

De Novo avatar Feb 28 '2019 22:02 De Novo

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.

ingrese la descripción de la imagen aquí

¿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.

ingrese la descripción de la imagen aquí

Alexandr avatar Mar 09 '2015 20:03 Alexandr

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.

jasoares avatar Aug 26 '2011 15:08 jasoares