我怎样才能移动一个标签在一个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注释标记,而不是未注释的标记。

  1. 在推送之前删除任何遥控器上的标签

     git push origin :refs/tags/<tagname> 
  2. replace标记以引用最近的提交

     git tag -fa <tagname> 
  3. 将标签推到远程原点

     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