¿Las etiquetas Git solo se aplican a la rama actual?

156

Actualmente estoy trabajando con un repositorio que tiene múltiples ramas.

Cuando creo una etiqueta, ¿se refiere esa etiqueta a la rama actual?

En otras palabras: cada vez que creo una etiqueta, ¿necesito cambiar a la rama deseada y etiquetar dentro de esa rama para que la etiqueta se refiera a esa rama en ese momento?

Gerardo
fuente

Respuestas:

151

Si crea una etiqueta por ej.

git tag v1.0

la etiqueta se referirá a la confirmación más reciente de la rama en la que se encuentra actualmente. Puede cambiar de rama y crear una etiqueta allí.

También puede referirse a la otra rama al etiquetar,

git tag v1.0 name_of_other_branch

que creará la etiqueta para la confirmación más reciente de la otra rama.

O simplemente puede colocar la etiqueta en cualquier lugar, sin importar qué rama, haciendo referencia directa al SHA1 de alguna confirmación

git tag v1.0 <sha1>
Kalle Pokki
fuente
201

La respuesta de CharlesB y la respuesta de Helmbert son útiles, pero me tomó un tiempo entenderlas. Aquí hay otra forma de decirlo:

  • Una etiqueta es un puntero a una confirmación , y las confirmaciones existen independientemente de las ramas .
    • Es importante comprender que las etiquetas no tienen una relación directa con las ramas ; solo identifican una confirmación .
      • Ese compromiso puede señalarse desde cualquier número de ramas, es decir, puede ser parte del historial de cualquier número de ramas, incluida ninguna.
    • Por lo tanto, la ejecución git show <tag>para ver los detalles de una etiqueta no contiene ninguna referencia a ninguna rama, solo el ID del compromiso al que apunta la etiqueta.
      • (Commit IDs (también conocido como nombres de objeto o SHA 1-IDs) son cadenas de 40 caracteres compuesta de hex dígitos que son hashes más de los contenidos de un cometen; por ejemplo:. 6f6b5997506d48fc6267b0b60c3f0261b6afe7a2)
  • Las ramas entran en juego solo indirectamente :
    • En el momento de crear una etiqueta , al implicar la confirmación de que la etiqueta apuntará a :
      • No especificar un objetivo para una etiqueta por defecto es el commit más reciente de la rama actual (también conocido como HEAD); p.ej:
        • git tag v0.1.0 # tags HEAD of *current* branch
      • La especificación de un nombre de rama como el objetivo de etiqueta por defecto es la confirmación más reciente de esa rama; p.ej:
        • git tag v0.1.0 develop # tags HEAD of 'develop' branch
      • (Como otros han señalado, también puede especificar una ID de confirmación explícitamente como el objetivo de la etiqueta).
    • Cuando se usa git describepara describir la rama actual:
      • git describe [--tags] describe la rama actual en términos de las confirmaciones desde la etiqueta más reciente [posiblemente ligera] en el historial de esta rama .
      • Por lo tanto, la etiqueta a la que hace referencia git describeNO puede reflejar la etiqueta general creada más recientemente .
mklement0
fuente
Entonces, para una etiqueta dada (por ejemplo, v0.1.0), para saber qué fuente real está en una compilación real (de esa fuente), realmente necesita saber en qué rama se basó la compilación, ¿verdad? Es decir, un commit dado puede tener diferentes descendientes en diferentes ramas, ¿verdad?
Hawkeye Parker
2
@HawkeyeParker: ya no estoy inmerso en esto, pero no debería necesitar conocer la rama, porque una etiqueta identifica una confirmación específica (que puede ser parte de varias ramas), y puede investigar desde allí.
mklement0
Pero si hago git show [tagname], entonces muestra un nombre de rama sobre Autor y Fecha, lo que contradice "ejecutar git show <tag> para ver que los detalles de una etiqueta no contienen referencias a ninguna rama"
Brad Thomas
39

Las etiquetas y la bifurcación no tienen ninguna relación, ya que las etiquetas se refieren a una confirmación específica, y la bifurcación es una referencia móvil a la última confirmación de un historial. Las ramas se van, las etiquetas se quedan.

Entonces, cuando etiqueta una confirmación, a git no le importa qué confirmación o rama está desprotegida, si le proporciona el SHA1 de lo que desea etiquetar.

Incluso puedo etiquetar haciendo referencia a una rama (luego etiquetará la punta de la rama), y luego decir que la punta de la rama está en otro lugar (con, git reset --hardpor ejemplo), o eliminar la rama. Sin embargo, la etiqueta que creé no se moverá.

CharlesB
fuente
17
En otras palabras, las etiquetas son simplemente buenos nombres para los feos hash git. La etiqueta (y el hash) existe sin importar qué ramas existen (ed).
C-Otto
8

Cuando llame git tag <TAGNAME>sin ningún parámetro adicional, Git creará una nueva etiqueta desde su HEAD actual (es decir, la HEAD de su rama actual). Al agregar confirmaciones adicionales en esta rama, la HEAD de la rama se mantendrá al día con esas nuevas confirmaciones, mientras que la etiqueta siempre se refiere a la misma confirmación.

Al llamar git tag <TAGNAME> <COMMIT>, incluso puede especificar qué compromiso usar para crear la etiqueta.

En cualquier caso, una etiqueta sigue siendo simplemente un "puntero" a una determinada confirmación (no una rama).

Helmbert
fuente
6

Podemos crear una etiqueta para alguna confirmación anterior:

git tag [tag_name] [reference_of_commit]

p.ej:

git tag v1.0 5fcdb03
Sana Hameed
fuente
1

Si desea etiquetar la rama en la que se encuentra, escriba:

git tag <tag>

y empuje la rama con:

git push origin --tags
Mutatos
fuente
0

Si desea crear una etiqueta desde una rama que sea algo así como release/yourbranchetc., entonces debe usar algo como

git tag YOUR_TAG_VERSION_OR_NAME origin/release/yourbranch

Después de crear la etiqueta adecuada si desea empujar la etiqueta al control remoto, use el comando

git push origin YOUR_TAG_VERSION_OR_NAME
BharathRao
fuente