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

问题描述

操作系统:Windows 10

Git客户端:Git Bash(版本: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。而是从I合并到A(即历史倒退)。

解决方案吗?除樱桃采摘之外的其他解决方案也欢迎使用。

解决方法

已更新-我一直在查看此内容,但看不到您指定的命令将如何执行您说的那样。如果您以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)
,

那没有道理。如果您希望在branchB上看到的第一个修订版本是I,则需要像rhis那样尝试:

git cherry-pick E..P