remove - ¿Qué es HEAD en Git?
git tag push (17)
Usted ve la documentación de Git que dice cosas como
La rama debe estar completamente fusionada en HEAD.
Pero, ¿qué es exactamente Git HEAD
?
Además de todas las definiciones, lo que se me quedó en la mente fue que, cuando realizas una confirmación, GIT crea un objeto de confirmación dentro del repositorio. Los objetos de compromiso deben tener un padre (o varios padres si es un compromiso de combinación). Ahora, ¿cómo sabe git el padre de la confirmación actual? Por lo tanto, HEAD es un puntero a la (última referencia) de la confirmación que se convertirá en el padre de la confirmación actual.
Como concepto, la cabecera es la última revisión en una rama. Si tiene más de una cabeza por rama con nombre, probablemente la haya creado al realizar confirmaciones locales sin fusionar, creando efectivamente una rama sin nombre.
Para tener un repositorio "limpio", debe tener una cabeza por cada rama con nombre y siempre fusionarse con una rama con nombre después de trabajar localmente.
Esto también es cierto para Mercurial .
Creo que ''HEAD'' es el check out actual. En otras palabras, ''HEAD'' apunta a la confirmación que está actualmente activada.
Si acabas de clonar y no has comprobado, no sé a qué se refiere, probablemente alguna ubicación no válida.
Después de leer todas las respuestas anteriores, todavía quería más claridad. Este blog en el sitio web oficial de git http://git-scm.com/blog me dio lo que estaba buscando:
El HEAD: Puntero a última instantánea de confirmación, siguiente padre
La CABEZA en Git es el puntero a la referencia de rama actual, que a su vez es un puntero a la última confirmación realizada o la última confirmación que se extrajo en su directorio de trabajo. Eso también significa que será el padre de la próxima confirmación que haga. En general, es más sencillo pensar que HEAD es la instantánea de su último compromiso.
Echa un vistazo a http://git-scm.com/book/en/Git-Branching-What-a-Branch-Is
Figura 3-5. Archivo HEAD apuntando a la rama en la que estás.
Echa un vistazo a Crear y jugar con ramas.
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 se refiere 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 maestra.
El resultado es puntos HEAD a la confirmación de la rama maestra del archivo .git / refs / heads / master .
Estos dos pueden confundirte:
cabeza
Apuntando a las referencias nombradas una rama recientemente enviada. A menos que use la referencia del paquete, los encabezados normalmente se almacenan en $ GIT_DIR / refs / heads /.
CABEZA
La rama actual, o su árbol de trabajo generalmente se genera a partir del árbol al que HEAD apunta. HEAD debe apuntar a una cabeza, excepto que está usando una HEAD separada.
HEAD es solo un indicador especial que apunta a la sucursal local en la que se encuentra actualmente.
Del libro Pro Git , capítulo 3.1 Git Branching - Branches in a nutshell , en la sección Creando una nueva rama :
¿Qué pasa si creas una nueva rama? Bueno, hacerlo crea un nuevo puntero para que te muevas. Digamos que creas una nueva rama llamada testing. Haz esto con el comando git branch:
$ git branch testing
Esto crea un nuevo puntero en el mismo commit en el que estás actualmente
¿Cómo sabe Git en qué rama estás actualmente? Mantiene un puntero especial llamado HEAD. Tenga en cuenta que esto es muy diferente del concepto de HEAD en otros VCS a los que puede estar acostumbrado, como Subversion o CVS. En Git, este es un puntero a la rama local en la que se encuentra actualmente. En este caso, todavía estás en el maestro. El comando git branch solo creó una nueva rama, no cambió a esa rama.
La cabeza apunta a la punta de la rama actualmente retirada.
En su repositorio, hay una carpeta .git. Abra el archivo en esta ubicación: .git / refs / heads. El código (sha-1 hash) en ese archivo (maestro en la mayoría de los casos) será el compromiso más reciente, es decir, el que se ve en la salida del comando git log
. Más información en la carpeta .git: http://gitready.com/advanced/2009/03/23/whats-inside-your-git-directory.html
Para citar a otras personas :
Una cabeza es simplemente una referencia a un objeto de confirmación. Cada cabecera tiene un nombre (nombre de rama o nombre de etiqueta, etc.). Por defecto, hay una cabecera en cada repositorio llamado maestro. Un repositorio puede contener cualquier número de cabezas. En cualquier momento, se selecciona una cabeza como la "cabeza actual". Esta cabeza tiene un alias de HEAD, siempre en mayúsculas ".
Note esta diferencia: una "cabeza" (en minúsculas) se refiere a cualquiera de las cabezas nombradas en el repositorio; "CABEZA" (en mayúsculas) se refiere exclusivamente a la cabeza actualmente activa. Esta distinción se usa frecuentemente en la documentación de Git.
here se puede encontrar otra buena fuente que cubre rápidamente el funcionamiento interno de git (y por lo tanto una mejor comprensión de los jefes / HEAD). Las referencias (ref :) o las cabezas o ramas pueden considerarse como notas post-it pegadas en confirmaciones en el historial de confirmaciones. Por lo general, apuntan a la punta de la serie de confirmaciones, pero se pueden mover con git checkout
o git revert
etc.
Puedes pensar en la CABEZA como la "rama actual". Cuando cambia de rama con git checkout
, la revisión HEAD cambia para apuntar a la punta de la nueva rama.
Puedes ver lo que apunta HEAD haciendo:
cat .git/HEAD
En mi caso, la salida es:
$ cat .git/HEAD
ref: refs/heads/master
Es posible que HEAD se refiera a una revisión específica que no esté asociada con un nombre de rama. Esta situación se llama una CABEZA separada .
Recomiendo esta definición del desarrollador de github Scott Chacon [ video referencia ]:
La cabeza es tu rama actual. Es una referencia simbólica. Es una referencia a una rama. Siempre tienes HEAD, pero HEAD apuntará a uno de estos otros punteros, a una de las ramas en las que estás. Es el padre de tu próximo commit. Es lo que debería ser lo que se verificó por última vez en su directorio de trabajo ... Este es el último estado conocido de lo que fue su directorio de trabajo.
El video completo dará una introducción justa a todo el sistema git, así que también te recomiendo que lo veas todo si tienes tiempo.
Se siente como que HEAD
es solo una etiqueta para la última confirmación que comprobó.
Esto puede ser la punta de una rama específica (como "maestro") o alguna confirmación intermedia de una rama ("cabeza separada")
Solo me gustaría detallar algunas cosas en la respuesta aceptada de Greg Hewgil. Según la guía de bolsillo de Git
Rama:
La rama en sí se define como todos los puntos alcanzables en el gráfico de confirmación de la confirmación con nombre (la "punta" de la rama).
CABEZA: Un tipo especial de referencia.
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 un ID de objeto (generalmente una confirmación o etiqueta)
- Una referencia simbólica (o symref), que apunta a otra referencia (simple o simbólica)
Como Greg mencionó, HEAD puede estar en un "estado separado". Por lo tanto, HEAD puede ser una referencia simple (para una HEAD separada) o un símbolo.
Si HEAD es una referencia simbólica para una rama existente, entonces está "en" esa rama. Si, por otro lado, HEAD es un simple ref que nombra directamente un commit por su ID SHA-1, entonces no está "en" ninguna rama, sino que está en el modo "HEAD desapegado", lo que sucede cuando verifica algo antes comprometerse a examinar.
Suponiendo que no sea un caso especial llamado "HEAD desapegado", entonces, como se indica en el libro O''Reilly Git, 2ª edición, p.69, HEAD
significa:
HEAD
siempre se refiere al compromiso más reciente en la rama actual. Cuando cambia de sucursales,HEAD
se actualiza para hacer referencia al último compromiso de la nueva sucursal.
asi que
HEAD
es la "punta" de la rama actual .
Tenga en cuenta que podemos usar HEAD
para referirnos a la confirmación más reciente, y usar HEAD~
como confirmación antes de la sugerencia, y HEAD~~
o HEAD~2
como confirmación incluso antes, y así sucesivamente.
Una excelente manera de llevar a casa el punto señalado en las respuestas correctas es ejecutar git reflog HEAD
, se obtiene un historial de todos los lugares que HEAD ha señalado.
HEAD
refiere a la confirmación actual a la que apunta su copia de trabajo, es decir, la confirmación que actualmente ha desprotegido. De la 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 abreviatura para HEAD
, como lo señaló el colaborador de Git, Junio C Hamano en su blog Git Blame :
En lugar de escribir "HEAD", puede decir "@" en su lugar, por ejemplo, "git log @".
El usuario de , VonC también encontró información interesante sobre por qué @
fue elegido como una taquigrafía en su respuesta a otra pregunta .
También 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.