¿Cuál es la diferencia entre una etiqueta anotada y no anotada?

333

Si quiero etiquetar el commit actual. Sé que funcionan las dos líneas de comando siguientes:

git tag <tagname>

y

git tag -a <tagname> -m '<message>'

¿Cuál es la diferencia entre estos comandos?

usuario462301
fuente
1
@ Thhilo Esto no es un duplicado exacto. La pregunta a la que se hace referencia es sobre cuándo anotar, no sobre los indicadores relacionados.
Todd A. Jacobs
1
Esto está muy bien explicado en la documentación de Git: git-scm.com/book/en/Git-Basics-Tagging
Samy Dindane
TLDR sin anotaciones: commit; anotado: cometer, autor, fecha, comentario (opcional)
Antony Hatchkins

Respuestas:

255

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 las etiquetas ligeras

De acuerdo con la documentación : "Para crear una etiqueta ligera, 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 lo use git tag <tagname>, Git creará una etiqueta en la revisión actual, pero no le pedirá una anotación. Se etiquetará sin un mensaje (esta es una etiqueta ligera).
  • Cuando lo 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 lo use git tag -a -m <msg> <tagname>, Git etiquetará el commit y lo anotará con el mensaje proporcionado.
  • Cuando lo use git tag -m <msg> <tagname>, Git se comportará como si hubiera pasado la marca -a para anotación y use el mensaje proporcionado.

Básicamente, solo equivale a si desea que la etiqueta tenga una anotación y alguna otra información asociada con ella o no.

Todd A. Jacobs
fuente
44
¿Hay alguna diferencia entre una etiqueta "anotación" y un mensaje de confirmación?
Steve Bennett
3
@SteveBennett Sí. Una anotación de etiqueta no es un mensaje de confirmación. No puedes verlo con git-log (1); necesitas usar git-show (1).
Todd A. Jacobs
115
La diferencia entre las etiquetas "anotadas" y "ligeras" va más allá del mensaje. Puede tener una etiqueta anotada sin un mensaje ( git tag -a <tag> -m ''), pero una etiqueta anotada siempre tiene etiquetador (autor) y fecha .
Piotr Findeisen
1
Lo mismo para mi. Las etiquetas de versión generalmente tienen mensajes bastante inútiles (¿puede decir más que el nombre? ¿Para qué?). Desafortunadamente, esta respuesta de alta votación no menciona esta diferencia.
Piotr Findeisen
44
Otra cosa importante a tener en cuenta es que cuando empuja sus etiquetas a un repositorio remoto utilizando git push --follow-tags, solo se empujarán las etiquetas anotadas.
Xatoo
209

Empuje etiquetas anotadas, mantenga un local ligero

man git-tag dice:

Las etiquetas anotadas están destinadas al lanzamiento, mientras que las etiquetas livianas están destinadas a las etiquetas de objetos privados o temporales.

Y ciertos comportamientos diferencian entre ellos de manera que esta recomendación es útil, por ejemplo:

  • Las etiquetas anotadas pueden contener un mensaje, un creador y una fecha diferente del compromiso al que apuntan. Por lo tanto, puede usarlos para describir un lanzamiento sin realizar un compromiso de lanzamiento.

    Las etiquetas livianas no tienen esa información adicional, y no la necesitan, ya que solo la usará usted mismo para desarrollarla.

  • git push: las siguientes etiquetas solo enviarán etiquetas anotadas
  • git describe sin opciones de línea de comando solo ve etiquetas anotadas

Diferencias internas

  • las etiquetas ligeras y anotadas son un archivo debajo .git/refs/tagsque contiene un SHA-1

  • para etiquetas livianas, el SHA-1 apunta directamente a una confirmación:

    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 otros metadatos.

  • 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 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 de etiqueta git y cómo calcular su SHA?

Bonos

  • Determine si una etiqueta está anotada:

    git cat-file -t tag
    

    Salidas

    • commit para peso ligero, ya que no hay ningún objeto de etiqueta, apunta directamente a la confirmación
    • tag para anotado, ya que hay un objeto de etiqueta en ese caso
  • Enumerar solo etiquetas livianas: ¿Cómo puedo enumerar todas las etiquetas livianas?

Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
fuente
1
Esto es mucho más claro que la respuesta actualmente aceptada. Gracias.
Reece
43

La gran diferencia se explica perfectamente aquí .

Básicamente, las etiquetas livianas 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 se pueden referir 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 en su desarrollo , sin importar quién y cuándo lo hizo, entonces las etiquetas livianas son lo suficientemente buenas.

Normalmente elegiría etiquetas anotadas, pero realmente depende del maestro Git del proyecto.

Luis
fuente