从A分支合并/挑选一系列提交到B分支

3

我有以下git历史记录:

...--A--B--C--D---E--I--M--N--O--P   <-- Branch-A
  \  \       /
   \  F--G--H
    \
     J--K--L   <-- Branch-B (HEAD)

我希望把提交(I..P)合并/挑选到分支(Branch-B)中。

我尝试使用以下命令进行git cherry-pick:

git cherry-pick I..P

但是,与其从提交 I 合并到 P,现在正在从历史记录中向后从 I 合并到 A(即倒序合并)。

有什么解决方案吗?除了 cherry-pick 以外的其他解决方案也可以。


你能描述一下你是如何看到应用的提交是"I to A"的吗? - LeGEC
2个回答

4

更新 - 我已经看过这个,但我不明白你指定的命令如何实现你所说的功能。如果你从检出Branch-B开始并执行以下命令:

git cherry-pick I..P

如果你想将从MP的提交复制到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)

一旦我执行该命令,cherry-pick会合并提交E中所做的更改。它会发现冲突并要求我解决。在解决冲突并提交更改后,我执行git cherry-pick --continue。然后它会要求我分别编辑合并提交E、D的注释。我知道这不是它应该的行为。我将尝试使用git rebase --onto,并在这里分享更新。@Mark - M Aqib Naeem

0

这毫无意义。如果你想要在branchB上应用的第一个修订版本是I,你需要尝试像这样:

git cherry-pick E..P

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