web-dev-qa-db-fra.com

Quelle est la différence entre une étiquette annotée et une étiquette non annotée?

Si je veux marquer le commit en cours. Je sais que les deux lignes de commande suivantes fonctionnent:

git tag <tagname>

et

git tag -a <tagname> -m '<message>'

Quelle est la différence entre ces commandes?

254
user462301

TL; DR

La différence entre les commandes est que l'une vous fournit un message de balise alors que l'autre ne le fait pas. Une balise annotée contient un message qui peut être affiché avec git-show (1), tandis qu'une balise sans annotations est simplement un pointeur nommé vers une validation.

En savoir plus sur les balises légères

Selon la documentation : "Pour créer une balise légère, ne fournissez aucune des options -a, -s ou -m, fournissez simplement un nom de balise". Il existe également différentes options pour écrire un message sur les étiquettes annotées:

  • Lorsque vous utilisez git tag <tagname>, Git créera une balise pour la révision actuelle, mais ne vous demandera pas d'annotation. Il sera étiqueté sans message (il s’agit d’une balise légère).
  • Lorsque vous utilisez git tag -a <tagname>, Git vous demandera une annotation, sauf si vous avez également utilisé l'indicateur -m pour envoyer un message.
  • Lorsque vous utilisez git tag -a -m <msg> <tagname>, Git balisera le commit et l'annotera avec le message fourni.
  • Lorsque vous utilisez git tag -m <msg> <tagname>, Git se comportera comme si vous aviez passé l'indicateur -a pour l'annotation et utilisiez le message fourni.

En gros, cela revient à savoir si vous souhaitez que la balise soit associée à une annotation et à d’autres informations.

195
Todd A. Jacobs

Poussez les balises annotées, conservez la légèreté locale

man git-tag dit:

Les étiquettes annotées sont destinées à être publiées, tandis que les étiquettes légères sont destinées aux étiquettes d'objets privés ou temporaires.

Et certains comportements les différencient de telle manière que cette recommandation est utile, par exemple:

  • les balises annotées peuvent contenir un message, un créateur et une date différente de celle du commit sur lequel elles pointent. Vous pouvez donc les utiliser pour décrire une version sans effectuer de validation.

    Les balises légères n'ont pas cette information supplémentaire, et n'en ont pas besoin, puisque vous ne l'utiliserez que pour vous développer.

  • git Push --follow-tags ne poussera que les tags annotés
  • git describe sans options de ligne de commande ne voit que les balises annotées

Différences internes

  • les balises légères et annotées sont un fichier sous .git/refs/tags contenant un SHA-1

  • pour les tags légers, le SHA-1 pointe directement sur un commit:

    git tag light
    cat .git/refs/tags/light
    

    imprime le même que le SHA-1 de HEAD.

    Il n’est donc pas étonnant qu’ils ne puissent contenir aucune autre métadonnée.

  • les étiquettes annotées pointent sur un objet étiquette dans la base de données d'objets.

    git tag -as -m msg annot
    cat .git/refs/tags/annot
    

    contient le SHA de l'objet tag annoté:

    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    et alors nous pouvons obtenir son contenu avec:

    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    exemple de sortie:

    object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
    type commit
    tag annot
    tagger Ciro Santilli <[email protected]> 1411478848 +0200
    
    msg
    -----BEGIN PGP SIGNATURE-----
    Version: GnuPG v1.4.11 (GNU/Linux)
    
    <YOUR PGP SIGNATURE>
    -----END PGP SIGNAT
    

    Et voici comment il contient des métadonnées supplémentaires. Comme nous pouvons le voir à la sortie, les champs de métadonnées sont:

    Une analyse plus détaillée du format est présente à l'adresse suivante: Quel est le format d'un objet tag git et comment calculer son SHA?

Bonus

  • Déterminez si une balise est annotée:

    git cat-file -t tag
    

    Les sorties

    • commit pour poids léger, puisqu'il n'y a pas d'objet tag, il pointe directement sur le commit
    • tag pour annoté, car il y a un objet tag dans ce cas
  • Liste seulement les tags légers: Comment puis-je lister tous les tags légers?

La grosse différence est parfaitement expliquée ici .

Fondamentalement, les balises légères ne sont que des pointeurs sur des commits spécifiques. Aucune autre information n'est enregistrée ; d’autre part, les balises annotées sont des objets réguliers , qui ont un auteur et une date et peuvent être référés car ils ont leur propre clé SHA.

Si vous savez qui a étiqueté quoi et ) lorsque vous concerne, utilisez des balises annotées. Si vous souhaitez simplement baliser un point spécifique de votre développement , peu importe qui et quand l'a fait, les balises légères suffisent.

Normalement, vous utiliseriez des balises annotées, mais cela dépend vraiment du maître Git du projet.

33
Luis