2012-02-21 21 views
68

Estoy intentando empujar una nueva rama local product-0.2 a distancia donde ya hay una etiqueta con el mismo nombre (pero la rama en sí no existe)git push rama local con el mismo nombre como una etiqueta a distancia

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' 

mismo con:

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

Aunque el revés funciona, por ejemplo, crea una rama product-0.1, confirma y luego aplica una etiqueta product-0.1.

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

¿Cómo puedo crear mi sucursal con un alboroto mínimo?

Gracias por su entrada

+1

Pruebe 'refs/heads/product-0.2: refs/heads/product-0.2', es decir, sin la barra inicial, y también dando el refspec completo en el lado local. – knittl

+0

Puede probar el producto de origen de git push-0.2: producto-0.2 – vpatil

Respuesta

103

El siguiente comando debería funcionar.

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

Respuesta aceptada, esta es la manera 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) tropezarán con esto y usted quedará en sus propios dispositivos, con la línea de comando como única solución. ¡Gracias chicos! – youri

+0

Det var sa sa sa sa :) – ralphtheninja

+1

+1.Algo similar funciona cuando necesitas desambiguar nombres remotos: 'refs/remotes/remote_name/remote_branch' – Kelvin

13

Cambiar los nombres. Ya sea que lo haga de manera local o remota, simplemente cambie los nombres. Una etiqueta y una rama son básicamente 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 un git checkout en una rama o una etiqueta. ¿Por qué pelearías con todos estos nombres duplicados? Cámbialos.

+0

Debería/podría haber llamado a la etiqueta 'product-0.2.0' con 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 era creado antes de la etiqueta. – youri

+0

Si el equipo ya comenzó a usar la rama, ¿no sería necesario cambiarle el nombre? – svassr

+0

Cambia el nombre de la entidad que aún no has pulsado. – TheBuzzSaw

1

Este fallidos:

git push $origin $branch:$branch 

Si bien esto funcionó para mí:

git checkout $branch 
git push $origin HEAD:$branch 
16

verificar lo que las etiquetas están asociados con su rama:

git tag 

En mi caso, tuve una etiqueta con el mismo nombre de la rama. Eliminación funcionó:

git tag -d [tag-name] 
3

yo estaba tratando de empujar a un repositorio canónica de esta mañana y tengo el siguiente error:

$ git push origin master 
error: src refspec master matches more than one. 
error: failed to push some refs to 'ssh://[email protected]/srv/git/repo' 

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

$ git tag 
master 
tag1 
tag2 
tag3 
tag4 

Una vez que he eliminado esta etiqueta a nivel local:

git tag -d master 

Pude volver a presionar.

+0

Buena explicación. Necesita eliminar la etiqueta local. ¡Gracias! –

Cuestiones relacionadas