tener - ¿qué hace git log-oneline?
¿Qué es la etiqueta git, cómo crear etiquetas y cómo retirar las etiquetas remotas git? (3)
cuando pago la etiqueta remota de git, use un comando como este:
git checkout -b local_branch_name origin/remote_tag_name
Tengo un error como este:
error: pathspec `origin/remote_tag_name` did not match any file(s) known to git.
Puedo encontrar remote_tag_name cuando uso el comando git tag.
Comencemos explicando qué es una etiqueta en git
Se usa una etiqueta para etiquetar y marcar una confirmación específica en el historial.
Por lo general, se usa para marcar puntos de liberación (por ejemplo, v1.0, etc.).Aunque una etiqueta puede parecer similar a una rama, una etiqueta, sin embargo, no cambia .
Apunta directamente a un compromiso específico en la historia.
No podrá retirar las etiquetas si no está localmente en su repositorio, por lo que primero debe
fetch
las etiquetas en su repositorio local.
Primero, asegúrese de que la etiqueta existe localmente haciendo
# --all will fetch all the remotes.
# --tags will fetch all tags as well
git fetch --all --tags --prune
Luego revisa la etiqueta ejecutando
git checkout tags/<tag_name> -b <branch_name>
En lugar de
origin
use las
tags/
prefijo.
En este ejemplo, tiene 2 etiquetas versión 1.0 y versión 1.1, puede retirarlas con cualquiera de los siguientes:
git checkout A ...
git checkout version 1.0 ...
git checkout tags/version 1.0 ...
Todo lo anterior hará lo mismo ya que la etiqueta es solo un puntero a un commit dado.
origen:
https://backlog.com/git-tutorial/img/post/stepup/capture_stepup4_1_1.png
¿Cómo ver la lista de todas las etiquetas?
# list all tags
git tag
# list all tags with given pattern ex: v-
git tag --list ''v-*''
¿Cómo crear etiquetas?
Hay 2 formas de crear una etiqueta:
# normal tag
git tag
# annotated tag
git tag -a
La diferencia entre los 2 es que al crear una etiqueta anotada puede agregar metadatos como lo tiene en un git commit:
nombre, correo electrónico, fecha, comentario y firma
¿Cómo borrar etiquetas?
# delete any given tag
git tag -d <tag name>
# Don''t forget to remove the deleted tag form the server with push tags
¿Cómo clonar una etiqueta específica?
Para obtener el contenido de una etiqueta determinada, puede usar el comando de
checkout
.
Como se explicó anteriormente, las etiquetas son como cualquier otra confirmación, por lo que podemos usar el
checkout
y, en lugar de usar el SHA-1, simplemente reemplácelo con el nombre de
etiqueta
Opción 1:
# Update the local git repo with the latest tags from all remotes
git fetch --all
# checkout the specific tag
git checkout tags/<tag> -b <branch>
Opcion 2:
Usando el comando clonar
Dado que git admite
clones superficiales
agregando
--branch
al comando clone, podemos usar el nombre de la etiqueta en lugar del nombre de la rama.
Git sabe cómo "traducir" el SHA-1 dado a la confirmación correspondiente
# Clone a specific tag name using git clone
git clone <url> --branch=<tag_name>
git clone --branch =
--branch
también puede tomar etiquetas y separa el HEAD en ese commit en el repositorio resultante.
(Esta respuesta tardó un tiempo en escribirse, y la respuesta de codeWizard es correcta en cuanto a objetivo y esencia, pero no del todo completa, así que publicaré esto de todos modos).
No existe una "etiqueta Git remota". Solo hay "etiquetas". Indico que todo esto no es pedante, 1 sino porque existe una gran confusión sobre esto con los usuarios ocasionales de Git, y la documentación de Git no es muy útil para los principiantes. (No está claro si la confusión se debe a una documentación deficiente, o la documentación deficiente se debe a que esto es intrínsecamente algo confuso, o qué).
Hay "ramas remotas", más propiamente llamadas "ramas de seguimiento remoto", pero vale la pena señalar que en realidad son entidades locales. Sin embargo, no hay etiquetas remotas (a menos que las (re) invente). Solo hay etiquetas locales, por lo que debe obtener la etiqueta localmente para poder usarla.
La forma general de nombres para confirmaciones específicas, que Git llama
referencias,
es cualquier cadena que comience con
refs/
.
Una cadena que comienza con
refs/heads/
nombra una rama;
una cadena que comienza con
refs/remotes/
nombres de una rama de seguimiento remoto;
y una cadena que comienza con
refs/tags/
nombra una etiqueta.
El nombre
refs/stash
es la referencia de alijo (como lo usa
git stash
; tenga en cuenta la falta de una barra inclinada final).
Hay algunos nombres de casos especiales inusuales que no comienzan con
refs/
:
HEAD
,
ORIG_HEAD
,
MERGE_HEAD
y
CHERRY_PICK_HEAD
en particular, también son nombres que pueden referirse a confirmaciones específicas (aunque
HEAD
normalmente contiene el nombre de una rama, es decir, contiene
ref: refs/heads/
branch
).
Pero en general, las referencias comienzan con las
refs/
.
Una cosa que Git hace para que esto sea confuso es que te permite omitir las
refs/
, y a menudo la palabra después de las
refs/
.
Por ejemplo, puede omitir
refs/heads/
o
refs/tags/
cuando se refiere a una sucursal o etiqueta local, y de hecho,
debe
omitir
refs/heads/
al retirar una sucursal local.
Puede hacerlo siempre que el resultado no sea ambiguo o, como acabamos de señalar, cuando debe hacerlo (para la
git checkout
branch
).
Es cierto que las referencias existen no solo en su propio repositorio, sino también en repositorios remotos.
Sin embargo, Git le da acceso a las referencias de un repositorio remoto solo en momentos muy específicos: es decir, durante
push
operaciones de
fetch
y
push
.
También puede usar
git ls-remote
o
git remote show
para verlos, pero
fetch
y
push
son los puntos de contacto más interesantes.
Refspecs
Durante la
fetch
y la
push
, Git usa cadenas que llama
refspecs
para transferir referencias entre el repositorio local y remoto.
Por lo tanto, es en estos momentos, y a través de las especificaciones técnicas, que dos repositorios de Git pueden sincronizarse entre sí.
Una vez que sus nombres estén sincronizados, puede usar el mismo nombre que usa alguien con el control remoto.
Sin embargo, hay algo de magia especial aquí en
fetch
, y afecta tanto a los nombres de ramas como a los nombres de etiquetas.
Debería pensar que
git fetch
indica a su Git que llame (o quizás envíe un mensaje de texto) a otro Git, el "control remoto", y que tenga una conversación con él.
Al principio de esta conversación, el control remoto enumera todas sus referencias: todo en
refs/heads/
y todo en
refs/tags/
, junto con cualquier otra referencia que tenga.
Tu Git escanea a través de estos y (según la referencia de búsqueda habitual)
cambia el nombre de
sus ramas.
Echemos un vistazo a la especificación de referencia normal para el
origin
nombre remoto:
$ git config --get-all remote.origin.fetch
+refs/heads/*:refs/remotes/origin/*
$
Esta especificación de referencia le indica a su Git que tome cada nombre que coincida con
refs/heads/*
, es decir, cada rama en el control remoto y que cambie su nombre a
refs/remotes/origin/*
, es decir, mantenga la parte coincidente igual, cambiando el nombre de la rama (
refs/heads/
) a un nombre de sucursal de seguimiento remoto (
refs/remotes/
, específicamente,
refs/remotes/origin/
).
Es a
través de esta especificación de referencia
que las ramas de
origin
convierten en sus ramas de seguimiento remoto para
origin
remoto.
El nombre de la sucursal se convierte en el nombre de la sucursal de seguimiento remoto, con el nombre del remoto, en este caso
origin
, incluido.
El signo más
+
al frente de la especificación de referencia establece la bandera de "fuerza", es decir, su rama de seguimiento remoto se actualizará para que coincida con el nombre de la rama del control remoto, independientemente de lo que se necesite para que coincida.
(Sin el
+
, las actualizaciones de rama se limitan a los cambios de "avance rápido", y las actualizaciones de etiquetas simplemente se ignoran desde Git versión 1.8.2 más o menos, antes de eso se aplicaban las mismas reglas de avance rápido).
Etiquetas
¿Pero qué hay de las etiquetas?
No hay ninguna especificación de referencia para ellos, al menos, no de manera predeterminada.
Puede configurar uno, en cuyo caso la forma de la especificación de referencia depende de usted;
o puede ejecutar
git fetch --tags
.
El uso de
--tags
tiene el efecto de agregar
refs/tags/*:refs/tags/*
a la refspec, es decir, trae todas las etiquetas (
pero no actualiza
su
etiqueta si ya tiene una etiqueta con ese nombre,
independientemente de lo que dice la etiqueta del control remoto
Editar, enero de 2017: a partir de Git 2.10, las pruebas muestran que
--tags
actualiza por la fuerza sus etiquetas de las etiquetas del control remoto, como si el refspec lea
+refs/tags/*:refs/tags/*
refs
+refs/tags/*:refs/tags/*
; esto puede ser una diferencia en el comportamiento de una versión anterior de Git).
Tenga en cuenta que no hay cambio de nombre aquí: si el
origin
remoto tiene la etiqueta
xyzzy
, y usted no, y
git fetch origin "refs/tags/*:refs/tags/*"
, obtendrá
refs/tags/xyzzy
agregado a su repositorio (apuntando a la misma confirmación que en el control remoto).
Si usa
+refs/tags/*:refs/tags/*
entonces su etiqueta
xyzzy
, si tiene una, se
reemplaza
por la de
origin
.
Es decir, el indicador de fuerza
+
en una especificación de referencia significa "reemplazar el valor de mi referencia con el que mi Git obtiene de su Git".
Etiquetas automáticas durante la recuperación
Por razones históricas,
3
si no utiliza la opción
--tags
ni la
--no-tags
,
git fetch
toma medidas especiales.
Recuerde que dijimos anteriormente que el control remoto comienza mostrándole a su Git local
todas
sus referencias, ya sea que su Git local quiera verlas o no.
4
Your Git toma nota de todas las etiquetas que ve en este momento.
Luego, a medida que comienza a descargar cualquier objeto de confirmación que necesita para manejar lo que sea que esté obteniendo, si una de esas confirmaciones tiene la misma ID que cualquiera de esas etiquetas, git agregará esa etiqueta, o esas etiquetas, si varias etiquetas tienen esa ID, a tu repositorio
Edición, enero de 2017: las pruebas muestran que el comportamiento en Git 2.10 es ahora: si su Git proporciona una etiqueta llamada
T
,
y
no tiene una etiqueta llamada
T
,
y
el ID de confirmación asociado con
T
es un antepasado de una de sus ramas que tu
git fetch
está examinando, tu Git agrega
T
a tus etiquetas con o sin
--tags
.
Agregar
--tags
hace que tu Git obtenga
todas
sus etiquetas, y también fuerza la actualización.
Línea de fondo
Puede que tenga que usar
git fetch --tags
para obtener sus etiquetas.
Si sus nombres de etiqueta entran en conflicto con sus nombres de etiqueta existentes,
puede
(dependiendo de la versión de Git) incluso tener que eliminar (o renombrar) algunas de sus etiquetas, y luego ejecutar
git fetch --tags
, para obtener sus etiquetas.
Dado que las etiquetas, a diferencia de las ramas remotas, no tienen cambio de nombre automático, los nombres de las etiquetas deben coincidir con sus nombres, por lo que puede tener problemas con los conflictos.
Sin embargo, en la
mayoría de
los casos normales, un simple
git fetch
hará el trabajo, presentando sus commits y sus etiquetas correspondientes, y dado que ellos, sean quienes sean, etiquetarán los commits en el momento en que publiquen esos commits, usted se mantendrá al día con sus Etiquetas
Si no crea sus propias etiquetas, ni combina su repositorio y otros repositorios (a través de múltiples controles remotos), tampoco tendrá colisiones de nombres de etiquetas, por lo que no tendrá que preocuparse por eliminar o renombrar etiquetas para poder obtener sus etiquetas.
Cuando necesitas nombres calificados
Mencioné anteriormente que puedes omitir
refs/
casi siempre, y
refs/heads/
y
refs/tags/
y así la mayoría de las veces.
Pero cuando
no
puedes?
La respuesta completa (o casi completa) está en
la documentación de
gitrevisions
.
Git resolverá un nombre a una ID de confirmación utilizando la secuencia de seis pasos que se proporciona en el enlace.
Curiosamente, las etiquetas anulan las ramas: si hay una etiqueta
xyzzy
y una rama
xyzzy
, y apuntan a confirmaciones diferentes, entonces:
git rev-parse xyzzy
le dará la identificación a la que apunta la etiqueta.
Sin embargo, y esto es lo que falta en
gitrevisions
,
git checkout
prefiere los nombres de las ramas, por lo que
git checkout xyzzy
lo colocará en la rama, sin tener en cuenta la etiqueta.
En caso de ambigüedad, casi siempre puede deletrear el nombre de referencia usando su nombre completo,
refs/heads/xyzzy
o
refs/heads/xyzzy
refs/tags/xyzzy
.
(Tenga en cuenta que esto funciona con
git checkout
, pero de una manera quizás inesperada:
git checkout refs/heads/xyzzy
provoca un pago de HEAD separado en lugar de un pago de sucursal. Es por eso que solo debe tener en cuenta que
git checkout
usará el nombre corto como nombre de la sucursal primero: así es como revisa la rama
xyzzy
incluso si existe la etiqueta
xyzzy
. Si desea verificar la etiqueta, puede usar
refs/tags/xyzzy
).
Debido a que (como señala
gitrevisions
) Git intentará
refs/
name
, también puede simplemente escribir
tags/xyzzy
para identificar la confirmación etiquetada
xyzzy
.
(Sin embargo, si alguien ha logrado escribir una referencia válida llamada
xyzzy
en
$GIT_DIR
, esto se resolverá como
$GIT_DIR/xyzzy
. Pero normalmente solo los diversos nombres
*HEAD
deberían estar en
$GIT_DIR
).
1 Bien, bien, "no solo para ser pedante". :-)
2 Algunos dirían "muy poco útil", y yo tendería a estar de acuerdo, en realidad.
3
Básicamente,
git fetch
y todo el concepto de controles remotos y refspecs fue una adición tardía a Git, que sucedió en la época de Git 1.5.
Antes de eso, solo había algunos casos especiales ad-hoc, y la búsqueda de etiquetas era uno de ellos, por lo que se introdujo mediante un código especial.
4 Si ayuda, piense en el Git remoto como un flasher , en el sentido de la jerga.
Para obtener el código de etiqueta específico, intente crear una nueva rama y agregue el código de etiqueta.
Lo hice por comando:
$git checkout -b newBranchName tagName