1035

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

git tag -a v0.1

但后来我意识到仍然需要一些更改才能合并到 0.1 版的 master 中,所以我这样做了。但是现在我的v0.1标签被卡在(调用便利贴类比)错误的提交上。我希望它停留在 master 上的最新提交上,但它却停留在 master 上的第二个最近提交上。

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

4

10 回答 10

1409

使用该-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
    
于 2011-11-08T00:34:45.427 回答
306

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

git tag -f -a <tagname>
git push -f --tags
于 2014-01-15T00:40:15.583 回答
288

总结一下,如果您的遥控器被调用origin并且您正在处理master分支:

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 行删除本地环境中的标记。
  • 第 2 行删除远程环境中的标签。
  • 第 3 行将标签添加到不同的提交
  • 第 4 行将更改推送到远程

您还可以更改第 4 行git push origin --tags以将所有本地标记更改/更新推送到远程存储库。

上述答案基于@eedeep 问题中的内容,以及Stuart GolodetzGreg Hewgill和 @ben-hocking 的答案,以及他们答案下方的评论,以及我的答案下方 @NateS 的原始评论。

于 2015-02-02T14:53:42.890 回答
100

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

于 2011-11-08T00:34:11.637 回答
83

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

  1. 使用内部知识,例如参考/标签。我尝试仅使用记录在案的 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示例提交。

于 2018-08-28T16:26:29.943 回答
39

我将在这里留下适合我需要的此命令的另一种形式。
有一个v0.0.1.2我想移动的标签。

$ git tag -f v0.0.1.2 63eff6a

Updated tag 'v0.0.1.2' (was 8078562)

接着:

$ git push --tags --force
于 2017-09-19T00:14:29.573 回答
15

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

在您的示例中,要使用哈希 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 #"
于 2015-05-21T20:02:38.267 回答
11

另一种方式:

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

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

取回更改。

$ git fetch --tags
于 2018-03-15T07:44:03.980 回答
3

如果您使用 github 并希望更改提交以进行发布(例如,您发现在创建发布后不提交)。您可以使用

git push origin :refs/tags/<tagname>

在此命令 github 删除您的标签后,您的发布将成为草稿。这意味着您可以重新创建发布并选择提交。您的文件和消息将被保存。

于 2021-04-27T03:37:48.233 回答
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 <tag-to-move> <target>

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

于 2018-05-08T13:18:56.170 回答