web-dev-qa-db-fra.com

L'extraction de la balise Git mène à "détaché HEAD état"

Je développe un script de déploiement pour mon projet git et je viens tout juste de commencer à utiliser des balises. J'ai ajouté une nouvelle balise appelée v2.0:

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

Et j'ai poussé cette balise vers le référentiel distant

git Push --tags

Lorsque j'essaie d'exécuter le script de déploiement et d'extraire la balise v2.0, je reçois le message suivant:

Vous êtes dans l'état 'détaché HEAD'. Vous pouvez regarder autour de vous, faire des modifications expérimentales et les valider, et vous pouvez annuler les commits que vous avez effectués dans cet état sans affecter les branches en effectuant une autre vérification. Si vous souhaitez créer une nouvelle branche à conserver avec les commits que vous créez, vous pouvez le faire (maintenant ou plus tard) en utilisant à nouveau -b avec la commande checkout. Exemple: git checkout -b new_branch_name HEAD est maintenant

Est-ce normal? Le référentiel est dans les limbes parce que si je le fais:

git branch

Je reçois cette sortie:

* (no branch)
  master

Désolé si cela est évident, mais je ne pouvais pas le comprendre.

159
Khriz

D'accord, tout d'abord quelques termes légèrement simplistes.

Dans git, un tag (comme beaucoup d'autres choses) est ce qu'on appelle un treeish . C'est une façon de faire référence à un moment de l'histoire du projet. Treeishes peut être une balise, une validation, un spécificateur de date, un spécificateur ordinal ou beaucoup d'autres choses.

Maintenant, un branch est comme une balise mais peut être déplacé. Lorsque vous êtes "sur" une branche et effectuez une validation, celle-ci est déplacée vers la nouvelle validation que vous avez effectuée en indiquant sa position actuelle.

Votre HEAD est un pointeur sur une branche considérée comme "courante". Habituellement, lorsque vous clonez un référentiel, HEAD désignera master, qui à son tour désignera un commit. Lorsque vous faites ensuite quelque chose comme git checkout experimental, vous commutez la HEAD pour qu'elle pointe vers la branche experimental qui peut indiquer une validation différente.

Maintenant l'explication.

Lorsque vous faites un git checkout v2.0, vous passez à un commit qui n'est pas signalé par un branch. La HEAD est maintenant "détachée" et ne pointe pas vers une branche. Si vous décidez de faire une validation maintenant (comme vous le pouvez), il n'y a pas de pointeur de branche à mettre à jour pour suivre cette validation. Revenir à un autre commit vous fera perdre ce nouveau commit que vous avez fait. C'est ce que le message vous dit.

Habituellement, vous pouvez dire git checkout -b v2.0-fixes v2.0. Cela créera un nouveau pointeur de branche à la validation indiquée par le treeish v2.0 (une balise dans ce cas-ci), puis décalera votre HEAD vers cette flèche. Maintenant, si vous faites des commits, il sera possible de les suivre (en utilisant la branche v2.0-fixes) et vous pourrez travailler comme vous le feriez habituellement. Il n’ya rien de mal à ce que vous avez fait, surtout si vous voulez simplement jeter un coup d’œil au code v2.0. Toutefois, si vous souhaitez effectuer des modifications que vous souhaitez suivre, vous aurez besoin d’une branche.

Vous devriez passer un peu de temps à comprendre l’ensemble du modèle DAG de git. C'est étonnamment simple et rend toutes les commandes assez claires.

414
Noufal Ibrahim

Oui c'est normal En effet, vous ne payez qu'un seul commit, qui n'a pas de tête. Surtout ce n'est (tôt ou tard) pas une tête d'aucune branche.

Mais il n'y a généralement aucun problème avec cet état. Vous pouvez créer une nouvelle branche à partir de la balise, si cela vous rassure :)

12
KingCrunch