Tags et releases#
Les tags sont des marqueurs que l’on pose sur des points précis de l’historique pour les identifier de manière permanente. Ils servent typiquement à repérer les versions publiées d’un logiciel – v1.0, v2.3.1, etc. – mais aussi tout jalon significatif du projet. Contrairement aux branches, qui avancent automatiquement à chaque nouveau commit, un tag reste figé sur le commit qu’il désigne. C’est cette immobilité qui fait sa valeur : un tag est une référence stable et immuable.
Ce chapitre couvre les deux types de tags proposés par Git, les commandes de gestion associées, le versionnement sémantique (SemVer), la commande git describe et le lien entre tags et releases sur les plateformes d’hébergement.
Versionnement sémantique (SemVer)#
Définition 54 (Versionnement sémantique (SemVer))
Le versionnement sémantique (Semantic Versioning, abrege SemVer) est une convention de nommage des versions sous la forme MAJOR.MINOR.PATCH, où chaque composante a une signification précise :
MAJOR : incrémente lors de changements incompatibles avec les versions précédentes (breaking changes). Les utilisateurs devront potentiellement adapter leur code.
MINOR : incrémente lors de l’ajout de nouvelles fonctionnalités qui restent rétrocompatibles. Le code existant continue de fonctionner.
PATCH : incrémente lors de corrections de bugs rétrocompatibles. Aucune fonctionnalité nouvelle, uniquement des réparations.
Par exemple, 2.3.7 signifie la 2e génération majeure, la 3e version mineure de cette génération, et le 7e correctif de cette version mineure.
Voici comment les numéros de version évoluent en pratique :
1.0.0→1.0.1: correction d’un bug (PATCH)1.0.1→1.1.0: ajout d’une fonctionnalité (MINOR), le compteur PATCH revient à 01.1.0→2.0.0: changement incompatible (MAJOR), MINOR et PATCH reviennent à 0
Pour les versions en cours de développement, SemVer prévoit des suffixes de pre-release :
2.0.0-alpha.1: version alpha (fonctionnalités incomplêtes)2.0.0-beta.1: version beta (fonctionnalités complêtes, tests en cours)2.0.0-rc.1: release candidate (derniers tests avant publication)
Remarque 54
SemVer est une convention, pas un mécanisme imposé par Git. Rien n’empèche de nommer un tag banane-42 si on le souhaite. Mais suivre SemVer rend le versionnement prévisible pour les utilisateurs et les outils : un gestionnaire de paquets comme pip ou npm peut déterminer automatiquement si une mise à jour est sûre en se basant sur les numéros de version.
Visualisation : progression des versions#
Git describe#
Définition 55 (git describe)
La commande git describe identifie le commit courant par rapport au tag annoté le plus proche qui lui est accessible dans l’historique. Elle produit un identifiant de la forme :
v1.2.3-5-gabcdef
où :
v1.2.3est le nom du tag le plus proche,5est le nombre de commits effectués depuis ce tag,gabcdefest le hash abrégé du commit courant (préfixé pargpour git).
Si le commit courant porte exactement un tag, la commande retourne simplement le nom du tag (par exemple v1.2.3).
Cette commande est particulièrement utile pour le versionnement automatique des builds : elle génère un identifiant unique et lisible qui situe le code par rapport à la dernière version publiée.
%%bash
cd /tmp/demo-tags
echo "=== git describe sur le commit actuel (qui porte un tag) ==="
git describe
echo ""
# Ajouter quelques commits après le dernier tag
echo "nouveau code" > nouveau.py
git add nouveau.py && git commit -m "Ajouter nouveau.py"
echo "encore du code" >> nouveau.py
git add nouveau.py && git commit -m "Améliorer nouveau.py"
echo "=== git describe après deux commits supplémentaires ==="
git describe
echo ""
echo "=== git describe --long (format long, même si on est sur un tag) ==="
git describe --long
=== git describe sur le commit actuel (qui porte un tag) ===
v1.0
[main b74a3b6] Ajouter nouveau.py
1 file changed, 1 insertion(+)
create mode 100644 nouveau.py
[main 90ca3d9] Améliorer nouveau.py
1 file changed, 1 insertion(+)
=== git describe après deux commits supplémentaires ===
v1.0-2-g90ca3d9
=== git describe --long (format long, même si on est sur un tag) ===
v1.0-2-g90ca3d9
Remarque 55
Par défaut, git describe ne considère que les tags annotés. Pour inclure également les tags légers dans la recherche, il faut ajouter l’option --tags. C’est une raison supplémentaire de privilégier les tags annotés pour les releases : ils sont reconnus par git describe sans option supplémentaire.
Releases sur GitHub et GitLab#
Sur les plateformes comme GitHub ou GitLab, les releases sont construites à partir des tags. La plateforme ajoute au tag des fonctionnalités supplémentaires : notes de version en Markdown, artefacts binaires à télécharger, et marquage pre-release ou latest. Pour préparer les notes de version, on génère typiquement la liste des commits entre deux tags.
%%bash
cd /tmp/demo-tags
echo "=== Commits entre v1.0 et v2.0-beta.1 ==="
git log --oneline v1.0..v2.0-beta.1
=== Commits entre v1.0 et v2.0-beta.1 ===
Remarque 56
Pour des changelogs plus élaborés, on peut enrichir la commande :
git log --oneline --no-merges v1.0..v2.0pour exclure les commits de fusion.git log --format="- %s (%h)" v1.0..v2.0pour produire une liste à puces avec messages et hashs abrégés.git shortlog -sne v1.0..v2.0pour un résumé par auteur, utile pour les crédits.
Adopter une convention de messages de commit (comme Conventional Commits) permet la génération automatique de changelogs structurés.
Exemple 16 (Workflow typique de release)
Les étapes habituelles pour publier une version sont :
S’assurer que tous les tests passent sur la branche
main.Créer un tag annoté :
git tag -a v1.2.0 -m "Version 1.2.0".Pousser le tag :
git push origin v1.2.0.Sur GitHub/GitLab, créer une release à partir du tag avec les notes de version.
Ce workflow peut être automatisé avec des pipelines CI/CD qui détectent la création d’un tag et déclenchent la publication.
Résumé#
Le tableau suivant récapitule les principales commandes liées aux tags.
Commande |
Description |
|---|---|
|
Créer un tag léger sur le commit courant |
|
Créer un tag annoté avec un message |
|
Lister tous les tags |
|
Filtrer les tags par motif glob |
|
Tagger un commit passé |
|
Supprimer un tag localement |
|
Pousser un tag spécifique vers le distant |
|
Pousser tous les tags vers le distant |
|
Supprimer un tag sur le distant |
|
Afficher les détails d’un tag |
|
Identifier le commit par rapport au tag le plus proche |
|
Idem, en incluant les tags légers |
|
Lister les commits entre deux tags |