Les balises Git s'appliquent-elles uniquement à la branche actuelle?


157

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

Lorsque je crée une balise, cette balise fait-elle référence à la branche alors en cours?

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

Réponses:


152

Si vous créez une balise par exemple

git tag v1.0

la balise fera référence au commit le plus récent de la branche sur laquelle vous vous trouvez actuellement. Vous pouvez changer de branche et y créer une balise.

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 du commit le plus récent de l'autre branche.

Ou vous pouvez simplement placer la balise n'importe où, quelle que soit la branche, en vous référant directement au SHA1 de certains commit

git tag v1.0 <sha1>

202

La réponse de CharlesB et la réponse de helmbert sont à la fois 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 vers un commit et les commits existent indépendamment des branches .
    • Il est important de comprendre que les balises n'ont pas de relation directe avec les branches - elles n'identifient jamais qu'un commit .
      • Ce commit peut être pointé depuis n'importe quel nombre de branches - c'est-à-dire qu'il peut faire partie de l'historique de n'importe quel nombre de branches - y compris aucune.
    • Par conséquent, l'exécution git show <tag>pour voir les détails d'une balise ne contient aucune référence à des branches, uniquement l'ID du commit vers lequel pointe la balise.
      • (ID Commit (aka noms d'objets ou ID SHA-1) sont des chaînes de 40 caractères composés de chiffres hex qui hash sur le contenu d'un commis, par exemple. 6f6b5997506d48fc6267b0b60c3f0261b6afe7a2)
  • Les succursales n'interviennent qu'indirectement :
    • Au moment de la création d' une balise , en impliquant le commit vers lequel la balise pointera :
      • Ne pas spécifier de cible pour une balise par défaut est le commit le plus récent de la branche actuelle (aka HEAD); par exemple:
        • git tag v0.1.0 # tags HEAD of *current* branch
      • La spécification d'un nom de branche comme cible de la balise par défaut est la dernière validation 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 comme cible de la balise.)
    • Lors de l'utilisation git describepour décrire la branche actuelle:
      • git describe [--tags] décrit la branche actuelle en termes de commits depuis la balise la plus récente [éventuellement légère] de l'historique de cette branche .
      • Ainsi, la balise référencée par git describepeut NE PAS refléter la balise la plus récemment créée dans son ensemble .

Donc, pour une balise donnée (par exemple, v0.1.0), pour savoir quelle source réelle se trouve dans une version réelle (de cette source), vous avez vraiment besoin de connaître la branche sur laquelle la construction était basée, non? C'est-à-dire qu'un commit donné peut avoir différents descendants dans différentes branches, non?
Hawkeye Parker

2
@HawkeyeParker: Je ne suis plus plongé dans cela, mais vous ne devriez pas avoir besoin de connaître la branche, car une balise identifie un commit spécifique (qui peut faire partie de plusieurs branches), et vous pouvez enquêter à partir de là.
mklement0

Mais si je fais git show [tagname], alors il montre un nom de branche au-dessus de Author et Date, ce qui contredit "l'exécution de git show <tag> pour voir les détails d'une balise ne contient aucune référence à des branches"
Brad Thomas

39

Les balises et la branche sont totalement indépendantes, car les balises font référence à un commit spécifique, et la branche est une référence mobile au dernier commit d'un historique. Les succursales disparaissent, les balises restent.

Donc, lorsque vous marquez un commit, git ne se soucie pas du commit ou de la branche qui est extrait, si vous lui fournissez le SHA1 de ce que vous voulez étiqueter.

Je peux même taguer en faisant référence à une branche (il marquera alors la pointe de la branche), et dire plus tard que la pointe de la branche est ailleurs (avec git reset --hardpar exemple), ou supprimer la branche. La balise que j'ai créée ne bougera cependant pas.


17
En d'autres termes, les balises ne sont que de jolis noms pour les horribles hachages git. La balise (et le hachage) existe quelles que soient les branches existantes (ed).
C-Otto

8

Lors d'un appel git tag <TAGNAME>sans aucun paramètre supplémentaire, Git créera une nouvelle balise à partir de votre HEAD actuelle (c'est-à-dire la HEAD de votre branche actuelle). Lors de l'ajout de commits supplémentaires dans cette branche, la branche HEAD suivra ces nouveaux commits, tandis que la balise se réfère toujours au même commit.

Lors de l'appel, git tag <TAGNAME> <COMMIT>vous pouvez même spécifier quel commit utiliser pour créer la balise.

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


6

Nous pouvons créer une balise pour un commit passé:

git tag [tag_name] [reference_of_commit]

par exemple:

git tag v1.0 5fcdb03

1

Si vous souhaitez marquer la branche dans laquelle vous vous trouvez, saisissez:

git tag <tag>

et poussez la branche avec:

git push origin --tags

0

Si vous souhaitez créer une balise à partir d'une branche qui ressemble à release/yourbranchetc., vous devez utiliser quelque chose comme

git tag YOUR_TAG_VERSION_OR_NAME origin/release/yourbranch

Après avoir créé la balise appropriée si vous souhaitez pousser la balise à distance, utilisez la commande

git push origin YOUR_TAG_VERSION_OR_NAME
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.