如何删除远程标签?

4745

我该如何删除已经推送的 Git 标签?

29个回答

7723

你可以将一个“空”引用推送到远程标签名称:

git push origin :tagname

或者更加表达清晰,使用--delete选项(如果你的git版本早于1.8.0,则为-d):

git push --delete origin tagname

请注意,git具有标签命名空间和分支命名空间,因此您可以为分支和标签使用相同的名称。如果您想确保不会意外删除分支而不是标签,则可以指定完整引用,这将永远不会删除分支:

git push origin :refs/tags/tagname

如果你需要同时删除本地标签,使用以下操作:

git tag --delete tagname

背景

将分支、标签或其他引用推送到远程仓库涉及指定“哪个仓库,什么来源,什么目的地?”。

git push remote-repo source-ref:destination-ref
一个实际的例子,你将你的主分支推送到源的主分支:
git push origin refs/heads/master:refs/heads/master

由于默认路径,它可以被缩短为:

git push origin master:master

标签的工作方式相同:

git push origin refs/tags/release-1.0:refs/tags/release-1.0

这也可以简写为:

git push origin release-1.0:release-1.0

省略源引用(冒号前面的部分)会将“空值”推送到目标,从而删除远程端的引用。


260
好的,我会尽力进行翻译。以下是需要翻译的内容:+1 对于回答问题和解释一般情况都很好,而且详细说明了未经删节的语法的含义。 - Peter Host
121
如果有人想知道如何一次删除多个标签,只需使用空格将它们列出即可,例如 git push --delete origin tag1 tag2。对于本地标签的删除同样有效,使用命令 git tag -d tag1 tag2 - Dmitry
10
如果标签名称与分支名称冲突,可能会导致删除你的分支。哈哈。请查看第二个答案——它更加"生态友好"。 - zuba
5
有趣的是,运行命令git tag -d \git tag`可以删除所有本地标签。如果你已经把远程标签拉到本地,那么通过运行命令git push --delete origin `git tag``同样可以删除所有远程标签。在测试环境中这非常方便。 - DarkFranX
4
我们目前已经获得6700多个赞,而且这个问题如此复杂,这可能意味着它需要重新设计。 - LMS5400
显示剩余3条评论

590

一种更简单的方法是

git push --delete origin YOUR_TAG_NAME

在我看来,在这种情况下使用冒号语法前缀有点奇怪。


7
我认为这是正确的方式...其他语法看起来更像是hack。 - Luigi R. Viggiano
20
可以。补充一下:如果你有一个同名的分支和标签,你可以在标签名前加上单词“tag”以确保获取到的是标签而非分支。 - andypaxo
13
该命令需要 refspecs 参数,正确的方式是在标签前面加上 refs/tags/,例如:refs/tags/v2.3.1。请参考以下翻译:@andypaxo 命令所需内容为refspecs,正确的方法是在标签前加上 'refs/tags/',如:'refs/tags/v2.3.1'。 - p3lim
我在远程服务器上不知何故创建了一个带有特殊字符的“坏”标签名称,因此无法与之同步,所以根据您的建议简单地将其删除:git push --delete origin "service--<default>--151",无法使用intellij、stash或sourceTree删除它。谢谢! - Dmitri Algazin
2
对于那些在很久之后阅读这篇答案的人来说,当时(现在已被接受的)答案中没有这个内容;后来,这个答案的内容被(非常狭窄地)建议编辑到了被接受的答案中。这是一个奇怪的边缘情况,Stack Overflow 的“最佳答案上升到顶部系统”有点失败了,一方面我很高兴被接受的答案有正确的信息,因为大多数读者不会看过头部答案,但我对我们如何到达这里并不感到高兴……我希望未来的读者不会认为这个答案只是复制/粘贴。 - jrh

273

如果你想要删除一个名为v0.1.0的远程标签,而且你的远程库名称是origin,那么只需要执行以下命令:

git push origin :refs/tags/v0.1.0

如果你还需要在本地删除标签:

git tag -d v0.1.0

查看Adam Franco的答案,了解Git中用于删除的不寻常的:语法的解释。


2
这也适用于jgit。使用“:tag”简写在jgit中不起作用。 - rynop
我收到了 fatal: remote part of refspec is not a valid name in :/refs/tags/0.0.1 的错误信息。 - Chaim Eliyah
3
@ChaimEliyah,你的路径前面有一个斜杠,也许这就是你的问题所在。 - Joffrey
5
更好的答案是,如果你有一个分支和一个同名的标签,这也适用。 - Erik A. Brandstadmoen
远程删除只需要使用 :tagname 即可。 - Asclepius
最佳答案:实际上,您要删除的是相同的标签,而不是例如之前的标签。 - tikej

127

删除所有本地标签,并获取远程标签列表:

git tag -l | xargs git tag -d
git fetch

移除所有远程标签

git tag -l | xargs -n 1 git push --delete origin

清理本地标签

git tag -l | xargs git tag -d

3
如何从本地和远程仓库中删除所有标签。这正是我一直在寻找的,谢谢! - Jorge Orpinel Pérez
git fetch,删除远程分支,然后清理本地分支,完美运行! - DiegoRBaquero
慢,但最直接的。 - Lucent Fox
但是,当另一个人执行 git-push 时,所有已删除的标签都将被保留。 - flyflydogdog

87

git push --delete origin $TAGNAME是正确的做法(除了本地删除之外)。

但是要确保使用Git 2.31+(2021年第一季度)。

"git push $there --delete"(man)应该被诊断为错误,但转换为匹配推送,这已在Git 2.31(2021年第一季度)中得到修正。

请参见20e4164提交记录(2021年2月23日),作者为Junio C Hamano(gitster
(合并者为Junio C Hamano -- gitster --1400458提交记录,2021年2月25日)

push: 不要将--delete ''转换为匹配推送

发现者:Tilman Vogel

当我们将语法糖"git push remote --delete"(手册)添加到" git push"(手册) 作为规范的git push remote(手册) 的同义词时,存在一个问题:我们没有仔细确认<ref>不为空。该语法糖在 f517f1f(“builtin-push: add(手册) --delete 作为语法糖,用于表示“:foo””,2009-12-30,Git v1.7.0-rc0 -- 合并)中被引入。

盲目将“--delete ”重写为“:”意味着空字符串会导致refspe c“:” ,这是请求“匹配”推送而不删除任何内容的语法。
更糟糕的是,如果存在可以快进的匹配refs,则它们会过早发布,即使用户觉得它们还没有准备好被推出也会是真正的灾难。

1
它可以工作!真该死,为什么他们不在GitHub的发布中添加这个选项。我正在使用旧版的压缩包更新相同的标签,花了一段时间才注意到日期不对。然后我尝试了几次,直到看到了这个页面。 - Uneconscience UneSource

79

在您的终端中,执行以下操作:

git fetch
git tag
git tag -d {tag-name}
git push origin :refs/tags/{tag-name}

现在前往Github.com并刷新页面,它们就会消失。


68
git tag -d your_tag_name
git push origin :refs/tags/your_tag_name

第一行代码从本地仓库中删除your_tag_name,第二行代码从远程仓库中删除your_tag_name

对于使用GitHub的用户,还需要执行一个步骤:放弃草稿enter image description here


52

这两个步骤运行良好:

# delete local tag '1.0.0'
git tag -d 1.0.0

# delete remote tag '1.0.0' (eg, GitHub version too)
git push origin :refs/tags/1.0.0

46
从远程代码库中删除标签的方法如下:
git push --delete origin TAGNAME

您可能还希望在本地删除该标记:

git tag -d TAGNAME

一行代码实现两个操作:git push --delete origin TAGNAME && git tag -d TAGNAME - sakurashinken

28

删除本地标签 '12345'

git tag -d 12345

删除远程标签 '12345'(例如:GitHub 版本)

git push origin :refs/tags/12345

替代方法

git push --delete origin tagName
git tag -d tagName

在这里输入图片描述


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