我在主分支上创建了一个名为v0.1的标签,如下所示:
git tag -a v0.1
但后来我意识到,在0.1版的master中还需要合并一些更改,所以我就这么做了。但是现在我的v0.1标签被粘在了错误的提交上(引用便利贴的类比)。我希望它卡在主节点上的最近提交上,但它却卡在主节点上的第二个最近提交上。
我如何移动它到最近提交的主?
我在主分支上创建了一个名为v0.1的标签,如下所示:
git tag -a v0.1
但后来我意识到,在0.1版的master中还需要合并一些更改,所以我就这么做了。但是现在我的v0.1标签被粘在了错误的提交上(引用便利贴的类比)。我希望它卡在主节点上的最近提交上,但它却卡在主节点上的第二个最近提交上。
我如何移动它到最近提交的主?
当前回答
使用git标记-d <tagname>删除它,然后在正确的提交时重新创建它。
其他回答
使用git标记-d <tagname>删除它,然后在正确的提交时重新创建它。
更准确地说,你必须强制添加标签,然后用option——tags和-f push:
git tag -f -a <tagname>
git push -f --tags
如果你想移动一个带注释的标签,只改变目标提交,但保留注释消息和其他元数据使用:
moveTag() {
local tagName=$1
# Support passing branch/tag names (not just full commit hashes)
local newTarget=$(git rev-parse $2^{commit})
git cat-file -p refs/tags/$tagName |
sed "1 s/^object .*$/object $newTarget/g" |
git hash-object -w --stdin -t tag |
xargs -I {} git update-ref refs/tags/$tagName {}
}
用法:moveTag <标签到移动> <目标>
上面的函数是通过引用teerapap/git-move-annotated-tag.sh开发的。
在使用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是一个示例提交。
这里我只留下适合我需要的另一种形式的命令。 我想移动一个标记v0.0.1.2。
$ git tag -f v0.0.1.2 63eff6a
Updated tag 'v0.0.1.2' (was 8078562)
然后:
$ git push --tags --force