如何根据每个提交的日期将两个分支合并为一个分支?

5
假设我有一个看起来像这样的git仓库:
merge-base---A1--A2------A3------A4 (branchA)
          \
           ----------B1------B2 (branchB)

为了简化问题,我们假设branchA上的提交严格是对fileA的修改,而branchB上的提交严格是对fileB的修改。
我想将这些分支合并到第三个分支branchAB中,其中提交将按日期排序。
merge-base---A1--A2------A3------A4 (branchA)
          \
           ----------B1------B2 (branchB)
            \
             A1--A2--B1--A3--B2--A4 (branchAB)

有没有一种单个git命令自动执行此操作的方法,或者我只能使用手动方法(例如cherry picking或rebase -i)?顺便说一下,merge-base是一个标签。
2个回答

9

这个解决方案可以满足我的需求,基于 adymitruk的原始答案:

git checkout -b branchAB merge-base
git merge branchA
git merge branchB
git rebase --onto merge-base merge-base branchAB

我知道第一个合并只是快进合并。那么为什么不在其他分支的基础上创建ab分支作为起点呢? - Adam Dymitruk
@adymitruk:那样做不会重新排序提交记录,使您获取一个分支的所有提交记录,然后是另一个分支的所有提交记录吗?保持顺序(基于日期)非常重要。 - splicer
@adymitruk:再考虑一下,从branchA的顶端开始启动branchAB,然后合并branchB应该是没问题的。重要的是要进行“rebase --onto”操作,以删除branchAB上的合并历史记录,并按日期重新排序提交记录。 - splicer
1
如果在此合并步骤之后,分支A和分支B都继续进行工作,这个过程还会继续有效吗?或者rebase会破坏它? - Chris Cleeland

1

这应该可以:

git branch branchAB branchA
git checkout branchB
git merge branchA
git rebase --onto A1^ B1^ branchAB

由于未指定 --preserve-merges,rebase 将会“吞噬”合并提交。

希望这能有所帮助。


接近了,但是你的解决方案有两个问题。首先,它没有创建第三个分支branchAB,而是修改了branchB。其次,最后一个命令从合并的分支(branchB)中删除了A4。除了这两点之外,它完全符合我的要求。谢谢!如果你能解决我提到的这两个问题,我会把你的答案标记为已接受的 ;) - splicer
完成。不需要进行快速合并,只需在其中一个分支的顶部创建AB分支。 - Adam Dymitruk
我刚试了一下你编辑过的解决方案(将A1^B1^替换为merge-base)。不幸的是,它根本无法正常工作。 branchAB最终与branchA相同,而branchB被更改为指向Merge branch 'branchA' into branchB - splicer
澄清一下,我指的是你答案的第三个版本。第一个版本更接近。 - splicer
git rebase --onto branchB branchA branchAB将分支branchAB的基础更改为从分支branchA到分支branchB的更改。 - Yohann Streibel

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