我怎样才能移动一个标签在一个git分支到不同的提交?
我在名为v0.1
的主分支上创build了一个标签,如下所示:
git tag -a v0.1
但后来我意识到还有一些我需要合并到主版本0.1版本的变化,所以我做到了。 但是现在我的v0.1
标签卡住了(调用便条纸比喻)错误的提交。 我希望它被困在最新的master提交上,但是却被困在了master的第二次提交上。
我怎样才能把它移到最近的主人提交?
使用-f
选项来git tag
:
-f --force Replace an existing tag with the given name (instead of failing)
您可能希望使用-f
与-a
一起强制创build注释标记,而不是未注释的标记。
例
-
在推送之前删除任何遥控器上的标签
git push origin :refs/tags/<tagname>
-
replace标记以引用最近的提交
git tag -fa <tagname>
-
将标签推到远程原点
git push origin master --tags
更确切地说,您必须强制添加标签,然后使用选项–tags和-f:
git tag -f -a <tagname> git push -f --tags
用git tag -d <tagname>
删除它,然后在正确的提交上重新创build它。
总结一下,如果你的远端被称为origin
而你正在master
分支上工作:
git tag -d <tagname> git push origin :refs/tags/<tagname> git tag <tagname> <commitId> git push origin <tagname>
- 第1行删除本地环境中的标记。
- 第2行删除远程环境中的标签。
- 第3行将标签添加到不同的提交
- 第4行将更改推送到远程
您也可以将第4行交换为git push origin --tags
以便从本地更改中推送带有标签的所有更改。
基于@ stuart-golodetz,@ greg-hewgill,@eedeep,@ ben-hocking答案,他们的答案下面的评论和我的答案下面的NateS评论。
别名将一个标签移动到另一个提交。
在你的示例中,移动提交散列e2ea1639做: git tagm v0.1 e2ea1639
。
对于推送标签,请使用git tagmp v0.1 e2ea1639
。
这两个别名保持你原来的date和消息。 如果你使用git tag -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 #"
我将在这里离开这个命令的另一种forms,以适应我的需求。
有一个标签v0.0.1.2
,我想移动。
$ git tag -f v0.0.1.2 63eff6a Updated tag 'v0.0.1.2' (was 8078562)
接着:
$ git push --tags --force