如何将一个提交添加到Git标签中

3
我已经创建了一个 git 标签,但后来我又提交了一些其他的代码,其中有一个需要包含在标签中,而其他的则不需要。
例如:
git commit 123
git commit 456
git commit 789
git commit 1011
git commit 1213

我在 1011 处打了一个标签,现在我想把提交 123 添加到那个标签上,而不是添加到中间的任何一个提交。有什么办法可以实现吗?


我不是专家,但我相信git标签应该指向特定的提交,因此使用一个标签来覆盖多个提交是没有意义的。你希望通过这个标签实现什么目的? - Isaac
我正在用它进行发布,但需要加入最近的那个提交。 - inquiring minds
我仍然不确定我理解了...标签用于引用提交,即使用git checkout <tag>。同时引用两个提交意味着什么? - Isaac
我认为“标签”是指提交记录的某个时间点-所有提交记录直到该时间点。我正在从某个时间点创建一个发布版,并希望添加一个修复了一个 bug 的版本。 - inquiring minds
3个回答

11

从你的标签开始,你需要挑选一个你想要包含的单个提交。然后,你会将你的标签移动到指向这个新状态的位置。

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

将标签视为分支有助于理解。就像一个分支一样,标签指的是一系列提交历史中特定的点。因此,您需要创建一个具有不同提交历史的新分支,然后标记该新状态。检出当前标签会带您回到原始点,cherrypicking会提取您想要添加的单个提交,然后重新标记以保存新的分支状态。您需要使用-f选项来“移动”标签,否则您会收到“tag 'my_tag' already exists”错误提示。


谢谢。这可能会更容易一些。下次我会尝试这样做。 - inquiring minds

8

我觉得你弄混了术语。

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

如果您的意思是分支而不是标签,或者您想知道例如git log mytag的输出显示从1011年直到现在的所有提交,那么这并不清楚。

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

如果您的意思是分支,并且您创建的分支中还未包含提交123,您可以使用git cherry-pick完成。

写这篇文章时,我意识到您可能还想知道如何将提交123添加到由git log mytag列出的提交集中。为此,您需要在该点创建一个新分支,git checkout -b mybranch mytag,然后挑选提交123,然后将标签移动到新提交上,使用git tag -f。然后,您可以返回到以前的分支(例如git checkout master)。您以前的分支将具有不同的历史记录,分支已经分开。


是的,你回答的最后一部分就是我想做的 - 我需要创建一个新的分支并进行 cherry pick。谢谢! - inquiring minds
“包含”是非常好的术语。通常可以说一个提交“包含”一个祖先提交,因为祖先的更改包含在包含提交的历史记录中。同样,标签对象或轻量级标签可以说包含其历史记录中的提交,因此使用 git describe --contains 命令。 - CB Bailey

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接