git push rama local con el mismo nombre que etiqueta remota

110

Estoy tratando de enviar una nueva rama local product-0.2a remota donde ya hay una etiqueta con el mismo nombre (pero la rama en sí no existe)

git push -v --tags --set-upstream origin product-0.2:product-0.2 
Pushing to https://****@github.com/mycompany/product.git
error: src refspec product-0.2 matches more than one.
error: failed to push some refs to 'https://****@github.com/mycompany/product.git'

Lo mismo con:

git push origin product-0.2:/refs/heads/product-0.2 

Aunque funciona al revés, por ejemplo, crea una rama product-0.1, confímate y luego aplica una etiqueta product-0.1.

Algunas personas solucionan esto eliminando la etiqueta en conflicto localmente, luego empujan la rama y luego recuperan la etiqueta remota, pero parece engorrosa y propensa a errores.

¿Cómo puedo crear mi rama con el mínimo esfuerzo?

Gracias por tu contribución

youri
fuente
1
Pruebe refs/heads/product-0.2:refs/heads/product-0.2, es decir, sin la barra inclinada inicial, y también con la especificación de referencia completa en el lado local.
Knittl
Puede probar git push origin product-0.2: product-0.2
vpatil

Respuestas:

162

El siguiente comando debería funcionar.

git push origin refs/heads/product-0.2:refs/heads/product-0.2 
ralphtheninja
fuente
16
Respuesta aceptada, esta es la forma de desambiguar. Aún así, es mucho más fácil no tener etiquetas y ramas con el mismo nombre en primer lugar. Algunas herramientas (por ejemplo, SourceTree) se tropezarán con él y usted se quedará con sus propios dispositivos, con la línea de comandos como única solución. ¡Gracias chicos!
youri
2
+1. Algo similar funciona cuando necesitas eliminar la ambigüedad de nombres remotos:refs/remotes/remote_name/remote_branch
Kelvin
1
Sin saberlo, había nombrado una versión etiquetada mastery ya no podía empujar a la sucursal con el mismo nombre. git push origin refs/heads/masterhizo el truco (luego eliminé esa etiqueta para que dejara de suceder).
tresf
Aparte de las mejores prácticas, aún no podría enviar la rama a la que está intentando enviar la rama predeterminada. ¿Cómo podemos solucionar eso?
Baksteen
Si la solución anterior no funciona, hágalo después de quitar el cabezal remoto. git push origin --delete refs / heads / BRANCHNAME
solo
42

Verifique qué etiquetas están asociadas con su rama:

git tag

En mi caso, tenía una etiqueta con el mismo nombre de la sucursal. Eliminarlo funcionó:

git tag -d [tag-name]
ecairol
fuente
1
Funcionó bien, tenía una etiqueta con el mismo nombre que mi rama.
ChanceVI
20

Cambie los nombres.

Ya sea que lo haga de forma local o remota, simplemente cambie los nombres.

Una etiqueta y una rama son fundamentalmente lo mismo en git: representan un puntero a una confirmación. La diferencia es que un puntero de rama avanza a medida que realiza confirmaciones, mientras que una etiqueta permanece estática.

Sin embargo , puede realizar una git checkouten una rama o en una etiqueta. ¿Por qué pelearías con todos estos nombres duplicados? Cámbialos.

TheBuzzSaw
fuente
Debería / podría haber llamado a la etiqueta product-0.2.0con el último dígito para el 'nivel de parche', pero aún así, teníamos la convención de nomenclatura en su lugar y no tuvimos problemas en el pasado cuando la rama se creó antes de la etiqueta.
youri
Si el equipo ya comenzara a usar la rama, ¿no sería bueno cambiarle el nombre?
svassr
Cambie el nombre de la entidad que aún no ha enviado.
TheBuzzSaw
¿Estás seguro de esto @TheBuzzSaw? Porque localmente puedo tener ambos con el mismo nombre, como cosas diferentes.
John John Pichler
1
Si bien el comando (como respuesta seleccionada) anterior puede haber resuelto la pregunta, al ser nuevo en git, no entendí ni la pregunta ni la respuesta. ESTA respuesta al menos da a) un consejo yb) una explicación, incluso una recomendación para el futuro. Habría considerado hacer mi propia pregunta, pero me canso de comentarios como los que ya se hicieron antes, en mi humilde opinión: una pregunta que no es comprensible no es lo mismo que una pregunta de principiante. Pero así es la vida;)
Michael Felt
15

Si está intentando enviar una etiqueta que tiene el mismo nombre de una rama:

git push origin tag myTag
Paulo Merson
fuente
3
bien hecho señor! esta debería ser la respuesta aceptada. Siempre lea las respuestas de SO de cola larga
louis_guitton
Es útil saberlo, pero no responde la pregunta en absoluto. No lo rechazaré, ya que el autor enfatiza que es al revés, pero difícilmente aceptable como respuesta.
Peter Halverson
12

Estaba tratando de enviar a un repositorio canónico esta mañana y obtuve el siguiente error:

$ git push origin master
error: src refspec master matches more than one.
error: failed to push some refs to 'ssh://user@host/srv/git/repo'

Esto sucedió porque accidentalmente había creado una etiqueta maestra localmente:

$ git tag
master
tag1
tag2
tag3
tag4

Una vez que eliminé esta etiqueta localmente:

git tag -d master

Pude empujar de nuevo.

Jasbeer Rawal
fuente
Buena explicación. Necesita eliminar la etiqueta local. ¡Gracias!
Chef Pharaoh
5

Esto falló:

git push $origin $branch:$branch 

Si bien esto funcionó para mí:

git checkout $branch
git push $origin HEAD:$branch
RzR
fuente
1

Si está utilizando el árbol de fuentes, siga los siguientes pasos.

  1. busque el nombre de etiqueta de la rama en la sección de etiquetas
  2. haga clic en el nombre de la etiqueta eliminar etiqueta.
  3. Asegúrese de marcar "eliminar etiquetas del control remoto" y haga clic en Aceptar

Intente nuevamente impulsar sus cambios. ahora esto funcionará.

Muhammad Bilal
fuente