git push branche locale avec le même nom que la balise distante

110

J'essaye de pousser une nouvelle branche locale product-0.2à distance où il y a déjà une balise avec le même nom (mais la branche elle-même n'existe pas)

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'

Même avec:

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

Bien que l'inverse fonctionne, par exemple créer une branche product-0.1, valider dessus puis appliquer une balise product-0.1.

Certaines personnes contournent ce problème en supprimant localement la balise en conflit, puis en poussant la branche, puis en récupérant la balise distante, mais cela semble fastidieux et sujet aux erreurs.

Comment puis-je créer ma branche avec un minimum de tracas?

Merci pour votre contribution

youri
la source
1
Essayez refs/heads/product-0.2:refs/heads/product-0.2, c'est-à-dire sans la barre oblique principale, et en donnant également le refspec complet du côté local.
knittl
Peut essayer git push origin product-0.2: product-0.2
vpatil

Réponses:

162

La commande suivante devrait fonctionner.

git push origin refs/heads/product-0.2:refs/heads/product-0.2 
ralphtheninja
la source
16
Réponse acceptée, c'est le moyen de lever l'ambiguïté. Pourtant, il est beaucoup plus facile de ne pas avoir de balises et de branches avec le même nom en premier lieu. Certains outils (par exemple SourceTree) tomberont dessus et vous serez laissé à vous-même, avec la ligne de commande comme seule solution. Merci les gars!
youri
2
+1. Une chose similaire fonctionne lorsque vous devez lever l'ambiguïté des noms distants:refs/remotes/remote_name/remote_branch
Kelvin
1
Avait nommé sans le savoir une version balisée masteret ne pouvait plus pousser vers la branche du même nom. git push origin refs/heads/mastera fait l'affaire (puis j'ai supprimé cette balise pour qu'elle cesse de se produire).
tresf
Mis à part les meilleures pratiques, vous ne pourrez toujours pas pousser la branche vers laquelle vous essayez de pousser est la branche par défaut. Comment pouvons-nous contourner cela?
Baksteen
Si la solution ci-dessus ne fonctionne pas, veuillez le faire après avoir retiré la tête de la télécommande. git push origin --delete refs / heads / BRANCHNAME
seul le
42

Vérifiez les balises associées à votre succursale:

git tag

Dans mon cas, j'avais une étiquette avec le même nom de la branche. La suppression a fonctionné:

git tag -d [tag-name]
écairol
la source
1
A bien fonctionné, avait une étiquette avec le même nom que ma branche.
ChanceVI
20

Changez les noms.

Que vous le fassiez localement ou à distance, changez simplement les noms.

Une balise et une branche sont fondamentalement la même chose dans git: elles représentent un pointeur vers un commit. La différence est qu'un pointeur de branche avance à mesure que vous effectuez des validations, tandis qu'une balise reste statique.

Cependant , vous pouvez effectuer une git checkoutsur une branche ou une balise. Pourquoi vous battriez-vous avec tous ces noms doublés? Changez-les.

TheBuzzSaw
la source
Aurait / aurait pu appeler la balise product-0.2.0avec le dernier chiffre pour le `` niveau de patch '' mais quand même, nous avions la convention de dénomination en place et nous n'avons pas rencontré de problèmes dans le passé lorsque la branche a été créée avant la balise.
youri le
Si l'équipe commençait déjà à utiliser la branche, ne serait-il pas possible de la renommer?
svassr
Modifiez le nom de l'entité que vous n'avez pas encore poussée.
TheBuzzSaw
Êtes-vous sûr de cela @TheBuzzSaw? Parce que localement, je peux avoir les deux avec le même nom, comme des choses différentes.
John John Pichler
1
Alors que la commande (en tant que réponse sélectionnée) ci-dessus peut avoir résolu la question - étant nouveau pour git, je n'ai compris ni la question ni la réponse. CETTE réponse donne au moins a) des conseils et b) une explication, voire des recommandations pour l'avenir. J'aurais envisagé de poser ma propre question, mais je me lasse des commentaires tels que déjà posés auparavant - à mon humble avis: une question qui n'est pas compréhensible n'est pas la même chose qu'une question pour débutant. Mais c'est la vie;)
Michael Felt
15

Si vous essayez de pousser une balise qui porte le même nom qu'une branche:

git push origin tag myTag
Paulo Merson
la source
3
bravo monsieur! cela devrait être la réponse acceptée. toujours lire la longue queue SO répond
louis_guitton
Il est utile de savoir, mais ne répond pas du tout à la question. Je ne vais pas le rejeter, car l'auteur tient à souligner que c'est l'inverse, mais que la réponse n'est guère acceptable.
Peter Halverson
12

J'essayais de pousser vers un référentiel canonique ce matin et j'ai eu l'erreur suivante:

$ 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'

Cela s'est produit parce que j'avais accidentellement créé une balise principale localement:

$ git tag
master
tag1
tag2
tag3
tag4

Une fois que j'ai supprimé cette balise localement:

git tag -d master

J'ai pu à nouveau pousser.

Jasbeer Rawal
la source
Bonne explication. Besoin de supprimer la balise locale. Merci!
Chef Pharaoh
5

Cela a échoué:

git push $origin $branch:$branch 

Bien que cela ait fonctionné pour moi:

git checkout $branch
git push $origin HEAD:$branch
RzR
la source
1

Si vous utilisez l'arborescence des sources, suivez les étapes suivantes.

  1. trouver le nom du tag de la branche dans la section tags
  2. cliquez sur le nom de la balise supprimer la balise.
  3. Assurez-vous de cocher "Supprimer les balises de la télécommande" et cliquez sur OK

Essayez à nouveau de pousser vos modifications. maintenant cela fonctionnera.

Muhammad Bilal
la source