¿Cuál es la diferencia entre una etiqueta con anotaciones y una sin anotaciones?
Si quiero etiquetar el compromiso actual. Sé que las 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. 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 información sobre etiquetas ligeras
Según la documentación : "Para crear una etiqueta liviana, no proporcione ninguna de las opciones -a, -s o -m, solo proporcione un nombre de etiqueta". También hay algunas opciones diferentes para escribir un mensaje en etiquetas anotadas:
- Cuando use
git tag <tagname>
, Git creará una etiqueta en la revisión actual pero no le solicitará una anotación. Se etiquetará sin mensaje (esta es una etiqueta liviana). - Cuando use
git tag -a <tagname>
, Git le solicitará una anotación a menos que también haya usado el indicador -m para proporcionar un mensaje. - Cuando uses
git tag -a -m <msg> <tagname>
, Git etiquetará la confirmación y la anotará con el mensaje proporcionado. - Cuando use
git tag -m <msg> <tagname>
, Git se comportará como si hubiera pasado el indicador -a para realizar anotaciones y usara el mensaje proporcionado.
Básicamente, solo se trata de si desea que la etiqueta tenga una anotación y alguna otra información asociada o no.
Inserte etiquetas anotadas y mantenga el nivel local ligero
man git-tag
dice:
Las etiquetas anotadas están destinadas a su publicación, mientras que las etiquetas ligeras están destinadas a etiquetas de objetos privados 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 diferentes a la confirmación a la que apuntan. Por lo tanto, podría usarlos para describir un lanzamiento sin realizar una confirmación de lanzamiento.
Las etiquetas ligeras no tienen esa información adicional y no la necesitan, ya que solo la usará usted mismo para desarrollar.
- git push --follow-tags solo enviará 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
.git/refs/tags
que contiene un SHA-1para etiquetas ligeras, SHA-1 apunta directamente a una confirmación:
git tag light cat .git/refs/tags/light
imprime lo mismo que el SHA-1 del 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 anotado:
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 adicionales. Como podemos ver en el resultado, 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 blobs, no solo a confirmaciones .
- el nombre de la etiqueta
- identidad del etiquetador y marca de tiempo
- mensaje. Observe cómo la firma PGP simplemente se agrega al mensaje.
Un análisis más detallado del formato está presente en: ¿ Cuál es el formato de un objeto de etiqueta git y cómo calcular su SHA?
Bonificaciones
Determinar si una etiqueta está anotada:
git cat-file -t tag
Salidas
commit
para peso ligero, dado que no hay ningún objeto de etiqueta, apunta directamente a la confirmacióntag
para anotado, ya que hay un objeto de etiqueta en ese caso
Enumere solo etiquetas livianas: ¿Cómo puedo enumerar todas las etiquetas livianas?
La gran diferencia está perfectamente explicada aquí .
Básicamente, las etiquetas ligeras son sólo indicadores de 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 referenciados porque tienen su propia clave SHA.
Si saber quién etiquetó qué y cuándo es relevante para usted, utilice etiquetas anotadas. Si solo desea etiquetar un punto específico de su desarrollo , sin importar quién y cuándo lo hizo, entonces las etiquetas livianas son lo suficientemente buenas.
Normalmente, optaría por etiquetas anotadas, pero en realidad depende del maestro de Git del proyecto.