2011-03-23 50 views
3

比方说,我有一个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命令自动做到这一点,还是我坚持手动方法(如樱桃采摘或rebase -i)?

顺便说一句,merge-base是一个标签。

回答

4

这里有一个解决方案,我想要做什么,基于adymitruk's original answer

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

我知道第一次合并只是一个快进。那么为什么不在其他分支之一上创建ab分支作为起点呢? – 2011-03-23 23:03:19

+0

@adymitruk:是不是会重新排序提交,以便获得一个分支的所有提交以及所有其他分支的提交?保持订单(基于日期)非常重要。 – splicer 2011-03-24 00:29:41

+0

@adymitruk:再想一想,是的,应该可以在branchA的顶端开始branchAB,然后合并到branchB。重要的是做一个'rebase - 去'去除branchAB上的合并历史记录,按日期重新排序提交。 – splicer 2011-03-24 15:27:01

1

这应做到:

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

衍合的“吃”这次合并提交的未指定--preserve-合并。

希望这有助于

+0

关闭,但有两个问题,您的解决方案。首先,不是创建第三个分支branchAB,而是修改branchB。其次,最后一个命令从组合分支(分支B)中删除A4。除了这两件事之外,它确实是我想要的。谢谢!如果您可以解决我提到的两个问题,我会将您的答案标记为已接受;) – splicer 2011-03-23 21:29:16

+0

完成。不需要进行快速合并,只需在其他人之一上创建AB分支。 – 2011-03-23 22:59:14

+0

我刚刚尝试过编辑后的解决方案(用'merge-base'代替'A1 ^'和'B1 ^')。不幸的是,它甚至没有接近工作。 'branchAB'最终与'branchA'相同,'branchB'被更改为指向*合并分支'branchA'到分支B *。 – splicer 2011-03-24 01:38:13

相关问题