La comprobación de la etiqueta Git lleva a " estado de CABEZA separado"


Estoy desarrollando un script de implementación para mi proyecto git y acabo de empezar a usar etiquetas. He añadido 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 compruebo la etiqueta v2.0 recibo este mensaje:

Estás en un estado de "CABEZA separada". Puedes mirar a tu alrededor, hacer cambios experimentales y confirmarlos, y puedes descartar cualquier confirmación usted hace en este estado sin impactar cualquier rama al realizar otra caja. Si quieres crear una nueva rama para retener commits usted crea, puede hacerlo (ahora o más tarde) mediante el uso de-b con el pago comando de nuevo. Ejemplo: git checkout-b new_branch_name HEAD es ahora at

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

git branch

Obtengo esta salida:

* (no branch)
  master

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

Author: Steven Vascellaro, 2011-04-07

2 answers

Bien, primero unos pocos términos ligeramente simplificados.

En git, a tag (como muchas otras cosas) es lo que se llama a treeish. Es una forma de referirse a un punto de la historia del proyecto. Treeishes puede ser una etiqueta, un commit, un especificador de fecha, un especificador ordinal o muchas otras cosas.

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

Su HEAD es puntero a una rama que se considera "actual". Normalmente cuando clonas un repositorio, HEAD apuntará a master que a su vez apuntará a un commit. Cuando luego haces algo como git checkout experimental, cambias el HEAD para apuntar a la rama experimental 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 que no es apuntado por un branch. El HEAD ahora está "separado" y no señala a una rama. Si decides hacer un commit ahora (como puedas), no hay ningún puntero de rama que actualizar para rastrear este commit. Cambiar de nuevo a otro commit te hará perder este nuevo commit que has hecho. Eso es lo que el mensaje te está diciendo.

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 apuntada por el treeish v2.0 (una etiqueta en este caso) y luego cambiará su HEAD para apuntar a eso. Ahora, si haces commits, será posible haz un seguimiento de ellos (usando la rama v2.0-fixes) y podrás trabajar como lo harías normalmente. No hay nada "malo" con lo que has hecho, especialmente si solo quieres echar un vistazo al código v2.0. Sin embargo, si desea realizar algún cambio allí que desee rastrear, necesitará una rama.

Deberías pasar algún tiempo entendiendo todo el modelo DAG de git. Es sorprendentemente simple y hace que todos los comandos sean bastante claros.

 395
Author: Noufal Ibrahim,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-03 02:54:41

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

Pero normalmente no hay problema con ese estado. Puedes crear una nueva rama a partir de la etiqueta, si esto te hace sentir más seguro:)

 11
Author: KingCrunch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-04-07 13:56:11