git - tag - ¿Cuál es la diferencia entre una etiqueta anotada y una no anotada?
qué es un branch en git (3)
Si quiero etiquetar el commit actual. Sé que las dos siguientes líneas de comando funcionan:
git tag <tagname>
y
git tag -a <tagname> -m ''<message>''
¿Cuál es la diferencia entre estos comandos?
TL; DR
La diferencia entre los comandos es que uno le proporciona un mensaje de etiqueta mientras que el otro no lo hace. Una etiqueta anotada tiene un mensaje que se puede mostrar con git-show (1), mientras que una etiqueta sin anotaciones es solo un puntero con nombre a una confirmación.
Más sobre las etiquetas ligeras
A menos que seleccione la marca -s para una etiqueta firmada, la etiqueta será una etiqueta liviana, sin firmar de forma predeterminada. También hay algunas diferencias con las etiquetas ligeras:
- Cuando use la
git tag <tagname>
, Git creará una etiqueta en la revisión actual pero no le pedirá una anotación. Será etiquetado sin un mensaje. - Cuando use la
git tag -a <tagname>
, Git le solicitará una anotación a menos que también haya usado la marca -m para enviar un mensaje. - Cuando use la
git tag -a -m <msg> <tagname>
, Git etiquetará el compromiso y logit tag -a -m <msg> <tagname>
con el mensaje proporcionado. - Cuando use la
git tag -m <msg> <tagname>
, Git se comportará como si pasara lagit tag -m <msg> <tagname>
-a para anotación y usará el mensaje proporcionado.
Básicamente, solo equivale a si desea que la etiqueta ligera tenga una anotación asociada o no.
La gran diferencia se explica perfectamente here .
Básicamente, las etiquetas ligeras son solo punteros a confirmaciones específicas. No se guarda más información ; por otro lado, las etiquetas anotadas son objetos regulares , que tienen un autor y una fecha y pueden ser referenciadas porque tienen su propia clave SHA.
Si sabe quién etiquetó qué y cuándo es relevante para usted, utilice etiquetas anotadas. Si solo desea etiquetar un punto específico en su desarrollo , sin importar quién y cuándo lo hizo, entonces las etiquetas livianas son lo suficientemente buenas.
Normalmente iría para las etiquetas anotadas, pero realmente depende del maestro Git del proyecto.
Empuje las etiquetas anotadas, mantenga locales ligeros
man git-tag
dice:
Las etiquetas anotadas están destinadas a ser liberadas, mientras que las etiquetas livianas están diseñadas para etiquetas de objetos privadas o temporales.
Y ciertos comportamientos los diferencian de manera que esta recomendación es útil, por ejemplo:
Las etiquetas anotadas pueden contener un mensaje, un creador y una fecha diferente a la confirmación a la que apuntan. Así que podría usarlos para describir un lanzamiento sin hacer un compromiso de lanzamiento.
Las etiquetas ligeras no tienen esa información adicional, y no la necesitan, ya que solo la usarás para desarrollarlas.
- git push --follow-tags solo empujará etiquetas anotadas
-
git describe
sin opciones de línea de comando solo ve etiquetas anotadas
Diferencias internas
tanto las etiquetas ligeras como las anotadas son un archivo bajo
.git/refs/tags
que contiene un SHA-1para etiquetas ligeras, el SHA-1 apunta directamente a un commit:
git tag light cat .git/refs/tags/light
Imprime lo mismo que el SHA-1 de HEAD.
Así que no es de extrañar que no puedan contener ningún otro metadato.
Las etiquetas anotadas apuntan a un objeto de etiqueta en la base de datos de objetos.
git tag -as -m msg annot cat .git/refs/tags/annot
contiene el SHA del objeto de etiqueta anotada:
c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
Y luego podemos obtener su contenido con:
git cat-file -p c1d7720e99f9dd1d1c8aee625fd6ce09b3a81fef
salida de muestra:
object 4284c41353e51a07e4ed4192ad2e9eaada9c059f type commit tag annot tagger Ciro Santilli <[email protected]> 1411478848 +0200 msg -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (GNU/Linux) <YOUR PGP SIGNATURE> -----END PGP SIGNAT
Y así es como contiene metadatos extra. Como podemos ver en la salida, los campos de metadatos son:
- el objeto al que apunta
- el tipo de objeto al que apunta. Sí, los objetos de etiqueta pueden apuntar a cualquier otro tipo de objeto como manchas, no solo confirmaciones .
- el nombre de la etiqueta
- Identidad de tagger y marca de tiempo
- mensaje. Observe cómo la firma PGP se adjunta al mensaje
Un análisis más detallado del formato está presente en: ¿Cuál es el formato de un objeto git tag y cómo calcular su SHA?
Bonificaciones
Determine si una etiqueta está anotada:
git cat-file -t tag
Las salidas se
commit
para peso ligero,tag
para anotado.Listar solo etiquetas livianas: ¿Cómo puedo listar todas las etiquetas livianas?