如何删除已推送的Git标记?


当前回答

如果您有一个远程标签v0.1.0要删除,并且您的远程标签是源,那么只需:

git push origin :refs/tags/v0.1.0

如果您还需要在本地删除标记:

git tag -d v0.1.0

有关Git异常的解释,请参见Adam Franco的回答:删除语法。

其他回答

您可以将“空”引用推送到远程标记名:

git push origin :tagname

或者,更明确地说,使用--delete选项(如果git版本早于1.8.0,则使用-d):

git push --delete origin tagname

注意,git具有标记名称空间和分支名称空间,因此您可以对分支和标记使用相同的名称。如果要确保不会意外删除分支而不是标记,可以指定full ref,该ref将永远不会删除分支:

git push origin :refs/tags/tagname

如果还需要删除本地标记,请使用:

git tag --delete tagname

出身背景

将分支、标记或其他引用推送到远程存储库涉及指定“哪个repo、哪个源、哪个目标?”

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

通过省略源ref(冒号之前的部分),可以将“nothing”推送到目标,删除远程端的ref。

这两个步骤效果很好:

# 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

如果您创建了一个以#字符开头的标记,例如#ST002,您可能会发现无法使用正常模式删除。即

git tag -d #STOO2

不会删除标记,而是将其包装为字符串文字

git tag -d "#ST002" or git tag -d '#ST002'

这将使其被删除。希望它能帮助那些错误使用#来写标签名的人。

我想删除所有标签,除了那些与模式匹配的标签,这样我就可以删除除最后几个月的生产标签之外的所有标签,这是我取得巨大成功的原因:

删除所有远程标记并从删除中排除表达式

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs -n 1 git push --delete origin

删除所有本地标记并从删除中排除表达式

git tag -l | grep -P '^(?!Production-2017-0[89])' | xargs git tag -d

如果您在Git存储库中创建了一个名为release01的标记,您可以通过执行以下操作将其从存储库中删除:

git tag -d release01 
git push origin :refs/tags/release01 

要从Mercurial存储库中删除一个:

hg tag --remove featurefoo

请参考https://confluence.atlassian.com/pages/viewpage.action?pageId=282175551