【问题标题】:How to add only one commit to a git tag如何只向 git 标签添加一个提交
【发布时间】:2012-07-20 18:17:11
【问题描述】:

我已经创建了一个 git 标签,但是我做了一些其他的提交,其中一个需要在标签中,其他的不需要。

例如:

git commit 123
git commit 456
git commit 789
git commit 1011
git commit 1213

我在1011 处创建了一个标签,但现在我想在其中添加提交123,而不是介于两者之间的任何一个。有什么办法吗?

【问题讨论】:

  • 我不是专家,但我相信一个 git 标签应该是指一个特定的提交,所以拥有一个涵盖多个提交的标签是没有意义的。你希望用这个标签完成什么?
  • 我将它用于发布,但需要添加一个最近的提交。
  • 我仍然不确定我是否理解...标签用于引用提交,即git checkout <tag>。一次引用两个提交是什么意思?
  • 我相信标签是指提交的时间点——所有提交到该点。我正在从某个时间点创建一个版本,我想从本质上添加一个错误修复。

标签: git versioning tagging


【解决方案1】:

从您的标签开始,您需要挑选要包含的单个提交。然后,您将移动标签以指向新状态。

git checkout my_tag
git cherry-pick commit_123
git tag -f my_tag

将标签视为分支可能会有所帮助。就像分支一样,标签是指提交历史中的特定点。所以你想要做的是有效地创建一个具有不同提交历史的新分支,然后标记该新状态。检查你当前的标签会让你回到原来的点,cherrypicking 拉入你想要添加的单个提交,然后重新标记保存新的分支状态。您需要 -f 选项来“移动”标签,否则您将收到 tag 'my_tag' already exists 错误。

【讨论】:

  • 谢谢。这可能会容易一些。下次我会试试的。
【解决方案2】:

我认为你的术语混淆了。

  • 标签是附加到单个提交的字符串标签。它不“包含”提交,它只是命名被标记的提交的另一种方式。
  • 分支是一组有序的提交,当您使用git commit 时,您会将提交添加到当前分支。

不清楚您是否只是指分支而不是标签,或者您是否在问为什么输出例如git log mytag 显示自 1011 年以来的所有提交。

git log mytag 将记录带有mytag 标记的提交及其所有父项。

如果您的意思是分支并且您创建的分支在其历史记录中尚未包含提交 123,您可以git cherry-pick它。

在写这篇文章时,我意识到您可能还意味着如何将提交 123 添加到 git log mytag 列出的提交集中。为此,您需要在此时创建一​​个新分支git checkout -b mybranch mytag,然后使用cherry pick 提交123,然后使用git tag -f 将标签移动到新提交。然后你可以回到你之前的分支(例如git checkout master)。那么你之前的分支就会有不同的历史,分支已经分道扬镳了。

【讨论】:

  • 是的,你回答的最后一部分是我想要做的——我需要做一个新的分支和樱桃采摘。谢谢!
  • "contains" 是非常好的术语。通常说提交包含祖先提交,因为祖先中的更改包含在包含提交的历史记录中。类似地,标签对象或轻量级标签可以说包含其历史中的提交,因此git describe --contains
【解决方案3】:

如果所有更改仍然是本地的,您应该能够使用 1011 压缩 1213 提交并重新标记压缩的提交。

【讨论】:

    猜你喜欢
    • 2014-02-22
    • 2023-02-09
    • 2010-12-24
    • 1970-01-01
    • 2015-07-03
    • 2017-04-24
    • 2015-07-02
    • 1970-01-01
    • 2013-05-01
    相关资源
    最近更新 更多