Recibo el siguiente error después de ejecutar los pasos a continuación:
To [email protected]:username/repo-name.git
! [rejected] dev -> dev (already exists)
error: failed to push some refs to '[email protected]:username/repo-name.git'
hint: Updates were rejected because the tag already exists in the remote.
- Creado el repositorio
- Cloné el repositorio en la máquina local.
- Modificó el archivo README, confirmó los cambios y envió el commit.
- Etiqueta creada
dev
:git tag dev
- Etiquetas empujadas:
git push --tags
- Modificó el archivo README, confirmó los cambios y envió el commit.
Etiqueta eliminada
dev
, la creó nuevamente y presionó etiquetas:git tag -d dev git tag dev git push --tags
¿Por qué está pasando esto?
Estoy en Mac Mis amigos que usan Linux (Ubuntu) no tienen este problema. Sé que puedo usar git push --tags -f
para forzar la actualización de la etiqueta, pero esto es peligroso (por ejemplo, reescribir una confirmación realizada por error solo en la etiqueta, no en la rama).
git
repository
git-tag
Luca Boieru
fuente
fuente
git pull --tags
entoncesgit push origin --tags
Respuestas:
Edición, 24 de noviembre de 2016: esta respuesta es aparentemente popular, así que agrego una nota aquí. Si reemplazas una etiqueta en un servidor central, cualquiera que tenga la edad de marcado y cualquier clon de ese repositorio-servidor central que ya tiene la etiqueta-podría retener su antigua etiqueta . Entonces, si bien esto te dice cómo hacerlo, asegúrate de que quieres hacerlo. Deberá hacer que todos los que ya tienen la etiqueta "incorrecta" eliminen su "etiqueta incorrecta" y reemplazarla con la nueva "etiqueta correcta".
Las pruebas en Git 2.10 / 2.11 muestran que retener la etiqueta anterior es el comportamiento predeterminado para los clientes que se ejecutan
git fetch
, y la actualización es el comportamiento predeterminado para los clientes que se ejecutangit fetch --tags
.(La respuesta original sigue.)
Cuando solicita insertar etiquetas,
git push --tags
envía (junto con las confirmaciones y otros objetos necesarios y cualquier otra actualización de referencia desde la configuración de inserción) al remoto una solicitud de actualización del formulario . (Bueno, envía muchos: uno para cada etiqueta).new-sha1 refs/tags/name
El control remoto modifica la solicitud de actualización para agregar un
old-sha1
(o de nuevo, uno para cada etiqueta), luego se entrega a los ganchos de pre-recepción y / o actualización (los que existan en el control remoto). Esos ganchos pueden decidir si permitir o rechazar la etiqueta crear / eliminar / actualizar.El
old-sha1
valor es SHA-1 "nulo" todo ceros si se está creando la etiqueta. Elnew-sha1
es el SHA-1 nulo si se elimina la etiqueta. De lo contrario, ambos valores SHA-1 son valores reales y válidos.Incluso sin ganchos, hay una especie de "gancho incorporado" que también se ejecuta: el control remoto se negará a mover una etiqueta a menos que use la bandera "forzar" (aunque el "gancho incorporado" siempre está bien con ambos "agregar" y "eliminar"). El mensaje de rechazo que estás viendo proviene de este gancho incorporado. (Por cierto, este mismo gancho incorporado también rechaza las actualizaciones de sucursales que no son de avance rápido). 1
Pero, aquí está una de las claves para entender lo que está sucediendo, el
git push
paso no tiene idea de si el control remoto tiene esa etiqueta ahora y, de ser así, qué valor tiene SHA-1. Solo dice "aquí está mi lista completa de etiquetas, junto con sus valores SHA-1". El control remoto compara los valores y, si hay adiciones y / o cambios, ejecuta los ganchos en ellos. (Para las etiquetas que son iguales, no hace nada en absoluto. Para las etiquetas que no tienes que tienen, ¡tampoco hace nada!)Si elimina la etiqueta localmente, entonces
push
su inserción simplemente no transfiere la etiqueta. El control remoto supone que no se deben realizar cambios.Si elimina la etiqueta localmente, créela apuntando a un lugar nuevo, luego
push
, su inserción transfiere la etiqueta, y el control remoto ve esto como un cambio de etiqueta y rechaza el cambio, a menos que sea una inserción forzada.Por lo tanto, tiene dos opciones:
Esto último es posible a través de
git push
2 aunque eliminar la etiqueta localmente epush
ing no tiene ningún efecto. Suponiendo que el nombre del control remoto esorigin
, y la etiqueta que desea eliminar esdev
:Esto le pide al control remoto que elimine la etiqueta. La presencia o ausencia de la etiqueta
dev
en su repositorio local es irrelevante; Este tipo depush
, con una especificación de referencia, es un push de eliminación pura.:remoteref
El control remoto puede o no permitir la eliminación de etiquetas (dependiendo de los ganchos adicionales agregados). Si permite la eliminación, la etiqueta desaparecerá y, un segundo
git push --tags
, cuando tenga unadev
etiqueta local que apunte a algún objeto de confirmación de etiqueta anotada, envíe su nuevadev
etiqueta. En el control remoto,dev
ahora será una etiqueta recién creada, por lo que el control remoto probablemente permitirá el empuje (nuevamente, esto depende de cualquier gancho adicional agregado).La fuerza de empuje es más simple. Si desea asegurarse de no actualizar nada más que la etiqueta, solo dígale
git push
que inserte solo esa especificación de referencia:(nota: no es necesario
--tags
si está empujando explícitamente solo una etiqueta ref-spec).1 Por supuesto, la razón de este enlace incorporado es ayudar a reforzar el comportamiento que otros usuarios del mismo repositorio remoto esperan: que las ramas no se rebobinan y las etiquetas no se mueven. Si presiona a la fuerza, debe informar a los demás usuarios que está haciendo esto, para que puedan corregirlo. Tenga en cuenta que "las etiquetas no se mueven en absoluto" es una nueva aplicación de Git 1.8.2; versiones anteriores permitirían que la etiqueta "avance" en el gráfico de confirmación, al igual que los nombres de rama. Ver las notas de lanzamiento de git 1.8.2 .
2 Es trivial si puede iniciar sesión en el control remoto. Simplemente vaya al repositorio de Git allí y ejecute
git tag -d dev
. Tenga en cuenta que de cualquier manera, eliminando la etiqueta en el control remoto o utilizándolagit push
para eliminarla, hay un período de tiempo en el que cualquiera que acceda al control remoto encontrará quedev
falta la etiqueta. (Seguirán teniendo su propia etiqueta anterior, si ya la tienen, e incluso podrían volver a colocar su etiqueta anterior antes de que pueda presionar la nueva).fuente
1.7.9.5
y no tengo este problema ...git push --tags
solo cambiar la etiqueta automáticamente en versiones anteriores de git, sin--force
. Sin embargo, probé esto en 1.8.4, y usted necesita--force
, o la técnica de actualización de dos etapas.En Mac SourceTree solo anule la selección de la casilla de verificación Insertar todas las etiquetas :
fuente
Es bastante simple si estás usando SourceTree .
Básicamente, solo necesita eliminar y volver a agregar la etiqueta en conflicto:
fuente
Si desea ACTUALIZAR una etiqueta, digamos
1.0.0
git checkout 1.0.0
git ci -am 'modify some content'
git tag -f 1.0.0
git push origin --delete 1.0.0
git push origin 1.0.0
HECHO
fuente
Parece que llegué tarde a este problema y / o ya se ha respondido, pero lo que se puede hacer es: (en mi caso, solo tenía una etiqueta localmente, así que borré la etiqueta anterior y la volví a colocar con :
Luego:
Eso actualizará todas las etiquetas en el control remoto.
¡Podría ser peligroso! Uso bajo su propio riesgo.
fuente
La razón por la que te rechazan es porque tu etiqueta perdió la sincronización con la versión remota. Este es el mismo comportamiento con las ramas.
sincronice con la etiqueta desde el control remoto a través de
git pull --rebase <repo_url> +refs/tags/<TAG>
y después de sincronizar, debe gestionar los conflictos . Si tiene instalado un diftool (ej. Meld)git mergetool meld
para sincronizar el control remoto y mantener sus cambios.La razón por la que está tirando con el indicador --rebase es que desea colocar su trabajo encima del remoto para evitar otros conflictos.
Además, lo que no entiendo es ¿por qué eliminarías la
dev
etiqueta y la volverías a crear? Las etiquetas se utilizan para especificar versiones de software o hitos. Ejemplo de etiquetas gitv0.1dev
,v0.0.1alpha
,v2.3-cr
(cr - Release Candidate) y así sucesivamente ..Otra forma de resolver esto es emitir un problema
git reflog
e ir al momento en que presionó ladev
etiqueta en el control remoto. Copie la identificación de confirmación y degit reset --mixed <commmit_id_from_reflog>
esta manera sabrá que su etiqueta estaba sincronizada con el control remoto en el momento en que la presionó y no surgirán conflictos.fuente
En Windows SourceTree, desmarque
Push all tags to remotes
.fuente
Algunas buenas respuestas aquí. Especialmente el de @torek . Pensé que agregaría esta solución alternativa con una pequeña explicación para quienes tienen prisa.
En resumen, lo que sucede es que cuando mueve una etiqueta localmente, cambia la etiqueta de un valor de confirmación no Nulo a un valor diferente. Sin embargo, debido a que git (como comportamiento predeterminado) no permite cambiar etiquetas remotas no nulas, no puede impulsar el cambio.
La solución es eliminar la etiqueta (y marcar eliminar todos los controles remotos). Luego cree la misma etiqueta y presione.
fuente