更新 - 我已经看过这个,但我不明白你指定的命令如何实现你所说的功能。如果你从检出Branch-B
开始并执行以下命令:
git cherry-pick I..P
如果你想将从M
到P
的提交复制到Branch-B
,那么你应该获取这些提交的副本。由于你还想获取I
,所以应该使用E..P
,但是cherry-pick
“反向”工作的想法不合理,也不符合文档或我的测试。
我还稍微调整了我的答案。我仍然更喜欢在提交范围上使用rebase
,但我最初说它是“最简单”的方法,客观上这并不准确,因为它需要对分支进行额外的操作。
如果要复制一系列提交的更改(只要该范围不包括合并),我会使用git rebase
和--onto
选项。可能看起来像这样:
git rebase --onto Branch-B E P
请注意,您需要指定
E
而不是
I
作为“上游”参数。这是因为rebase将此参数视为负引用——从
E
可达的所有内容(包括
E
本身)都不会被复制。
另请注意,我指定了
P
作为最后一个参数,而不是
branch-A
。这是因为如果您使用一个分支进行rebase,该分支将随重写的提交一起移动,而这似乎不是您想要的。结果是您现在处于分离HEAD状态,并且重写的提交当前未在任何分支上。
...--A--B--C--D---E--I--M--N--O--P <-- Branch-A
\ \ /
\ F--G--H
\
J--K--L <-- Branch-B
\
I'--M'--N'--O'--P' <-- (HEAD)
为将这些提交合并到
Branch-B
中,你现在可以:
git branch -f Branch-B
git chekcout Branch-B
或者
git checkout branch
git merge -
获取
...--A--B--C--D---E--I--M--N--O--P <-- Branch-A
\ \ /
\ F--G--H
\
J--K--L--I'--M'--N'--O'--P' <-- Branch-B (HEAD)