如何将git分支上的标记移动到其他提交?

这篇博客讨论了如何在git中将标记从一个提交移动到另一个提交。提供了多个命令行选项和步骤,包括删除旧标签、在正确提交上创建新标签以及推送到远程仓库。内容涵盖了解决这个问题的不同方法,包括使用`git tag -f`,以及一些别名和非暴力解决方案。
摘要由CSDN通过智能技术生成

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

git tag -a v0.1

但后来我意识到我需要将一些更改合并到master for release 0.1中,所以我做到了。 但是现在我的v0.1标签被卡住(用于调用v0.1贴的类比)错误的提交。 我希望它停留在master上的最新提交中,但它仍然停留在master上的第二次最新提交。

如何将其移动到master上的最新提交?


#1楼

更确切地说,您必须强制添加标记,然后使用选项--tags和-f进行推送:

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

#2楼

总结一下你的遥控器是否被称为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,@ hedeep,@ ben-hocking答案,评论低于他们的答案,NateS评论低于我的答案。


#3楼

将一个标记移动到另一个提交的别名。

在您的示例中,要使用散列e2ea1639移动提交,请执行以下操作: git tagm v0.1 e2ea1639

对于推送标签,请使用git tagmp v0.1 e2ea1639

这两个别名都会保留原始日期和消息。 如果您使用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 #"

#4楼

我将离开这里,这个命令的另一种形式符合我的需要。
有一个标签v0.0.1.2 ,我想移动。

$ git tag -f v0.0.1.2 63eff6a

Updated tag 'v0.0.1.2' (was 8078562)

然后:

$ git push --tags --force

#5楼

另一种方式:

在远程仓库中移动标签。(如果需要,将HEAD替换为任何其他标签。)

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

获取更改。

$ git fetch --tags

#6楼

如果要移动带注释的标记,仅更改目标提交但保留注释消息和其他元数据,请使用:

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 <tag-to-move> <target>

上述功能是通过引用teerapap / git-move-annotated-tag.sh开发的。


#7楼

我在使用Git时尽量避免一些事情。

  1. 使用内部知识,例如refs / tags。 我尝试仅使用记录的Git命令,并避免使用需要了解.git目录内部内容的内容。 (也就是说,我将Git视为Git用户,而不是Git开发人员。)

  2. 不需要时使用武力。

  3. 过度的事情。 (推送一个分支和/或大量标签,以便在我想要的地方获得一个标签。)

所以这是我在本地和远程更改标签的非暴力解决方案,而不知道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是示例提交。


#8楼

使用git tag -d <tagname>删除它,然后在正确的提交上重新创建它。


#9楼

使用-f选项来git tag

-f
--force

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

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

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

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

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

     git push origin master --tags 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值