使用与远程标签同名的本地分支推送到Git仓库。

160
我试图将一个名为product-0.2的本地分支推送到远程仓库,但是已经有一个同名的标签(但该分支本身不存在)。
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'

与之相同:

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

虽然倒过来操作是可行的,例如创建一个分支 product-0.1,提交并应用标签 product-0.1,但有些人会通过在本地删除冲突的标签,然后推送分支,再获取远程标签的方式来解决此问题,但这似乎很麻烦且容易出错。

有什么方法可以轻松创建我的分支吗?

感谢您的建议。


1
尝试使用refs/heads/product-0.2:refs/heads/product-0.2,即不带前导斜杠,并在本地端提供完整的refspec。 - knittl
可以尝试使用git push origin product-0.2:product-0.2。 - vpatil
10个回答

201
以下命令应该可以工作。
git push origin refs/heads/product-0.2:refs/heads/product-0.2 

20
接受的答案是消除歧义的方法。但最好的方法是一开始就不要使用相同名称的标签和分支。有些工具(例如SourceTree)会遇到问题,你将不得不自己解决,只能使用命令行作为解决方案。谢谢大家! - youri
3
+1. 当需要消除远程名称歧义时,类似的事情也适用:refs/remotes/remote_name/remote_branch - Kelvin
1
不知不觉地将一个标记的版本命名为“master”,无法再推送到同名的分支。git push origin refs/heads/master解决了这个问题(然后我删除了那个标记,以防止再次发生)。 - tresf
除了最佳实践之外,如果您尝试推送的分支是默认分支,您仍将无法推送。我们该如何解决这个问题? - Baksteen
1
如果上述解决方案无效,请在删除远程头后再执行此操作。 git push origin --delete refs/heads/BRANCHNAME - alones

67

验证与您的分支相关联的标签:

git tag
在我的情况下,我有一个与分支同名的标签。删除它可以解决问题:

在我的情况下,我有一个与分支同名的标签。删除它可以解决问题:

git tag -d [tag-name]

2
工作正常,有一个与我的分支同名的标签。 - ChanceVI
我仍然收到这个错误提示:提示:更新被拒绝,因为标签已经存在于远程。 - IgorGanapolsky

45
如果您试图推送与分支同名的标签:
git push origin tag myTag

4
干得好,先生!这应该是被接受的答案。总是阅读长尾的SO回答。 - louis_guitton
1
这是有用的知识,但完全没有回答问题。我不会给它投反对票,因为作者强调了相反的观点,但作为答案几乎不可接受。 - Peter Halverson
1
这应该是可以接受的答案,我一直在寻找这个命令。 - Rajat Singh

25

今天早上我试图向一个主仓库推送,但遇到了以下错误:

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

这是因为我在本地意外创建了一个主标签:

$ git tag
master
tag1
tag2
tag3
tag4

我在本地删除了这个标签:

git tag -d master

我又能够推动了。


2
好的解释。需要删除本地标签。谢谢! - Chef Pharaoh
如果由于某种原因它匹配了多个远程,您可以通过以下方式删除标签或主远程: git push origin :refs/tags/tag1 - soloturn
我收到了这个错误:main -> refs/heads/main(已存在) - IgorGanapolsky

25

更改名称。

无论您是在本地还是远程操作,只需更改名称即可。

在Git中,标签和分支本质上是相同的:它们表示指向提交的指针。区别在于分支指针随着您进行提交而推进,而标签保持静态。

然而,您可以对分支或标签执行git checkout操作。为什么要与所有这些重复的名称作斗争? 更改它们。


应该/可以使用最后一位数字来调用标签product-0.2.0以表示“补丁级别”,但是我们已经有了命名约定,并且在创建分支之前就没有遇到过问题。 - youri
如果团队已经开始使用该分支,重命名它不会有害吗? - svassr
更改尚未推送的实体名称。 - TheBuzzSaw
你确定吗,@TheBuzzSaw?因为在本地,我可以使用相同的名称,但它们是不同的东西。 - John John Pichler
1
虽然上面的命令(作为所选答案)可能已经解决了问题,但由于我是 Git 的新手,我既不理解问题也不理解答案。这个答案至少提供了 a) 建议和 b) 解释 - 甚至还有未来的建议。我本来会考虑提出自己的问题,但我厌倦了像“已经问过”的评论 - 在我看来:一个不可理解的问题并不等同于一个初学者的问题。但这就是生活 ;) - Michael Felt

9

这个失败了:

git push $origin $branch:$branch 

这对我起了作用:

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

ssh: Could not resolve hostname head: nodename nor servname provided, or not known - IgorGanapolsky

2

如果您正在使用SourceTree,请按照以下步骤操作:

  1. 在标签部分找到分支的标签名称
  2. 点击标签名称,然后删除标签
  3. 确保您选中了“从远程删除标签”,然后点击确定

再次尝试推送您的更改,现在应该可以正常工作。


2
我们的团队需要将本地分支与同名TAG一起推送到存储库中。
这是因为 ARGO 需要部署Moodle应用程序,但不支持直接构建子模块。因此,另一个团队创建了一个TAG,而我们实际上需要一个BRANCH。
步骤如下:
1. 从标签中拉取存储库。 2. git switch -c BRANCH。 3. git push --set-upstream origin BRANCH。
出现错误:
error: src refspec alt_v1.2.2 matches more than one error: failed to push some refs to 'https://gitlab.com/SOME_URL.git'
解决方案:
1. git tag -d alt_v1.2.2。 2. git push --set-upstream origin BRANCH。
问题解决!

1
如果您有一个具有相同名称的标签和分支,并且尝试将它们推送而没有指定操作对象,也会发生这种情况。当然,GIT 会感到困惑。

0
这是一个bug。如果存在同名的标签,就无法浏览一个分支。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接