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

si je veux marquer la propagation actuelle. Je connais les deux lignes de commande suivantes:

git tag <tagname>

et

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

Quelle est la différence entre ces commandes?

191
demandé sur Vadim Kotov 2012-07-17 03:30:54

3 réponses

TL; DR

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

En Savoir Plus Sur Les Étiquettes Légères

sauf si vous sélectionnez le drapeau-s pour une balise signée, la balise sera une balise légère, non signée par défaut. Il y a aussi quelques différences avec les étiquettes légères:

  • lorsque vous utilisez git tag <tagname> , Git créera une balise lors de la révision en cours mais ne vous demandera pas d'annotation. Il sera étiqueté sans message.
  • lorsque vous utilisez git tag -a <tagname> , Git vous demandera une annotation à moins que vous n'ayez également utilisé le drapeau-m pour fournir un message.
  • lorsque vous utilisez git tag -a -m <msg> <tagname> , Git étiquettera le commit et l'annotera avec le message.
  • lorsque vous utilisez git tag -m <msg> <tagname> , Git se comportera comme si vous aviez passé le drapeau-a pour l'annotation et utiliser le message fourni.

fondamentalement, cela revient à savoir si vous voulez que l'étiquette légère ait une annotation associée ou non.

148
répondu Todd A. Jacobs 2012-07-16 23:52:20

Push tags annotés, keep lightweight local

man git-tag dit:

Les étiquettes annotées

sont destinées à la publication tandis que les étiquettes légères sont destinées aux étiquettes d'objets privées ou temporaires.

et certains comportements les différencient de manière à ce que cette recommandation soit utile, par exemple:

  • les balises annotées peuvent contenir un message, un créateur, et une date différente de celle à laquelle elles pointent. Vous pouvez donc les utiliser pour décrire une version sans faire de propagation.

    étiquettes légères n'ont pas cette information supplémentaire, et n'en ont pas besoin, puisque vous allez seulement l'utiliser vous-même pour développer.

  • git push --suivez-tags ne feront que pousser annoté tags
  • git describe sans options de ligne de commande voit seulement des étiquettes annotées

"différences internes

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

  • pour les étiquettes légères, le SHA-1 pointe directement à un commit:

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

    imprime la même chose que le SHA-1 de la tête.

    il n'est donc pas étonnant qu'elles ne contiennent pas d'autres métadonnées.

  • les balises annotées pointent vers un objet tag dans la base de données des objets.

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

    contient le SHA de l'objet de la balise annotée:

    c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    et ensuite nous pouvons obtenir son contenu avec:

    git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
    

    sortie d'échantillon:

    object 4284c41353e51a07e4ed4192ad2e9eaada9c059f
    type commit
    tag annot
    tagger Ciro Santilli <your@mail.com> 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 à partir de la sortie, les champs de métadonnées:

    une analyse plus détaillée du format est disponible à: Quel est le format d'un objet git tag et comment calculer son SHA?

Bonus

121

la grande la différence est parfaitement expliquée ici .

fondamentalement, étiquettes légères sont juste des pointeurs à des commits spécifiques. Aucune autre information n'est enregistrée ; d'autre part, , annoté tags sont des objets , qui ont un auteur et une date et peuvent être mentionnés car ils ont leur propre clé SHA.

Si savoir qui étiqueté quoi et quand est pertinent pour vous, alors utilisez des étiquettes annotées. Si vous voulez simplement marquer un point spécifique dans votre développement , peu importe qui et quand a fait cela, alors étiquettes légères sont assez bons.

normalement, vous opteriez pour les étiquettes annotées, mais c'est au maître du projet de décider.

21
répondu Luis 2017-05-23 11:33:25