¿Git Tag funciona principalmente como una especie de alias?

Hasta ahora sé que puedo usar git tag -a tag_name -m "tag message" para hacer una label anotada.

Y luego usar git show tag_name para ver las informaciones de cambio de una label específica.

En realidad, esta label estaba vinculada a una confirmación. Entonces, lo que realmente veo son los cambios de ese compromiso.

Entonces, ¿la git tag funciona principalmente como alias o recordatorio, por lo que no necesitamos recordar esos HEADS inhumanos?

¿O hay algunas funciones mágicas de la label que no sé hasta ahora?

Ya hay una respuesta bastante buena, pero quería agregar una respuesta que vaya en una dirección diferente.

De manera significativa, la respuesta a la pregunta tal como se preguntó ("¿una label sirve como alias?") Es , pero podría ser engañosa, porque en git, todos los nombres actúan como alias (en las situaciones en las que esto tiene sentido) .

Más específicamente, el "verdadero nombre" de cualquier object git es su identificación SHA-1, que es probablemente a lo que se refiere cuando menciona "esos CABEZAS inhumanas". Cada SHA-1 es una cadena de 40 caracteres como c18b86734113ee2aeb0e140c922c8fbd4accc860 . Una label es una forma de encontrar dicha ID, pero también lo es un nombre de twig como master o devel , y también lo son cadenas como HEAD , HEAD^ , master~3 , y así sucesivamente.

De hecho, git tiene un sistema sintáctico bastante rico para convertir nombres en ID de SHA-1, documentados en la página de gitrevisions . Por ejemplo, para encontrar una confirmación que contenga la cadena "bug1234", puede escribir git show :/bug1234 . (Los dos puntos indican algo especial, la barra inclinada especifica una búsqueda y el rest del text es en realidad una expresión regular completa).

Lo que hace que un nombre de label sea diferente, semánticamente hablando, de un nombre de sucursal es que se espera que un nombre de sucursal se resuelva en diferentes ID de confirmación a lo largo del time y, de hecho, realice un nuevo commit mientras está "on" en una twig (como en, git status dice on branch master ) actualiza automáticamente la asignación de nombre de twig a ID. 1 Por el contrario, no se espera que un nombre de label se mueva así, y git no lo moverá tan fácilmente. (Uno puede "forzar el movimiento" de una label, a costa de confundir potencialmente a otros usuarios que ya han guardado la asignación de nombre a ID: es bastante probable que esos otros usuarios sigan usando la ID anterior).

Como señala la otra respuesta , hay dos forms de tags, "ligero" (que apunta directamente a un compromiso 2 ) y "anotado" (que en realidad es un par, con una label liviana que apunta a un object de label real, que luego almacena algunas datos que incluyen otro puntero; el segundo apunta a la confirmación).

Puede usar el command git rev-parse para convertir un especificador de revisión en una ID de SHA-1 sin formatting. Este command tiene muchas otras características, pero una de sus piezas centrales simplemente suelta arguments en el controller de syntax de revisión. Nombrar un nombre SHA-1 sin procesar que SHA-1; 3 al darle una twig o un nombre de label obtiene lo que señala la twig o la label.

Esto último es donde la diferencia entre una label ligera y una label anotada se vuelve significativa. Si ha anotado una anotación de label apuntando a una confirmación, el command git rev-parse annotag le proporciona la ID de SHA-1 para el object de label , no para la confirmación. Si tiene una label liviana con label lightag apunta a la misma confirmación, git rev-parse lightag le proporciona la identificación SHA-1 para la confirmación . De hecho, este comportamiento diferente es a menudo lo que desea, pero si no es fácil de manejar, porque entre todas las otras syntax sofisticadas, hay una syntax de sufijo que le permite especificar que debe get un object de confirmación: git rev-parse v1.2^{commit} dice que convierta la cadena v1.2 en una confirmación. Si v1.2 es una label anotada, git encontrará la confirmación a la que apunta. 4

Además de las syntax especiales para las tags "peeling off" (ver nota 4), los commands de git que necesitan una confirmación realizarán automáticamente el peeling. Por ejemplo, git show dará, dado un nombre de label anotado, mostrará la label y el object al que señala la label.

En resumen, ambos nombres de twig y nombre de label son alias, pero sus propósitos son diferentes: las tags son alias "fijos" (para un SHA-1 específico e inmutable), mientras que los nombres de twig son alias "variables" (el último SHA) -1 en algún tipo de historia).


1 De hecho, esto es realmente lo que significa estar "en una twig": hacer una nueva confirmación no solo hará la nueva confirmación, sino que también actualizará la asignación del nombre de la twig a la ID de confirmación. Si usa específicamente --detach para entrar en el modo "HEAD desconectado", o si saca una ID de label o "desconecta" una twig en este modo de "HEAD desconectado", aún puede hacer nuevas confirmaciones. Cada vez que lo hace, la nueva ID de confirmación se almacena en el file HEAD , en lugar de hacerlo en un file de sucursal. Como el file HEAD se sobrescribe con el nombre de la twig o la identificación sin procesar del commit una vez que revisa una nueva twig o confirmación, cualquiera de estas nuevas confirmaciones son solo temporales, a less que les dé una twig o un nombre de label más adelante. Así es como funciona el command rebase internamente, por ejemplo: se sale de la twig, copy commits como nuevas confirmaciones temporales, y cuando termina de copyr la última confirmación, vuelve a barajar el nombre de la twig para que las nuevas confirmaciones ya no sean temporales , y es la antigua cadena de compromiso que se ha convertido en temporal.

2 De hecho, una label puede señalar cualquier object git. Normalmente, una label liviana debe apuntar a un compromiso, y la input liviana para una label anotada debe (para tener algún sentido) apuntar al object de label anotado. Sin embargo, un object de label anotadora puede apuntar a otro object de label anotado, y así sucesivamente, y es posible, e incluso útil, para fines especiales, hacer references (no necesariamente tags) que apuntan directamente a los objects de tree o blob.

3 De hecho, si alimenta una cadena SHA-1 de 40 caracteres para git rev-parse , esa ID no necesita existir en el repository. Sin embargo, si usa una forma abreviada, rev-parse searchá el object, fallará si el ID falta o es ambiguo, o si encuentra el formulario completo de 40 caracteres, de no ser así.

4 Tenga en count que esto supone que la label apunta a una confirmación, posiblemente después de seguir cierto número de tags anotadas intermedias. Una syntax ligeramente diferente, rev ^{} , le dice a git que si el argumento rev es una label anotada, debe seguir esa label a su object, y si ese object es también una label, debe seguir de nuevo, y repetir hasta que llegue una no label Este process también se llama "peeling".

Tenga en count también que algunos intérpretes de commands tratan los frenillos especialmente, por lo que en algunos casos es posible que necesite proteger algunas de estas cadenas mediante comillas.

En realidad, git conoce dos types de tags:

  • tags livianas "normales", que no son más que otro nombre para un compromiso y
  • tags anotadas que contienen información adicional y se almacenan como un object separado.

Siempre que use git tag -a creará una label anotada. Usualmente lo usas para un lanzamiento. Almacenará quién creó la label y cuando termine, puede agregar un post e incluso firmar su label. Toda esa información no está disponible en una label ligera.

Echa un vistazo a la git help tag para get más detalles.