Aller au contenu
Développement medium

Tags Git : versionner et publier vos releases

11 min de lecture

Les tags Git marquent un point précis de l'historique, typiquement une release. Contrairement aux branches (qui bougent à chaque commit), un tag est un pointeur fixe vers un commit spécifique. Ce guide vous apprend à créer, gérer et pousser des tags, en suivant les conventions du Semantic Versioning.

Prérequis : enregistrer des modifications et consulter l'historique.

  • La différence entre tags légers et tags annotés
  • Créer, lister, supprimer des tags
  • Pousser des tags vers un dépôt distant
  • Adopter le Semantic Versioning (SemVer)

Git propose deux types de tags, et la différence n'est pas cosmétique. Un tag léger est un simple pointeur vers un commit, rien d'autre. Un tag annoté est un véritable objet Git stocké dans le dépôt, avec son auteur, sa date, son message et la possibilité d'une signature GPG. C'est cette traçabilité qui en fait la forme attendue pour une release : on sait qui a publié la version et quand. Réservez le tag léger aux repères de travail que vous ne pousserez pas.

TypeContenuUsage
Tag légerPointeur simple vers un commit, sans métadonnéesMarquage temporaire, usage local
Tag annotéObjet Git complet : auteur, date, message, signable GPGRecommandé pour les releases

C'est la forme recommandée pour les releases :

Fenêtre de terminal
git tag -a v1.0.0 -m "Première version stable"
  • -a : créer un tag annoté
  • -m : le message associé (comme pour un commit)

Vérification :

Fenêtre de terminal
git show v1.0.0

Sortie attendue :

tag v1.0.0
Tagger: Stéphane ROBERT <stephane@example.com>
Date: Fri Mar 28 14:30:00 2026 +0100
Première version stable
commit 3f7a2b1c8e9d4f5a6b7c8d9e0f1a2b3c4d5e6f7a (HEAD -> main, tag: v1.0.0)
Author: Stéphane ROBERT <stephane@example.com>
Date: Fri Mar 28 14:30:00 2026 +0100
Ajout de la page de contact

Le tag annoté stocke le nom du tagger, la date et le message en plus de pointer vers le commit.

Pour un marquage rapide sans métadonnées :

Fenêtre de terminal
git tag v1.0.0-beta

Pas de -a, pas de -m. Le tag pointe simplement vers le commit courant, sans information supplémentaire.

Vous avez oublié de tagger au moment du commit ? Pas de problème :

Fenêtre de terminal
git log --oneline -5
3f7a2b1 Ajout de la page de contact
a1b2c3d Correction du bug d'affichage
9c8d7e6 Refactoring du CSS
f5e4d3c Ajout de la page d'accueil
1a2b3c4 Initial commit

Taggez un commit spécifique :

Fenêtre de terminal
git tag -a v0.9.0 -m "Version beta" a1b2c3d

Au fil des releases, la liste des tags devient votre table des matières des versions. Trois variantes de la commande couvrent les besoins courants : la liste brute, le filtrage par motif pour ne voir qu'une série de versions, et l'affichage des messages pour retrouver le contexte de chaque release sans ouvrir chaque tag.

Fenêtre de terminal
git tag

Sortie attendue :

v0.9.0
v1.0.0
v1.0.0-beta

Filtrer par pattern :

Fenêtre de terminal
git tag -l "v1.*"
v1.0.0
v1.0.0-beta

Pour voir les tags avec leurs messages :

Fenêtre de terminal
git tag -n
v0.9.0 Version beta
v1.0.0 Première version stable
v1.0.0-beta Ajout de la page de contact

Pour un tag annoté, git tag -n affiche son message d'annotation. Pour un tag léger, qui n'en a pas, il affiche à la place le résumé du commit pointé, ici Ajout de la page de contact. C'est une autre raison de préférer les tags annotés pour les releases : leur description ne dépend pas du message de commit.

Par défaut, git push ne pousse pas les tags. Il faut le faire explicitement.

C'est la forme à privilégier au quotidien : vous poussez la version que vous venez de créer, et rien d'autre, ce qui évite de publier par mégarde des tags de test restés en local.

Fenêtre de terminal
git push origin v1.0.0
Fenêtre de terminal
git push origin --tags

Supprimer le tag en local ne touche pas le dépôt distant : si le tag y a déjà été poussé, il y reste jusqu'à une suppression explicite, traitée juste après.

Fenêtre de terminal
git tag -d v1.0.0-beta

La suppression distante mérite prudence : d'autres personnes ont peut-être déjà récupéré ce tag, et le retirer ne l'efface pas de leurs clones. Réservez cette opération aux tags publiés par erreur, jamais à une release que d'autres consomment déjà.

Fenêtre de terminal
git push origin --delete v1.0.0-beta

Ou avec la syntaxe refspec :

Fenêtre de terminal
git push origin :refs/tags/v1.0.0-beta

Nommer ses versions au hasard rend impossible de savoir, d'un coup d'œil, si une mise à jour est risquée. Le Semantic Versioning répond à ce besoin en codant l'impact du changement dans le numéro lui-même : à la lecture de v1.4.2, un utilisateur sait que passer à v1.5.0 n'introduit rien de cassant, alors que v2.0.0 exigera une migration. Ce sont ces trois chiffres, et ce qu'ils promettent, que détaille le tableau ci-dessous.

vMAJEUR.MINEUR.PATCH
ComposantQuand l'incrémenterExemple
MAJEURChangement incompatible (breaking change)v1.0.0v2.0.0
MINEURNouvelle fonctionnalité rétrocompatiblev1.0.0v1.1.0
PATCHCorrection de bug rétrocompatiblev1.0.0v1.0.1

Cette progression illustre le cycle de vie typique d'un projet. Notez la frontière du v1.0.0 : tant que le numéro majeur reste à zéro, la convention autorise des changements cassants entre versions mineures, car l'API n'est pas encore figée. Passer à v1.0.0 est donc un engagement, celui de ne plus casser la compatibilité sans incrémenter le numéro majeur.

v0.1.0 → Première version utilisable (pas encore stable)
v0.2.0 → Ajout d'une fonctionnalité
v0.2.1 → Correction d'un bug
v1.0.0 → Première release stable (API publique figée)
v1.1.0 → Nouvelle fonctionnalité rétrocompatible
v2.0.0 → Breaking change (migration requise)
v1.0.0-alpha → Version très préliminaire
v1.0.0-beta → Version de test
v1.0.0-rc.1 → Release Candidate 1
v1.0.0 → Version stable

Voici l'enchaînement à reproduire pour chaque version publiée. L'ordre a son importance : on vérifie que l'arbre de travail est propre avant de tagger, on crée un tag annoté, puis on le pousse explicitement, car git push seul laisserait le tag en local. La dernière étape confirme, côté serveur, que la release est bien visible pour les autres.

  1. Vérifiez que tout est propre

    Fenêtre de terminal
    git status
    git log --oneline -5
  2. Créez le tag annoté

    Fenêtre de terminal
    git tag -a v1.2.0 -m "Ajout de l'authentification OAuth"
  3. Poussez le tag

    Fenêtre de terminal
    git push origin v1.2.0
  4. Vérifiez sur le remote

    Fenêtre de terminal
    git ls-remote --tags origin

La plupart des soucis avec les tags se ramènent à deux causes : un tag non poussé, qui reste invisible sur la forge, et un tag placé sur le mauvais commit, car il pointe par défaut sur HEAD au moment de sa création. Le tableau associe chaque symptôme à sa cause et à la commande de correction.

SymptômeCause probableSolution
error: tag 'v1.0.0' already existsUn tag avec ce nom existe déjàSupprimez-le d'abord (git tag -d v1.0.0) ou utilisez un autre nom
Les tags n'apparaissent pas sur GitHub/GitLabTags non poussésgit push origin --tags
git describe affiche un résultat inattenduPas de tag annoté dans l'historiquegit describe cherche les tags annotés par défaut. Utilisez --tags pour inclure les légers
Tag sur le mauvais commitLe tag pointe vers HEAD au moment de la créationSupprimez-le et recréez-le sur le bon commit : git tag -a v1.0.0 SHA
SituationTag recommandéCommande
Release publique (v1.0.0, v2.3.1...)Annotégit tag -a v1.0.0 -m "..."
Marquer un point de repère temporaireLégergit tag wip-avant-refacto
Tag qui sera poussé et visible sur GitHub/GitLabAnnotégit tag -a
Tag local uniquement, jamais pousséLégergit tag
Release avec signature GPGAnnoté + signégit tag -s v1.0.0 -m "..."

En pratique : utilisez toujours le tag annoté sauf pour les repères temporaires. git describe et les plateformes comme GitHub reconnaissent les tags annotés en priorité pour les releases.

  • Tags annotés (git tag -a) sont recommandés pour les releases : ils contiennent auteur, date et message
  • Tags légers sont de simples pointeurs, pour un usage temporaire
  • git push ne pousse pas les tags automatiquement, utilisez git push origin --tags ou --follow-tags
  • Semantic Versioning (MAJEUR.MINEUR.PATCH) est la convention standard
  • Utilisez git tag -d en local et git push --delete pour le remote

Ce site vous est utile ?

Sachez que moins de 1% des lecteurs soutiennent ce site.

Je maintiens +700 guides gratuits, sans pub ni tracking. Un soutien, même symbolique, m'aide à couvrir l'hébergement et à garder ces ressources gratuites. Merci pour votre appui.

Le formulaire ne s'affiche pas ? Ouvrir Ko-fi dans un onglet.

Abonnez-vous et suivez mon actualité DevSecOps sur LinkedIn