2014-02-25 52 views
1

我刚刚完成在其自己的分支(分支feature)上开发一个新功能,由十几个提交组成。运行完所有测试后,我将此分支合并到master,并解决了许多合并冲突。这个过程花了很长时间。只有我完成了合并我是否意识到我从来没有重新设置feature分支中的任何提交,这通常是我的做法。rebase冲突,在git中合并提交

总之,现在我有:

(feature) B-C-D 
(master) A-/  \-E (merge commit in master) 

但我想有:

F 
A-/ \-D 

其中F = B + C + d “压扁” 在一起。

我要对这个办法是从master创建另一个分支master_prime开始在提交A。然后,切换到feature分支并完成我想要的所有提交压缩。最后,合并featuremaster_prime。唯一的问题是我必须再次解决所有合并冲突。有没有一种方法可以重播/挑选合并提交E,这样就没有必要?

我也试图git rebase --preserve-merges -i <A>以及git rebase -i <A>,它们不允许我重新绑定我想要的提交或让我再次处理合并冲突。

回答

0

我觉得有可能通过多种方式来完成你想要什么,但有几样事情第一:

1)你并不需要一个新的主分支,如果你不想。您可以使用git reset将当前主分支的点更改回A,或者不需要新命名的分支。 (你也可以创建新master_prime,你要得到它为“世界上最好的地方”,并重新命名mastermaster_old和重命名master_primemaster什么。

但是,这一切除了点,因为它不是真的你在问什么。

你想要的是特性分支featureAD在它所有需要的变化。而且...使合并所需要的变化。在这一点上,你可能要变基,因为这仍然是一个痛苦,但你可以做你的挤压,并将你的合并编辑复制到位(使用reset而不是一个新的分支作为exerci SE读者):

​​

认为

1

使用git read-tree重用你合并冲突的解决。

我假设你将feature合并为master。如果将master合并到feature中,请使用master^2而不是master^(反之亦然)。

  1. 对您的合并提交进行备份。

    git branch merge-backup master 
    
  2. 压扁feature中的提交。确保你不会意外改变任何事情。

    git checkout feature 
    # ... squash the commits ... 
    git diff master^2 
    
  3. 摆脱旧合并提交的。

    git checkout master 
    git reset --hard master^ 
    
  4. 合并的挤压feature支进master,重用旧的冲突解决。

    git merge feature 
    git read-tree --reset -u merge-backup 
    git commit 
    
  5. 如果你是高兴的结果,删除备份分支。

    git branch -D merge-backup