Diferencia entre HEAD y master (o principal)

4 minutos de lectura

Avatar de usuario de Frederik Heyninck
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?

captura de pantalla

Avatar de usuario de Lee Netherton
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:

texto alternativo

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 cuando HEAD 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 no master. 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

Avatar de usuario de VonC
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.

texto alternativo

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 para origin se establece en masterentonces origin puede especificarse donde normalmente especificaría origin/master.

¿Ha sido útil esta solución?