in

¿Qué es HEAD en Git?

apple touch icon@2

Hay una idea errónea, quizás sutil, pero importante, en algunas de estas respuestas. Pensé en agregar mi respuesta para aclararlo.

Que es HEAD?

LA CABEZA eres TÚ

HEADes una referencia simbólica que apunta a cualquier lugar en el que se encuentre 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 comprueba algo, HEAD Se moverá. Hagas lo que hagas, si te has mudado a un lugar nuevo en tu historial de confirmaciones, HEAD se ha movido contigo. Para abordar un error común: no puede separarse de HEAD. Eso no es lo que es un estado HEAD separado. Si alguna vez te encuentras pensando: «¡oh no, estoy en estado de CABEZA desprendida! ¡He perdido mi CABEZA!» Recuerda, es tu CABEZA. HEAD eres tú. No se ha desprendido de la CABEZA, usted y su CABEZA se han separado de otra cosa.

¿A qué se puede adherir HEAD?

HEAD puede apuntar a una confirmación, sí, pero normalmente no es así. Déjame decirlo de nuevo. Típicamente HEAD no apunta a un compromiso. Apunta a una referencia de rama. Está adjunto a esa rama, y ​​cuando haces ciertas cosas (p. ej., commit o reset), la rama adjunta se moverá junto con HEAD. Puede 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 pasa cuando HEAD apunta directamente a un compromiso. Esto se llama CABEZA separada, porque HEAD apunta a algo que no sea una referencia de rama. Si realiza una confirmación en este estado, master, ya no estar apegado a HEAD, ya no se moverá contigo. No importa dónde esté ese compromiso. Podrías estar en el mismo compromiso que tu rama maestra, pero si HEAD apunta a la confirmación en lugar de a la rama, se separa y una nueva confirmación no se asociará con una referencia de rama.

Puede ver esto gráficamente si intenta el siguiente ejercicio. Desde un repositorio de git, ejecuta esto. Obtendrá algo ligeramente diferente, pero los bits clave estarán allí. Cuando sea el momento de verificar la confirmación directamente, simplemente use cualquier hash abreviado que obtenga de la primera salida (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, aquí hay una pequeña diferencia en la salida. 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 de CABEZA separada? HEAD todavía se refiere a una revisión específica que está asociada con el nombre de una rama. Aún estaban sobre la rama maestra, ¿no es así?

Ahora intenta:

git status
# HEAD detached at a3c485d

No. Estamos en estado de ‘CABEZA separada’.

Puede 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 haya revisado, esté donde esté. Normalmente, eso no es una confirmación, es una rama. Si HEAD lo hace apuntar 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) se han separado de esa rama. Dado que no tiene una rama adjunta a usted, la rama no lo seguirá a medida que realiza nuevas confirmaciones. HEAD, sin embargo, lo hará.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

objective c

Tutorial de Objective-C

gfg 200x200 min

Compilar un programa en C: – Detrás de escena