← Git

Flujos y buenas prácticas

¿Qué son los tags en Git y cuál es la diferencia entre un tag anotado y uno ligero?

Ver respuesta — intenta responderla en voz alta primero

Un tag es una etiqueta que marca un commit específico, normalmente para señalar una versión (release), como v1.0.0. Un tag ligero (lightweight) es solo un puntero al commit, sin más datos. Un tag anotado (annotated) guarda además autor, fecha y mensaje, y es el recomendado para releases. Suelen seguir Semantic Versioning (MAYOR.MENOR.PARCHE).

A diferencia de una rama, un tag no se mueve: marca un punto fijo en la historia, típicamente "aquí lanzamos la versión X".

  • Tag ligero: un simple nombre que apunta a un commit. Ligero, sin metadatos. Útil para marcas privadas o temporales.
  • Tag anotado: un objeto completo en Git, con autor, fecha, mensaje (y opcionalmente firma). Es el recomendado para releases oficiales, porque queda documentado quién y cuándo lo creó.

Semantic Versioning (semver): MAYOR.MENOR.PARCHE (ej. 2.4.1):

  • MAYOR: cambios incompatibles.
  • MENOR: nueva funcionalidad compatible.
  • PARCHE: correcciones compatibles.
# Tag ANOTADO (recomendado para releases): con -a y mensaje con -m
git tag -a v1.0.0 -m "Primera version estable"

# Tag LIGERO: solo el nombre, sin metadatos
git tag v1.0.0-beta

# Listar todos los tags
git tag
# v1.0.0
# v1.0.0-beta

# Ver informacion de un tag anotado (autor, fecha, mensaje)
git show v1.0.0

# Etiquetar un commit antiguo (por su hash)
git tag -a v0.9.0 1a2b3c4 -m "Version previa"

# Los tags NO se suben con push normal: hay que subirlos aparte
git push origin v1.0.0
# o todos a la vez:
git push origin --tags

Creer que git push sube los tags automáticamente. No lo hace: hay que subirlos explícitamente con git push origin <tag> o git push --tags. Otro error es usar tags ligeros para releases oficiales, cuando lo recomendado es anotados (con -a) para que quede registrado el autor, la fecha y el motivo.

"Un tag es una etiqueta fija que marca un commit concreto, normalmente para señalar una versión, como v1.0.0. A diferencia de una rama, el tag no se mueve. Hay dos tipos: el ligero, que es solo un puntero, y el anotado, que guarda autor, fecha y mensaje, y es el recomendado para releases. Suelo nombrarlos siguiendo semantic versioning, con MAYOR.MENOR.PARCHE. Y recuerdo que los tags no se suben con push normal: hay que hacer git push origin --tags."

Reto rápido

Creaste git tag -a v1.0.0 -m "release" y luego hiciste git push. Tu compañero no ve el tag en GitHub. ¿Por qué?

Ver respuesta

Porque git push a secas no sube los tags: solo sube los commits de la rama. Los tags hay que enviarlos aparte con git push origin v1.0.0 (para uno específico) o git push origin --tags (para todos). Por eso tu compañero no lo ve todavía.