Si je veux marquer le commit actuel. 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?
Si je veux marquer le commit actuel. 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?
Réponses:
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), tandis qu'une balise sans annotations n'est qu'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, indiquez simplement un nom de balise". Il existe également différentes options pour écrire un message sur des balises annotées:
git tag <tagname>
, Git créera une balise à la révision actuelle mais ne vous demandera pas d'annotation. Il sera marqué 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 fournir un message.git tag -a -m <msg> <tagname>
, Git marquera 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 utiliser le message fourni.Fondamentalement, cela revient à savoir si vous souhaitez que la balise ait une annotation et d'autres informations associées ou non.
git tag -a <tag> -m ''
), mais une balise annotée a toujours un tagueur (auteur) et une date .
git push --follow-tags
, seules les balises annotées seront poussées.
Poussez les balises annotées, gardez la légèreté locale
man git-tag
dit:
Les balises annotées sont destinées à la publication tandis que les balises légères sont destinées aux étiquettes d'objets privés 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érents de la validation vers laquelle ils pointent. Vous pouvez donc les utiliser pour décrire une version sans effectuer de validation de version.
Les balises légères n'ont pas ces informations supplémentaires et n'en ont pas besoin, car vous ne les utiliserez que vous-même pour 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
qui contient un SHA-1
pour les balises légères, le SHA-1 pointe directement vers un commit:
git tag light
cat .git/refs/tags/light
imprime la même chose que le SHA-1 de la TETE.
Il n'est donc pas étonnant qu'ils ne puissent pas contenir d'autres métadonnées.
les balises annotées pointent vers un objet balise 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 balise annoté:
c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
puis nous pouvons obtenir son contenu avec:
git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
exemple de sortie:
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 c'est ainsi qu'il contient des métadonnées supplémentaires. Comme nous pouvons le voir sur la sortie, les champs de métadonnées sont:
Une analyse plus détaillée du format est présentée à: 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 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 casAfficher uniquement les balises légères: comment répertorier toutes les balises légères?
La grande différence est parfaitement expliquée ici .
Fondamentalement, les balises légères ne sont que des pointeurs vers des validations spécifiques. Aucune autre information n'est enregistrée ; d'autre part, les balises annotées sont des objets normaux , qui ont un auteur et une date et peuvent être référencés car ils ont leur propre clé SHA.
Si savoir qui a marqué quoi et quand est pertinent pour vous, utilisez des balises annotées. Si vous souhaitez simplement marquer un point spécifique de votre développement , peu importe qui et quand l'a fait, les balises légères sont suffisantes.
Normalement, vous opterez pour des balises annotées, mais cela dépend vraiment du maître Git du projet.