Da Anonimo (non verificato) , 29 Aprile 2026

Introduzione

I tag sono riferimenti nominati a commit specifici. A differenza dei branch, i tag non sono pensati per muoversi. Sono perfetti per marcare release (v1.0.0) e altri punti storici.

Due tipi di tag

  • Lightweight: solo un ref che punta a un commit. Nessun metadato.
  • Annotated: un oggetto Git completo con tagger, data, messaggio e firma GPG opzionale. Usali per le release.

Creare i tag

git tag v1.0.0                          # lightweight
git tag -a v1.0.0 -m "First stable release"   # annotated
git tag -s v1.0.0 -m "Signed release"         # firmato GPG

Per impostazione predefinita i tag si attaccano a HEAD. Per taggare un commit specifico:

git tag -a v0.9.0 a1b2c3d -m "Beta"

Elencare e ispezionare

git tag
git tag -l "v1.*"
git show v1.0.0
git tag -l --format='%(refname:short) %(taggerdate:short) %(subject)'

Pushare i tag

I tag non vengono pushati per default:

git push origin v1.0.0
git push origin --tags                # tutti i tag
git push --follow-tags                # solo tag raggiungibili dai commit pushati

--follow-tags è il default consigliato per le pipeline di rilascio.

Cancellare i tag

git tag -d v1.0.0                     # locale
git push origin --delete v1.0.0       # remoto

Checkout di un tag

git switch --detach v1.0.0
# oppure per basare un branch hotfix su un tag
git switch -c hotfix/1.0.1 v1.0.0

Verificare le firme

git tag -v v1.0.0

Richiede la chiave pubblica del tagger nel tuo keyring GPG.

Descrivere build con git describe

Una volta che il tuo repo ha tag annotated, git describe produce identificatori di build stabili che combinano l'ultimo tag, la distanza e lo SHA abbreviato:

git describe
# v1.2.3-7-gabc1234
git describe --always --dirty
# v1.2.3-7-gabc1234-dirty

Il suffisso --dirty appare se la working tree ha modifiche non committate; --always ricade su uno SHA nudo quando nessun tag è raggiungibile. Le pipeline CI spesso incorporano questa stringa nei binari per rendere triviale la risoluzione di problemi sul campo.

Politiche di tagging

Per progetti supportati a lungo termine, decidi e documenta:

  • Schema di naming: v1.2.3, release-2025-04, 1.2.3 (senza prefisso)?
  • Annotated o firmati?
  • Chi può pushare i tag? Molti host ti permettono di proteggere i nomi dei tag con pattern.
  • Qual è la fonte di verità: tag solo su main, o release branch con i propri tag?
git for-each-ref --sort=-creatordate --format='%(refname:short) %(creatordate:short)' refs/tags | head

Scegli uno schema e attieniti ad esso; la storia dei tag è più difficile da migrare di quella dei commit.

Errori comuni

Usare tag lightweight per le release. Mancano di data, autore e messaggio, il che rende dolorose le tracce di audit. Usa sempre -a o -s per le release. Spostare un tag dopo che è pubblicato; gli utenti a valle non recepiranno il cambiamento in modo pulito. Crea un nuovo tag (es. v1.0.1). Dimenticare di pushare i tag e chiedersi perché la tua release page è vuota; ricorda git push --tags o --follow-tags. Infine, nominare tag con caratteri che confliggono con i ref (un tag e un branch chiamati release creeranno ambiguità); usa una convenzione chiara come v<semver> per le release.