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.
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.
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 :)