Merging/Cherry-Picking 从分支 A 到分支 B 的一系列提交

Merging/Cherry-Picking a range of Commits from Branch A to Branch B

OS: Windows 10

Git客户端:GitBash(版本:2.28.0.windows.1)

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

问题陈述:

What I want to do is, Merge/Cherry-Pick commits (I .. P) to the branch (Branch-B)

我试过的:

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

git cherry-pick I..P

但是不是从提交 I 合并到 P。cherry-pick 是从 I 到 A 执行的(即历史倒退)。

有什么解决办法吗?也欢迎 cherry-pick 以外的解决方案。

这毫无意义。如果您希望在 branchB 上应用的第一个修订版是 I,您需要尝试像 rhis:

git cherry-pick E..P

已更新 - 我一直在看这个,但我看不出您指定的命令如何执行您所说的操作。如果您从 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。那是因为如果你在检出分支的情况下进行变基,分支会随着重写的提交而移动,这听起来不像你想要的那样。结果是您现在处于分离的 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)