trucos tag qué que name hace commits commands comentarios codigos git tags git-tag

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 lo git tag -a -m <msg> <tagname> con el mensaje proporcionado.
  • Cuando use la git tag -m <msg> <tagname> , Git se comportará como si pasara la git 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-1

  • para 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:

    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