Pregunta ¿Qué es HEAD en Git?


Ves la documentación de Git diciendo cosas como

La rama debe estar completamente fusionada en HEAD.

Pero, ¿qué es Git? HEAD ¿exactamente?


835
2018-02-20 22:58


origen


Respuestas:


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 lo que HEAD apunta al hacer:

cat .git/HEAD

En mi caso, la salida 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 un nombre de rama. Esta situación se llama CABEZA separada.


618
2018-02-20 23:00



Citar otra gente:

Una cabeza es simplemente una referencia a un   cometer un objeto Cada cabeza tiene un nombre   (nombre de la rama o etiqueta, etc.). Por   predeterminado, hay una cabeza en cada   repositorio llamado maestro. Un repositorio   puede contener cualquier cantidad de cabezas. A   cualquier momento dado, se selecciona una cabeza   como la "cabeza actual". Esta cabeza es   aliased a HEAD, siempre en mayúsculas ".

Tenga en cuenta esta diferencia: una "cabeza"   (minúscula) se refiere a cualquiera de los   cabezas nombradas en el repositorio; "CABEZA"   (mayúsculas) se refiere exclusivamente a la   cabeza activa actualmente. Esta   la distinción se usa con frecuencia en Git   documentación.

Otra buena fuente que cubre rápidamente el funcionamiento interno de git (y por lo tanto una mejor comprensión de las cabezas / CABEZA) se puede encontrar aquí. Las referencias (ref :) o las cabeceras o las ramas se pueden considerar como notas post-it pegadas en commits en el historial de commit. Por lo general, apuntan a la punta de la serie de confirmaciones, pero se pueden mover con git checkout o git revert etc.


143
2017-12-07 21:03



Recomiendo esta definición del desarrollador de Github Scott Chacon [referencia de video]

Head es tu rama actual. Es una referencia simbólica. Es una referencia a una rama. Siempre tiene HEAD, pero HEAD apunta a uno de estos otros indicadores, a una de las ramas en las que se encuentra. Es el padre de tu próximo commit. Es lo que debería ser lo último que se guardó en su directorio de trabajo ... Este es el último estado conocido de su directorio de trabajo.

El video completo dará una introducción justa a todo el sistema de git, así que también te recomiendo que lo veas todo si tienes tiempo para hacerlo.


44
2017-08-26 15:01



HEAD es solo un puntero especial que apunta a la rama local en la que se encuentra actualmente.

Desde el Pro Git capítulo del libro 3.1 Git Branching - Ramas en una cáscara de nuez, en la sección Creando una nueva sucursal:

¿Qué pasa si creas una nueva rama? Bueno, al hacerlo, crea un nuevo   puntero para que puedas moverte. Digamos que creas una nueva rama   llamada prueba. Usted hace esto con el comando de la rama git:

$ git branch testing 

Esto crea un nuevo puntero en el mismo compromiso en el que se encuentra actualmente

enter image description here

¿Cómo sabe Git en qué rama se encuentra actualmente? Mantiene un puntero especial llamado HEAD. Tenga en cuenta que esto es muy diferente de   el concepto de HEAD en otros VCS a los que pueda estar acostumbrado, como   Subversion o CVS. En Git, este es un puntero a la rama local   usted está actualmente en. En este caso, todavía estás en maestro. El git   El comando de rama solo creó una nueva rama, no cambió a esa   rama.

enter image description here


35
2018-03-09 20:02



Suponiendo que no es un caso especial llamado "HEAD separada", entonces, como se indica en el libro de O'Reilly Git, 2da edición, p.69, HEAD medio:

HEAD siempre se refiere a la confirmación más reciente sobre la corriente   rama. Cuando cambias de rama, HEAD se actualiza para referirse a la nueva   último compromiso de la sucursal.

asi que

HEAD es la "punta" de la rama actual.

Tenga en cuenta que podemos usar HEAD para hacer referencia a la confirmación más reciente y usar HEAD~ como el compromiso antes de la propina, y HEAD~~ o HEAD~2 como el compromiso incluso antes, y así sucesivamente.


26
2018-05-06 09:37



HEAD se refiere a la confirmación actual a la que apunta su copia de trabajo, es decir, la confirmación que actualmente ha desprotegido. Desde el documentación oficial del Kernel de Linux sobre la especificación de revisiones de Git:

HEAD nombra la confirmación en la que basó los cambios en el árbol de trabajo.

Sin embargo, tenga en cuenta que en la próxima versión 1.8.4 de Git, @ también se puede usar como una forma abreviada de HEAD, como señalado por el colaborador de Git Junio ​​C Hamano en su blog de Git Blame:

En lugar de escribir "HEAD", puede decir "@", por ejemplo, "git log @".

Usuario de Stack Overflow VonC También encontré algunos información interesante sobre por qué @ fue elegido como una taquigrafía en su respuesta a otra pregunta.

También es de interés, en algunos entornos no es necesario capitalizar HEAD, específicamente en sistemas operativos que usan sistemas de archivos que no distinguen entre mayúsculas y minúsculas, específicamente Windows y OS X.


17
2017-07-26 01:18



Echa un vistazo a Creando y jugando con sucursales

HEAD es en realidad un archivo cuyo contenido determina dónde se refiere la variable HEAD:

$ cat .git/HEAD
ref: refs/heads/master
$ cat .git/refs/heads/master
35ede5c916f88d8ba5a9dd6afd69fcaf773f70ed

En este repositorio, el contenido del archivo HEAD hace referencia a un segundo archivo llamado refs / heads / master. El archivo refs / heads / master contiene el hash de la confirmación más reciente en la rama principal.

El resultado es HEAD apunta a la confirmación de la rama maestra desde el .git / refs / heads / master archivo.

enter image description here


12
2017-12-09 07:20



Me gustaría detallar algunas cosas en la respuesta aceptada de Greg Hewgil. De acuerdo con la Guía de bolsillo de Git

Rama:

la rama en sí se define como todos los puntos alcanzables en el compromiso   gráfico de la confirmación nombrada (la "punta" de la rama).

CABEZA: Un tipo especial de Ref

La referencia especial HEAD determina en qué rama estás ...

Refs

Git define dos tipos de referencias, o punteros con nombre, que llama   "Refs":

  • Una referencia simple, que apunta directamente a una ID de objeto (generalmente una confirmación o etiqueta)
  • Una referencia simbólica (o symref), que apunta a otra referencia (ya sea simple o simbólica)

Como Greg mencionó, HEAD puede estar en un "estado separado". Así que HEAD puede ser una simple referencia (para un HEAD separado) o un symref.

si HEAD es una referencia simbólica para una sucursal existente, entonces estás "encendido"   esa rama. Si, por otro lado, HEAD es una ref simple directamente   nombrando un commit por su SHA-1 ID, entonces usted no está "on" en ninguna rama, pero   más bien en el modo "HEAD separado", que sucede cuando se echa un vistazo a algunos   antes se compromete a examinar.


8
2017-08-05 16:04



Creo que 'HEAD' es el compromiso actual de check out. En otras palabras, 'HEAD' apunta a la confirmación que está actualmente desprotegida.

Si acabas de clonar y no has desprotegido, no sé a qué apunta, probablemente alguna ubicación no válida.


4
2017-07-18 09:57



Una excelente manera de llevar a casa el punto hecho en las respuestas correctas es correr git reflog HEAD, obtienes un historial de todos los lugares que HEAD ha señalado.


3
2018-05-12 19:27