Diferencia entre HEAD y master

189

¿Cuál es la diferencia entre HEADy masteren Git?

Hice un clon de un proyecto en GitHub y quiero enviar mis cambios al control remoto. ¿Pero a cuál debo empujar?

captura de pantalla

Frederik Heyninck
fuente

Respuestas:

162

masteres una referencia al final de una rama. Por convención (y por defecto), esta suele ser la rama de integración principal, pero no tiene que ser así.

HEADen realidad es un tipo especial de referencia que apunta a otra referencia. Puede apuntar master o no (apuntará a la rama que esté actualmente desprotegida). Si sabe que quiere comprometerse con la masterrama, presione para esto.

Aquí hay un ejemplo visual:

texto alternativo

En su propio repositorio puede verificar hacia dónde HEADapunta apuntando esto:

$ git symbolic-ref HEAD
refs/heads/master

Sin embargo, descubrir hacia dónde remotes/origin/HEADapunta es más complicado porque está en la máquina remota.

Aquí hay un pequeño gran tutorial sobre referencias de git:

http://people.gnome.org/~federico/news-2008-11.html#pushing-and-pulling-with-git-1

Lee Netherton
fuente
1
+1 Respuesta más precisa que la mía. Consulte también stackoverflow.com/questions/3301956/… y stackoverflow.com/questions/3301956/… para obtener ilustraciones sobre esos conceptos.
VonC
37

La respuesta simple es que HEADes un puntero / etiqueta a la confirmación más reciente de la rama en la que se encuentra actualmente. masteres la rama predeterminada creada cuando inicializa un repositorio git (por ejemplo git init).

Puede eliminar la masterrama (por ejemplo git branch -D master). No puede eliminar el HEADpuntero.

benhorgen
fuente
66
" HEADes un puntero / etiqueta a la confirmación más reciente de la rama en la que se encuentra actualmente". Creo que esto es engañoso en el mejor de los casos. Si comprueba una confirmación anterior, HEAD ahora es un puntero a esa confirmación anterior, no a la confirmación más reciente. ¿Correcto?
LarsH
2
Estás en lo correcto. HEAD es tu último pago. Pero en mi defensa, para Git, el checkoutcomando es el equivalente a cambiar ramas en otros sistemas SCM comunes.
benhorgen 01 de
1
Simpatizo ... 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 intentar investigar qué significa realmente HEAD. ¿Alguna posibilidad de que puedas editar tu respuesta para que sea correcta? Creo que HEAD es un concepto difícil de encontrar descripciones precisas, para git no expertos como yo. Y tener consejos en la web que brindan información incorrecta sobre HEAD lo hace un poco más difícil.
LarsH
2
Creo que su comentario es una aclaración fantástica para cualquiera que busque una mejor comprensión de lo que HEADrealmente es el puntero Git . Agradezco 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
44
Un tecnicismo, pero si comprueba una confirmación anterior, ya no está 'en' una rama. Si desprotege un commit en lugar de una rama, tiene lo que se llama un "HEAD separado", ya no está "en una rama". Estar 'en una rama' significa que su HEAD está haciendo referencia a una rama y, por definición, está en la confirmación más reciente de esa rama. El hecho de que haya confirmado 'b54fe7' desprotegido, y los puntos maestros para ese compromiso, no significa que esté en la rama maestra. Podría haber varias ramas que apuntan a la misma confirmación, estás 'en' la que apunta HEAD, si corresponde.
Jason Goemaat
8

Simplemente presione los cambios de su sucursal actual

git push origin

y empujará su rama B"cambios a origin/B".
Si estás en tu masterrama, git lo presionará origin/master.
En realidad, empujará todos los cambios en las ramas locales que tienen ramas remotas coincidentes en origin. Está controlado por la configuración config push.default .
Vea también empujar RefSpecs en el libro Pro Git .


Lo que está viendo es la barra lateral que representa todas las especificaciones de su repositorio remoto en la bifurcación Experimental GitX del proyecto GitX .

texto alternativo

El HEADdesignará la rama predeterminada para ese control remoto.
Ver git remote set-headpágina del manual :

No es necesario tener una rama predeterminada para un control remoto, pero permite que se especifique el nombre del control remoto en lugar de una rama específica.
Por ejemplo, si la rama predeterminada para originse establece en master, entonces originse puede especificar donde sea que normalmente se especifique origin/master.

VonC
fuente