有没有一种方法可以运行 `git cherry-pick` 并指定特定分支的提交系列?

4
例如:
feature        C---D---E---G---H---L---M
              /         \       \      ^--- tip of feature
master   A---B-----------F---I---J---K
                                     ^--- tip of master

我想要挑选的提交为:C D E G H L M 关键要求:我不想手动指定任何提交ID,我希望以“从分支master分离出来后我对feature所做的提交”这个条件可靠地指定它们。我不想要从feature分离后加入到master中的内容,所以我不想要F I J K
原因是我想将这些提交拣选到第三个分支,但我不能只运行git merge feature命令,因为它还包括其他祖先,如AB。(我不想讨论为什么有东西在master中,我不想在第三个分支中使用。)
这有意义吗?

2
没有一种通用的干净方法来完成这个操作,因为你的提交范围内有 (H和E)合并 提交,并且具有两个父提交。您需要指定要遵循哪个父提交。为什么您想以这种方式进行 cherry-pick? - Tim Biegeleisen
对于这种情况,如果您已经了解 CB,则 git rev-list --first-parent feature ^B 列出了正确的 ID。如果您不知道 C(它会得到 B)或 B,请使用 LeGEC 的方法。@TimBiegeleisen:HE 不是合并;合并是在 master 上的 FJ - torek
2个回答

2
您可以通过列出feature的第一个父提交来获取您想要选择的提交列表,并删除master的第一个父提交;您可以使用此答案提供的脚本:
git rev-list --first-parent master > listm.txt
git rev-list --first-parent feature > listb.txt

# use grep, use '-f' to read patterns from 'listm.txt',
# use '-v' to say "exclude these patterns"
cat listf.txt | grep -v -f listm.txt

在类似bash的shell中,您可以使用<(...)将其转换为单行代码:
git rev-list --first-parent feature | grep -v -f <(git rev-list --first-parent master)

你可以将该列表提供给 cherry-pick 命令:
list=$(git rev-list ...)
git cherry-pick $list

0

简而言之

您可以通过将您感兴趣的特定部分的图形重新定位到新分支上的feature2分支来轻松完成。唯一棘手的部分是识别要重新播放的第一个提交(请参见下文)。


为了让阅读更容易,我们称您的特性分支为“feature1”,假设您想要挑选的分支名为“feature2”。
现在,让我们从feature1分支创建一个工作分支(稍后将使用此分支)。我们称其为“feature2-with-feature1-commits”。
  1. git checkout feature1
  2. git checkout -b feature2-with-feature1-commits
现在,我们可以通过查找feature1master之间第一个共享提交的前一个提交来找到创建feature1的哈希值(原始主提交):
git show $(git rev-list f1..master | tail -1)~1 --pretty=%h
但我们不需要保存它,因为我们现在可以使用rebase --onto命令。
因此,让我们执行第三步,其中包含先前的命令,以便将原始提交提供给git以重放提交:
  1. git rebase --onto feature2 `git show $(git rev-list feature1..master | tail -1)~1 --pretty=%h` feature2-with-feature1-commits

现在,您已经将我们想要的所有来自feature1的提交cherry-pick到了新分支(从feature2最新提交开始),没有master的提交,现在您可以通过合并它们(git checkout feature2; git merge --no-ff -;)或通过快进feature2分支(git checkout feature2; git merge --ff-only -;)将它们集成到feature2分支中。


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