Estoy desarrollando un script de implementación para mi proyecto git y recién comencé a usar etiquetas. He agregado una nueva etiqueta llamada v2.0
:
git tag -a v2.0 -m "Launching version 2.0"
Y he enviado esta etiqueta al repositorio remoto
git push --tags
Cuando intento ejecutar el script de implementación y verifico la v2.0
etiqueta, aparece este mensaje:
Estás en estado de 'CABEZA separada' Puede mirar a su alrededor, realizar cambios experimentales y confirmarlos, y puede descartar cualquier confirmación que realice en este estado sin afectar ninguna rama al realizar otro pago. Si desea crear una nueva rama para retener las confirmaciones que crea, puede hacerlo (ahora o más adelante) utilizando -b con el comando de pago nuevamente. Ejemplo: git checkout -b new_branch_name HEAD ahora está en
¿Eso es normal? El repositorio está en el limbo porque si lo hago:
git branch
Me sale esta salida:
* (no branch)
master
Lo siento si esto es obvio, pero no pude resolverlo.
fuente
Respuestas:
Bien, primero unos pocos términos ligeramente simplificados.
En
git
, untag
(como muchas otras cosas) es lo que se llama un árbol . Es una forma de referirse a un punto en la historia del proyecto. Los treeishes pueden ser una etiqueta, un commit, un especificador de fecha, un especificador ordinal o muchas otras cosas.Ahora a
branch
es como una etiqueta pero es móvil. Cuando está "en" una rama y realiza una confirmación, la rama se mueve a la nueva confirmación que hizo, lo que indica su posición actual.Su
HEAD
es puntero a una rama que se considera "actual". Por lo general, cuando clona un repositorio,HEAD
señalará amaster
su vez que apuntará a una confirmación. Cuando haces algo asígit checkout experimental
, cambias elHEAD
punto para apuntar a laexperimental
rama que podría apuntar a una confirmación diferente.Ahora la explicación.
Cuando haces un
git checkout v2.0
, estás cambiando a un commit al que no apunta abranch
. ElHEAD
ahora está "separado" y no apunta a una rama. Si decide realizar una confirmación ahora (como puede), no hay un puntero de rama que actualizar para rastrear esta confirmación. Cambiar de nuevo a otra confirmación te hará perder esta nueva confirmación que has hecho. Eso es lo que te dice el mensaje.Por lo general, lo que puedes hacer es decir
git checkout -b v2.0-fixes v2.0
. Esto creará un nuevo puntero de rama en la confirmación señalada por el arboladov2.0
(una etiqueta en este caso) y luego cambiará suHEAD
punto para apuntar a eso. Ahora, si realiza commits, será posible rastrearlos (usando lav2.0-fixes
rama) y puede trabajar como lo haría normalmente. No hay nada "malo" con lo que has hecho, especialmente si solo quieres echar un vistazo alv2.0
código. Sin embargo, si desea realizar modificaciones allí de las que desea realizar un seguimiento, necesitará una rama.Deberías pasar un tiempo entendiendo todo el modelo DAG de git. Es sorprendentemente simple y deja todos los comandos bastante claros.
fuente
git reflog
. A menos que haya ocurrido la recolección de basura, es aparentemente "imposible" perder un compromiso.Si, es normal. Esto se debe a que comprueba una confirmación única, que no tiene una cabeza. Especialmente (tarde o temprano) no es la cabeza de ninguna rama.
Pero generalmente no hay problema con ese estado. Puede crear una nueva rama de la etiqueta, si esto lo hace sentir más seguro :)
fuente