¿Por qué Git tiene etiquetas?

8

He leído Git de ramas y etiquetas mejores prácticas y los comentarios de etiquetado git - las mejores prácticas , pero no veo una respuesta directa a algo que yo he preguntado durante mucho tiempo:

¿Por qué Git tiene etiquetas? (en lugar de solo ramas)

Parecen ser ciudadanos de segunda clase, o al menos "diferentes". No se envían a menos que lo especifiques explícitamente. La eliminación de etiquetas remotas no causa la eliminación en repositorios posteriores.

Este último punto fue un problema recientemente, ya que alguien empujó un montón de etiquetas de basura con toneladas de confirmaciones de otro repositorio. Podríamos eliminarlos en sentido ascendente y activar los commits, pero eso no se propagaría, y la próxima vez que alguien empujara una etiqueta git push --tags, repugnaría esas etiquetas de basura y commits. Así que tuvimos que asegurarnos de que todos los eliminaran.

¿Cuándo y por qué usaría una etiqueta en lugar de una rama?

Paul Draper
fuente
1
Por un lado, las etiquetas se pueden anotar, las ramas no. Las etiquetas son generalmente cosas "permanentes" (generalmente para marcar versiones específicas de un proyecto).
Rufflewind

Respuestas:

10

Esto se hace a propósito .

Parecen ser ciudadanos de segunda clase, o al menos "diferentes". No se envían a menos que lo especifiques explícitamente. La eliminación de etiquetas remotas no causa la eliminación en repositorios posteriores.

No estoy de acuerdo con la respuesta de lxrec sobre que git tiene malos valores predeterminados. Si sigue la lista de correo, puede ver que los desarrolladores de git realmente se preocupan por tener valores predeterminados razonables. ¿Tendría sentido tenerlo --ff-onlypor defecto? No lo creo.

Las etiquetas permiten tener anotaciones para su propia copia de desarrollo local. No me gustaría ver que mis why_does_it_break_herey mis todo_fix_formattingetiquetas sean empujadas sin mi consentimiento (esos no son nombres de etiquetas reales). Etiquetar un lanzamiento, por otro lado, es algo que ocurre con menos frecuencia, y tiene sentido requerir un impulso explícito (o usar un alias).

No veo una diferencia importante entre las etiquetas y las ramas, y cómo se comporta push / fetch. En su ejemplo, si las etiquetas de basura hubiesen sido ramas, ¿la eliminación se propagaría como usted pretendía?

¿Cuándo y por qué usaría una etiqueta en lugar de una rama?

Generalmente hablando:

  • las ramas son para árboles: señalan diferentes compromisos a lo largo del tiempo
  • Las etiquetas son para confirmaciones individuales y son inmutables (esto incluye árboles congelados como los lanzamientos)
volcado de memoria
fuente
¿Las etiquetas anotadas y las etiquetas anotadas firmadas (es decir, las que realmente se usarían para, por ejemplo, etiquetar un lanzamiento público) no se envían por defecto? Solo las etiquetas "locales" no anotadas no se envían por defecto, porque, bueno, como dijiste, son locales .
Jörg W Mittag el
@ JörgWMittag No lo comprobé, pero confío en ti en esto. ¡Espera un minuto, eso significaría que git tiene valores predeterminados razonables!
coredump
@ JörgWMittag Entonces, probé localmente con dos repositorios en diferentes directorios, y ni las etiquetas anotadas ni las anotadas + firmadas fueron empujadas. Esto es con git 1.8.2.
coredump
Ah, espera Creo que las etiquetas anotadas y firmadas se envían automáticamente git push --tags, pero las etiquetas locales no. Ha pasado un tiempo desde que usé git con ira, eso fue mucho antes de Git 1.0.
Jörg W Mittag el
1

1) ¿Por qué los git tags son ciudadanos de segunda clase?

Porque lamentablemente, git tiene muchos valores predeterminados malos. Por mucho que me guste, simplemente no es una herramienta intuitiva o amigable para los novatos. Casi todo el mundo tiene que configurar git configs o alias o scripts que usan una docena de las - opciones (como --ff-only) para hacer que git comience a comportarse de la manera que realmente quiere. Las etiquetas son solo un ejemplo más.

2) ¿Por qué usaría una etiqueta git en lugar de una rama?

Una rama está destinada a marcar una confirmación sobre la que realiza otras confirmaciones. Cuando realiza una nueva confirmación a esa rama, la rama misma se "mueve" para que apunte a la nueva confirmación.

Una etiqueta, por otro lado, marca una confirmación, y luego sigue marcando esa misma confirmación casi para siempre (en teoría). El uso más común es etiquetar confirmaciones con sus versiones de lanzamiento oficiales cada vez que lanza una nueva versión a producción.

Usamos ramas y etiquetas para nuestras versiones de lanzamiento. La rama simplemente representa la versión mayor / menor, mientras que las etiquetas especifican versiones de parches / compilación dentro de esa versión mayor / menor. Entonces, si necesitamos aplicar una corrección de errores a una versión anterior, simplemente seleccionamos el compromiso de corrección de errores del maestro en la rama apropiada, luego etiquetamos el nuevo compromiso con el nuevo número de versión que obtiene durante la implementación.

Ixrec
fuente