Se voglio taggare il commit corrente. So che funzionano entrambe le seguenti righe di comando:
git tag <tagname>
e
git tag -a <tagname> -m '<message>'
Qual è la differenza tra questi comandi?
Se voglio taggare il commit corrente. So che funzionano entrambe le seguenti righe di comando:
git tag <tagname>
e
git tag -a <tagname> -m '<message>'
Qual è la differenza tra questi comandi?
Risposte:
La differenza tra i comandi è che uno ti fornisce un messaggio tag mentre l'altro no. Un tag annotato ha un messaggio che può essere visualizzato con git-show (1), mentre un tag senza annotazioni è solo un puntatore denominato a un commit.
Secondo la documentazione : "Per creare un tag leggero, non fornire alcuna delle opzioni -a, -s o -m, basta fornire un nome tag". Esistono anche diverse opzioni per scrivere un messaggio su tag annotati:
git tag <tagname>
, Git creerà un tag nella revisione corrente ma non ti chiederà un'annotazione. Sarà taggato senza un messaggio (questo è un tag leggero).git tag -a <tagname>
, Git ti chiederà un'annotazione a meno che tu non abbia anche usato il flag -m per fornire un messaggio.git tag -a -m <msg> <tagname>
, Git taggerà il commit e lo annoterà con il messaggio fornito.git tag -m <msg> <tagname>
, Git si comporterà come se si passasse il flag -a per l'annotazione e si utilizzasse il messaggio fornito.Fondamentalmente, ciò equivale semplicemente a desiderare che il tag abbia un'annotazione e alcune altre informazioni associate ad esso o meno.
git tag -a <tag> -m ''
), ma un tag annotato ha sempre tagger (autore) e data .
git push --follow-tags
, verranno inviati solo i tag annotati.
Spingi i tag con annotazioni, mantieni il locale leggero
man git-tag
dice:
I tag con annotazioni sono pensati per il rilascio mentre i tag leggeri sono pensati per etichette di oggetti private o temporanee.
E alcuni comportamenti si differenziano tra loro in modo che questa raccomandazione sia utile, ad esempio:
i tag annotati possono contenere un messaggio, un creatore e una data diversi dal commit a cui puntano. Quindi potresti usarli per descrivere una versione senza effettuare un commit della versione.
I tag leggeri non hanno queste informazioni extra e non ne hanno bisogno, poiché le utilizzerai solo per svilupparle.
git describe
senza opzioni della riga di comando vede solo tag con annotazioniDifferenze interne
sia i tag leggeri che quelli con annotazioni sono un file .git/refs/tags
contenente un SHA-1
per tag leggeri, SHA-1 punta direttamente a un commit:
git tag light
cat .git/refs/tags/light
stampa lo stesso di HEAD SHA-1.
Quindi non c'è da stupirsi che non possano contenere altri metadati.
i tag annotati puntano a un oggetto tag nel database degli oggetti.
git tag -as -m msg annot
cat .git/refs/tags/annot
contiene lo SHA dell'oggetto tag annotato:
c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
e quindi possiamo ottenere il suo contenuto con:
git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
uscita campione:
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
Ed è così che contiene metadati extra. Come possiamo vedere dall'output, i campi dei metadati sono:
Un'analisi più dettagliata del formato è presente in: Qual è il formato di un oggetto tag git e come calcolare il suo SHA?
bonus
Determina se un tag è annotato:
git cat-file -t tag
Uscite
commit
per leggerezza, poiché non esiste alcun oggetto tag, punta direttamente al committag
per annotato, poiché in questo caso è presente un oggetto tagElencare solo tag leggeri: come posso elencare tutti i tag leggeri?
La grande differenza è spiegata perfettamente qui .
Fondamentalmente, i tag leggeri sono solo indicatori di commit specifici. Non vengono salvate ulteriori informazioni ; d'altra parte, i tag annotati sono oggetti regolari , che hanno un autore e una data e possono essere riferiti perché hanno la propria chiave SHA.
Se sai chi ha taggato cosa e quando è rilevante per te, usa i tag annotati. Se vuoi solo taggare un punto specifico nel tuo sviluppo , indipendentemente da chi e quando lo ha fatto, i tag leggeri sono abbastanza buoni.
Normalmente dovresti scegliere tag con annotazioni, ma dipende davvero dal master Git del progetto.