我在主分支上创建了一个名为v0.1的标签,如下所示:

git tag -a v0.1

但后来我意识到,在0.1版的master中还需要合并一些更改,所以我就这么做了。但是现在我的v0.1标签被粘在了错误的提交上(引用便利贴的类比)。我希望它卡在主节点上的最近提交上,但它却卡在主节点上的第二个最近提交上。

我如何移动它到最近提交的主?


当前回答

还有一种方法:

移动标签在远程回购。(如有需要,请更换HEAD。)

$ git push --force origin HEAD:refs/tags/v0.0.1.2

取回更改。

$ git fetch --tags

其他回答

对git标签使用-f选项:

-f
--force

    Replace an existing tag with the given name (instead of failing)

您可能希望将-f与-a结合使用,以强制创建一个带注释的标记,而不是无注释的标记。

例子

在按之前,请删除任何遥控器上的标签 Git push origin:refs/tags/<tagname> 替换标记以引用最近的提交 Git标签-fa <tagname> 将标签推到远端原点 Git push origin master——tags

在使用Git时,我试图避免一些事情。

使用内部知识,例如refs/tags。我尝试只使用文档中的Git命令,避免使用需要了解. Git目录内部内容的东西。(也就是说,我把Git当作一个Git用户,而不是Git开发人员。) 不需要时使用武力。 过分的事情。(按压一个分支和/或许多标签,以获得我想要的标签。)

因此,这里是我在本地和远程更改标记的非暴力解决方案,而不需要了解Git内部结构。

当软件修复最终出现问题,需要更新/重新发布时,我会使用它。

git tag -d fix123                # delete the old local tag
git push github :fix123          # delete the old remote tag (use for each affected remote)
git tag fix123 790a621265        # create a new local tag
git push github fix123           # push new tag to remote    (use for each affected remote)

Github是一个示例远程名称,fix123是一个示例标记名称,790a621265是一个示例提交。

如果期望的最终结果是更新远程上已经存在的标签的内容:

Git checkout <tag_name> 提交您的更改 Git标签-f <tag_name> Git push -f origin <tag_name>

总结一下,如果你的远程名为origin并且你正在主分支上工作:

git tag -d <tagname>                  # delete the old tag locally
git push origin :refs/tags/<tagname>  # delete the old tag remotely
git tag <tagname> <commitId>          # make a new tag locally
git push origin <tagname>             # push the new local tag to the remote 

描述:

第1行删除本地env中的标记。 第2行删除远程环境中的标记。 第3行将标记添加到不同的提交 第4行将更改推到远程

您还可以将第4行更改为git push origin——tags,以将所有本地标记更改/更新推到远程repo。

上面的答案是基于@eedeep的问题内容,以及Stuart Golodetz、Greg Hewgill和@ben-hocking的回答,以及他们的回答下面的评论,以及@NateS在我的回答下面的原始评论。

更准确地说,你必须强制添加标签,然后用option——tags和-f push:

git tag -f -a <tagname>
git push -f --tags