在使用SourceTree推送时,出现“更新被拒绝,因为标签已经存在”的错误提示。

199

当尝试通过Source Tree进行Push时,我收到以下错误:

git -c diff.mnemonicprefix=false -c core.quotepath=false -c credential.helper=sourcetree push -v --tags origin refs/heads/master:refs/heads/master 
Pushing to https://user@github.com/repo.git
To https://user@github.com/repo.git
 = [up to date]      master -> master
...
 ! [rejected]        example_tag -> example_tag (already exists)
updating local tracking ref 'refs/remotes/origin/master'
error: failed to push some refs to 'https://user@github.com/repo.git'
hint: Updates were rejected because the tag already exists in the remote.
Completed with errors, see above

据我所知,我没有对此标签进行任何更改。我该如何修复这个问题?

6个回答

366

你还可以在Git Bash中解决此问题(在Source Tree UI中点击“终端”按钮)。输入:

git pull --tags

如果您遇到标签冲突,可以在命令中包含-f选项,以使用其远程版本覆盖本地的冲突标签。

git pull --tags -f

4
我认为这是最佳答案,因为这是最省力的选择。 - Chad
94
如果您希望覆盖本地存在的冲突,可以执行git pull --tags -f命令。 - DenLilleMand
7
在SourceTree中,点击“获取”(Fetch),然后启用“获取所有标签”(fetch all tags)即可。 - Darkgaze
@DenLilleMand的评论应该被接受为答案。 - Fred Zimmerman

142
如果您没有对要保留的标记进行任何本地更改,则可以删除被拒绝的标记,因为它已经存在(在此示例中是example_tag):
  1. 右键单击该标记并选择删除它(一定要取消选中“从所有远程删除标记”复选框)。
  2. 选择获取选项(不需要启用“获取并存储所有本地标记”)。
  3. 现在您应该已经恢复了刚刚删除的标记,并且尝试 推送 将不再显示该错误消息。
这在SourceTree中很常见,因为全部推送标记选项默认为开启。(隐藏此错误的另一种方法是取消选中该选项。)

“将所有标签本地获取并存储不必启用”是解决问题的关键,检查它只会导致问题重复出现。 - Tom
假设上游(源)仓库是真相,这个解决方案是最不具破坏性的,并且可以立即修复问题。 - Steve Henty
1
不幸的是,当您有15个被拒绝的标签时,第1、2和3步可能会非常繁琐。是的,禁用“推送所有标签”选项可能是正确的选择。 - aaa
“右键”在哪里?你假设使用什么类型的IDE? - ricoms
“这在SourceTree中很常见的原因是默认情况下Push all tags选项被设置为开启状态。(隐藏此错误的另一种方法是取消选中该选项。)” 这正是我需要的。 - samthui7

54

git pull --tags 命令通常很有效,但有时您仍可能遇到错误。例如,错误信息可能如下:

 ! [rejected]        example_tag      -> example_tag  (would clobber existing tag)

这个问题可以通过以下命令解决: git pull --tags -f

-f 代表 强制

来源:

https://github.com/concourse/git-resource/issues/233


37

确认进行git push时,请在UI底部取消选中push all tags


你是不是想说“推送所有标签”? - Wodin
太好了!没有注意到。谢谢。 - Meg-90
@Wodin,如果您在UI中勾选了“推送所有标签”,它将尝试覆盖先前的标签。但是,您必须取消勾选才能防止覆盖。 - JDev-Guns
@JDev-Guns 我只是在询问措辞。你最初说的是push all TABs。我不熟悉SourceTree,但我怀疑你想说的是TAGs而不是TABs - Wodin
@Wodin 哦,明白了!我想我说的是“TAGs”,但如果我没有说,我想说的是“TABs”。 - JDev-Guns
显示剩余3条评论

29

在推送时,请确保取消“Push all tags”按钮的选中状态。

输入图像描述


如上所述,如果您在本地添加了一个新标签,这是否意味着它没有推送到远程? - bytedev

3

在SourceTree中,这似乎是有效的:

  1. 点击“获取”图标
  2. 勾选“获取所有标签”
  3. 点击确定

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