121 votos

Etiqueta GIT

Estoy desarrollando un script de despliegue para mi proyecto git y acabo de empezar a usar etiquetas, así que no soy ningún experto. He añadido una nueva etiqueta llamada v2.0:

git tag -a v2.0 -m "Launching version 2.0"

Y he empujado esta etiqueta al repositorio remoto

git push --tags

Cuando intento ejecutar el despliegue script y comprobar la etiqueta v2.0 me aparece este mensaje:

*Estás en estado de "cabeza desprendida". Puedes echar un vistazo, hacer cambios experimentales y commit, y puedes descartar cualquier commit que haga en este estado sin afectar a ninguna rama realizando otro checkout. Si quieres crear una nueva rama para retener los commit que ha creado, puede hacerlo (ahora o más tarde) utilizando -b con el comando checkout de nuevo. Ejemplo: git checkout -b nueva_rama_nombre HEAD es ahora at*

¿Es eso normal? El repositorio está en un limbo porque si lo hago:

git branch

Obtengo esta salida:

* (no branch)
  master

Lo siento si esto es obvio, pero no pude averiguarlo.

333voto

Noufal Ibrahim Puntos 32200

Bien, primero unos términos ligeramente simplificados.

En git , a tag (como muchas otras cosas) es lo que se llama un arbolito . Es una forma de referirse a un punto en la historia del proyecto. Los árboles pueden ser una etiqueta, un commit, un especificador de fecha, un especificador ordinal o muchas otras cosas.

Ahora un branch es igual que una etiqueta pero es móvil. Cuando estás "en" una rama y haces un commit, la rama se mueve a la nueva commit que hiciste indicando su posición actual.

Su HEAD es un puntero a una rama que se considera "actual". Normalmente, cuando se clona un repositorio, HEAD señalará a master que a su vez apuntará a un commit. Cuando se hace entonces algo como git checkout experimental , se cambia el HEAD para señalar el experimental rama que podría apuntar a un commit diferente.

Ahora la explicación.

Cuando se hace un git checkout v2.0 , está cambiando a un commit que no está apuntado por un branch . El HEAD está ahora "separado" y no apunta a una rama. Si decide hacer un commit ahora (como es posible), no hay ningún puntero de rama que actualizar para seguir este commit. Volver a otro commit te hará perder este nuevo commit que has hecho. Eso es lo que te dice el mensaje.

Normalmente, lo que se puede hacer es decir git checkout -b v2.0-fixes v2.0 . Esto creará un nuevo puntero de rama en el commit apuntado por el treeish v2.0 (una etiqueta en este caso) y luego desplazar su HEAD para señalar eso. Ahora, si haces commits, será posible rastrearlos (usando el v2.0-fixes rama) y puedes trabajar como lo harías habitualmente. No hay nada "malo" en lo que has hecho especialmente si sólo quieres echar un vistazo a la v2.0 código. Sin embargo, si quieres hacer alguna alteración allí que quieras rastrear, necesitarás una rama.

Deberías dedicar algo de tiempo a entender todo el modelo DAG de git. Es sorprendentemente simple y hace que todos los comandos sean bastante claros.

8voto

KingCrunch Puntos 45168

Sí, es normal. Esto se debe a que se hace un checkout de un solo commit, que no tiene cabeza. Especialmente no es (tarde o temprano) una cabeza de cualquier rama.

Pero no suele haber problemas con ese estado. Puedes crear una nueva rama desde la etiqueta, si esto te hace sentir más seguro :)

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X