Federico Heyninck
¿Cuál es la diferencia entre el HEAD
y master
en Git?
Hice un clon de un proyecto en GitHub y quiero enviar mis cambios al control remoto. Pero, ¿a cuál debo empujar?
Lee Netherton
master
es una referencia al final de una rama. Por convención, esta suele ser la rama de integración principal, pero no tiene por qué serlo. (A partir de git v2.28.0lanzado en julio de 2020, el nombre predeterminado cambió de master
a main
)
HEAD
es en realidad un tipo especial de referencia que apunta a otra referencia. Puede apuntar a master
/main
o puede que no (apuntará a cualquier rama que esté actualmente desprotegida). Si sabes que quieres comprometerte con el master
/main
rama entonces empujar a esto.
Aquí hay un ejemplo visual:
En su propio repositorio puede comprobar dónde está el HEAD
está apuntando al ejecutar esto:
$ git symbolic-ref HEAD
refs/heads/master
Sin embargo, averiguar dónde está el remotes/origin/HEAD
está apuntando es más complicado porque está en la máquina remota.
Hay un gran pequeño tutorial sobre las referencias de git aquí
-
+1 Respuesta más precisa que la mía. Consulte también stackoverflow.com/questions/3301956/… y stackoverflow.com/questions/3301956/… para ver ilustraciones sobre esos conceptos.
– VoC
8 de diciembre de 2010 a las 13:31
-
Nota:
HEAD
no se refiere necesariamente a una rama; la “temida” cabeza desprendida ocurre cuandoHEAD
se refiere a un compromiso que es no una cabeza de rama.– Chepner
9 de agosto de 2022 a las 15:08
-
about.gitlab.com/blog/2021/03/10/new-git-default-branch-name Esto es ahora
main
nomaster
. Demasiadas ediciones pendientes para cambiar el texto.– bvargo
13 de marzo a las 18:13
La respuesta simple es que HEAD
es un puntero/etiqueta a la confirmación más reciente de la rama en la que se encuentra actualmente. master
es la rama predeterminada creada cuando inicializaste un repositorio git (p. ej. git init
).
Puede eliminar el master
rama (por ejemplo git branch -D master
). No puede eliminar el HEAD
puntero.
-
“
HEAD
es un puntero/etiqueta para la confirmación más reciente de la rama en la que se encuentra actualmente”. comprometerse, ¿verdad?– LarsH
17/03/2016 a las 16:36
-
Estás en lo correcto. HEAD es tu última compra. Pero en mi defensa, para Git, el
checkout
El comando es el equivalente a cambiar de rama en otros sistemas SCM comunes.– benhorgen
01/04/2016 a las 19:38
-
Lo comprendo… Fácilmente podría haber cometido el mismo error. La única razón por la que me di cuenta fue porque estoy en la etapa de tratar de investigar qué significa realmente HEAD. ¿Hay alguna posibilidad de que puedas editar tu respuesta para que sea correcta? Considero que HEAD es un concepto difícil de encontrar descripciones precisas, para los no expertos en git como yo. Y tener consejos sentados en la web que dan incorrecto la información sobre HEAD lo hace un poco más difícil.
– LarsH
01/04/2016 a las 20:58
-
Creo que su comentario es una aclaración fantástica para cualquiera que busque una comprensión más precisa de lo que es Git.
HEAD
el puntero realmente lo es. Aprecio tu comentario y creo que otros también lo harán. El contenido de mi publicación original junto con su comentario de seguimiento se complementan entre sí. Gracias.– benhorgen
7 de abril de 2016 a las 1:53
-
Un tecnicismo, pero si verifica una confirmación anterior, ya no está ‘en’ una rama. Si revisa un compromiso en lugar de una rama, tiene lo que se llama un “CABEZA separado”, ya no está ‘en una rama’. Estar ‘en una rama’ significa que su HEAD hace referencia a una rama y, por definición, está en la confirmación más reciente de esa rama. El hecho de que haya verificado la confirmación ‘b54fe7’ y el maestro apunte a esa confirmación no significa que esté en la rama maestra. Podría haber varias ramas apuntando al mismo compromiso, estás ‘en’ el que apunta HEAD, si corresponde.
-Jason Goemaat
19 de noviembre de 2016 a las 6:05
VonC
Simplemente presione los cambios de su sucursal actual
git push origin
y empujará tu rama’B
‘ cambios a ‘origin/B
‘.
Si estás en tu master
rama, git empujará a origin/master
.
En realidad, impulsará todos los cambios en las sucursales locales que tienen sucursales remotas coincidentes en origin
. Está controlado por la configuración push.predeterminado.
Ver también empujando RefSpecs en el libro Pro Git.
Lo que está viendo es la barra lateral que representa todas las especificaciones de referencia de su repositorio remoto en el Bifurcación experimental de GitX del proyecto GitX.
El HEAD
designará la rama predeterminada para ese control remoto.
Ver git remote set-head
página man:
No es necesario tener una sucursal predeterminada para un control remoto, pero permite especificar el nombre del control remoto en lugar de una sucursal específica.
Por ejemplo, si la rama predeterminada paraorigin
se establece enmaster
entoncesorigin
puede especificarse donde normalmente especificaríaorigin/master
.