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?
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.
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:
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).git tag -a <tagname>
, Git vous demandera une annotation, sauf si vous avez également utilisé l'indicateur -m pour envoyer un message.git tag -a -m <msg> <tagname>
, Git balisera le commit et l'annotera avec le message fourni.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.
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 describe
sans options de ligne de commande ne voit que les balises annotéesDiffé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 committag
pour annoté, car il y a un objet tag dans ce casListe 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.