当远程已存在标签时,如何使用 Git 强制推送标签

80

我已经把一个标签推送到了远程。当另一个用户创建相同的标签并尝试推送时,由于该标签已经存在于远程,推送将失败。

但是,我认为如果我使用--force参数进行标签强制推送,这应该可以解决问题。但事实并非如此。

我认为我必须这样做。

 Create tag
 Push tag -> If push fails -> Delete tag on remote
                           -> push tag again.

这是否正确?推送标签时不应该解决这个问题吗?

我正在使用带有注释的标签

 git -a v1.0 -f -m "message"

1
你尝试过像 git push origin :refs/tags/tag_name 这样的命令来删除远程标签吗? - John Powell
4
通常情况下,您可以强制推送一个标签,但远程可能会禁止这样做。通常情况下,您可以在远程上删除该标签,但是远程也可能禁止这样做。如果远程设置得足够严格,则您需要让具有直接访问权限的人来更新远程。另请参见https://dev59.com/l2Ik5IYBdhLWcg3wadgD。 - torek
好的。我认为-f应该总是强制更新远程标签。我会使用我添加的删除和重新创建逻辑来实现这一点。感谢您的回复。 - user3606175
这个回答解决了你的问题吗?重新创建git标签后出现“tag already exists in the remote”错误 - SherylHohman
奇怪的是,在 Git 2.28 上,git push origin <tag> -f 对我起作用了。 - Dr_Zaszuś
7个回答

104
这将强制推送所有标签并覆盖现有标签。
git push -f --tags

2
非常好的答案,谢谢。或者,如果你的远程仓库不叫“origin”,那么使用命令 git push <remote name> -f --tags - Reversed Engineer
14
不建议这样做,因为它会推送所有本地标签。通常会出现由于错误创建的过期或仅限本地使用的标签,这些标签不应被推送。 - Steven Mark Ford
@StevenMarkFord,那应该怎么做呢? - Vassilis
@Vassilis 这里的 Stack Overflow 问题基本上是如何解决尝试推送到已经包含您要推送的标签的分支的问题(即失败,因为标签已经存在)。您可以在远程上删除标签或在推送之前在本地删除标签,请参见:https://devconnected.com/how-to-delete-local-and-remote-tags-on-git/。 - Steven Mark Ford

87

在我的情况下,当标签已经存在时,远程拒绝了一个force push。

因此,当push被拒绝时,我执行了以下操作:

git push --delete origin <tagname>

并推送了新标签。

请查看Torek对我的问题的评论。有一种情况是远程也可以拒绝删除。


19

首先,在本地更新您的标记:

git tag v0.6.0 -f
Updated tag 'v0.6.0' (was cb85425)

然后更新远程标签:
git push origin v0.6.0 -f
Total 0 (delta 0), reused 0 (delta 0)

 + cb85425...bf17993 v0.6.0 -> v0.6.0 (forced update)

2
应该被接受为答案,问题询问的是“A标签”,而不是“所有标签”。 - Art3mix

6

我建议不要强制推送所有标签-显然这会覆盖所有本地标签。 在具有使用移动标签表示状态或后来添加任何此类功能的情况下,这可能会造成损害。

如果您只想强制推送/覆盖一个标签而不是所有标签,请执行以下操作:

git push origin tagName -f


1
基本上您正在询问如何解决尝试推送到已包含您要推送的标签的分支的问题(即失败,因为标签已经存在)。 您可以在远程或本地推送之前删除标签。请参见:devconnected.com/how-to-delete-local-and-remote-tags-on-git
注意:不要使用,或在使用时小心。
git push -f --tags

因为尽管在某些情况下这可能有效,但请注意它会推送所有本地标签,并且通常会出现由于错误创建的过期/仅限本地的标签,不应该被推送。


0
如果你遇到了fatal: tag 'beta' already exists错误,请使用:
git tag -a beta --force  #To create tag locally
git push -f --tags #To push your tag to the repository

-3

首先,在远程中删除您想要替换的标签:

git push origin --delete <tag-name>

然后将您的标签推送到远程:

git push --tags

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