web-dev-qa-db-fra.com

Les tags Git s'appliquent-ils uniquement à la branche actuelle?

Je travaille actuellement avec un référentiel qui a plusieurs branches.

Lorsque je crée une étiquette, cette étiquette fait-elle référence à la branche actuelle?

En d'autres termes: chaque fois que je crée une balise, dois-je basculer sur la branche souhaitée et sur la balise à l'intérieur de cette branche pour que la balise fasse référence à cette branche à ce moment-là?

123
Gerardo

Si vous créez une étiquette, par exemple.

git tag v1.0

la balise fera référence à la dernière validation de la branche sur laquelle vous vous trouvez actuellement. Vous pouvez changer de branche et créer une étiquette à cet endroit.

Vous pouvez également simplement vous référer à l’autre branche lors du marquage,

git tag v1.0 name_of_other_branch

qui créera la balise correspondant au commit le plus récent de l’autre branche.

Ou vous pouvez simplement placer l’étiquette n’importe où, peu importe la branche, en faisant directement référence au SHA1 de certains commit.

git tag v1.0 <sha1>
123
Kalle Pokki

réponse de CharlesB et réponse de helmbert sont utiles, mais il m'a fallu un certain temps pour les comprendre. Voici une autre façon de le dire:

  • Une balise est un pointeur sur un commit , et les commits existent indépendamment des branches .
    • Il est important de comprendre que les tags n’ont pas de relation directe avec les branches - ils identifie uniquement un commit.
      • Ce commit peut être désigné à partir d’un nombre quelconque de branches - c’est-à-dire qu’il peut faire partie de l’historique d’un nombre quelconque de branches - y compris aucune.
    • Par conséquent, exécuter git show <tag> voir les détails d’une balise ne contient aucune référence à aucune branche, seul l’ID du commit sur lequel la balise pointe.
      • (Les ID de validation (noms d'objet.k.a. ou ID SHA-1) sont des chaînes de 40 caractères composées de chiffres hexadécimaux qui sont des hachages sur le contenu d'une validation; par exemple: 6f6b5997506d48fc6267b0b60c3f0261b6afe7a2)
  • Les branches entrent en jeu uniquement indirectement:
    • Au moment de créer une balise , par ce qui implique le commit que la balise indiquera :
      • Si vous ne spécifiez pas de cible pour une balise, la validation la plus récente de la branche en cours (par exemple, HEAD) est appliquée par défaut par exemple.:
        • git tag v0.1.0 # tags HEAD of *current* branch
      • Spécifier un nom de branche en tant que cible de la balise correspond par défaut à la validation la plus récente de cette branche; par exemple.:
        • git tag v0.1.0 develop # tags HEAD of 'develop' branch
      • (Comme d'autres l'ont noté, vous pouvez également spécifier explicitement un ID de validation en tant que cible de la balise.)
    • Si vous utilisez git describe pour décrire la branche actuelle:
      • git describe [--tags] décrit la branche actuelle en termes de commits depuis la dernière balise [éventuellement légère] dans l'historique de cette branche.
      • Ainsi, la balise référencée par git describe _ NE PEUT PAS refléter la dernière balise créée global.
153
mklement0

Les balises et les branches ne sont absolument pas liées, car les balises font référence à un commit spécifique et que branch est une référence mobile au dernier commit d'un historique. Les branches vont, les étiquettes restent.

Ainsi, lorsque vous marquez un commit, git se soucie peu de savoir quelle validation ou branche est extraite, si vous lui fournissez le SHA1 de ce que vous voulez taguer.

Je peux même taguer en me référant à une branche (elle étiquetera ensuite le bout de la branche), puis dire que le sommet de la branche est ailleurs (avec git reset --hard par exemple), ou supprimez la branche. Le tag que j'ai créé ne bougera cependant pas.

30
CharlesB

Lorsque vous appelez simplement git tag <TAGNAME> sans paramètres supplémentaires, Git créera une nouvelle étiquette à partir de votre HEAD actuel (c'est-à-dire le HEAD de votre branche actuelle).) cette branche, la branche HEAD suivra ces nouveaux commits, alors que la balise fait toujours référence au même commet.

Lorsque vous appelez git tag <TAGNAME> <COMMIT> vous pouvez même spécifier le commit à utiliser pour créer la balise.

Quoi qu'il en soit, une balise est toujours simplement un "pointeur" sur un certain commit (pas une branche).

5
helmbert

Nous pouvons créer un tag pour un commit passé:

git tag [tag_name] [reference_of_commit]

par exemple:

git tag v1.0 5fcdb03
3
Sana Hameed