我在主分支上创建了一个名为v0.1的标签,如下所示:
git tag -a v0.1
但后来我意识到,在0.1版的master中还需要合并一些更改,所以我就这么做了。但是现在我的v0.1标签被粘在了错误的提交上(引用便利贴的类比)。我希望它卡在主节点上的最近提交上,但它却卡在主节点上的第二个最近提交上。
我如何移动它到最近提交的主?
我在主分支上创建了一个名为v0.1的标签,如下所示:
git tag -a v0.1
但后来我意识到,在0.1版的master中还需要合并一些更改,所以我就这么做了。但是现在我的v0.1标签被粘在了错误的提交上(引用便利贴的类比)。我希望它卡在主节点上的最近提交上,但它却卡在主节点上的第二个最近提交上。
我如何移动它到最近提交的主?
当前回答
如果你想移动一个带注释的标签,只改变目标提交,但保留注释消息和其他元数据使用:
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开发的。
其他回答
还有一种方法:
移动标签在远程回购。(如有需要,请更换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
如果你使用github并且想要更改发布(例如你发现创建发布后不提交smth)。你可以使用
git push origin :refs/tags/<tagname>
在这个命令之后,github删除你的标签,你的发布将成为草稿。这意味着您可以重新创建释放并选择提交。您的文件和您的消息将被保存。
总结一下,如果你的远程名为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在我的回答下面的原始评论。
将一个标记移动到不同的提交。
在您的示例中,要移动提交散列e2ea1639 do: git tagm v0.1 e2ea1639。
对于推送标记,使用git tagmp v0.1 e2ea1639。
两个别名保持您原始的日期和消息。如果您使用git标记-d,您将丢失原始消息。
将它们保存在.gitconfig文件中
# Return date of tag. (To use in another alias)
tag-date = "!git show $1 | awk '{ if ($1 == \"Date:\") { print substr($0, index($0,$3)) }}' | tail -2 | head -1 #"
# Show tag message
tag-message = "!git show $1 | awk -v capture=0 '{ if(capture) message=message\"\\n\"$0}; BEGIN {message=\"\"}; { if ($1 == \"Date:\" && length(message)==0 ) {capture=1}; if ($1 == \"commit\" ) {capture=0} }; END { print message }' | sed '$ d' | cat -s #"
### Move tag. Use: git tagm <tagname> <newcommit>
tagm = "!GIT_TAG_MESSAGE=$(git tag-message $1) && GIT_COMMITTER_DATE=$(git tag-date $1) && git tag-message $1 && git tag -d $1 && git tag -a $1 $2 -m \"$GIT_TAG_MESSAGE\" #"
### Move pushed tag. Use: git tagmp <tagname> <newcommit>
tagmp = "!git tagm $1 $2 && git push --delete origin $1 && git push origin $1 #"