rebase冲突,在git中合并提交

时间:2014-02-25 22:00:46

标签: git branch git-branch rebase git-rebase

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

总之,现在我有:

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

但我希望:

   F
A-/ \-D

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

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

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

2 个答案:

答案 0 :(得分: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
    

答案 1 :(得分:0)

我认为可能有很多方法可以实现你想要的东西,但首先要做的事情是:

1)如果您不想要,则不需要新的主分支。您可以使用git reset将当前主分支的点更改回A或其他内容,而无需新命名的分支。 (您也可以创建新的master_prime,执行您想要的“地球上最佳位置”,并将master重命名为master_old,并将master_prime重命名为master

但除此之外,这一切都是因为它并不是你所要求的。

您想要的是功能分支feature,其中包含从AD所需的所有更改。并且...进行合并所需的更改。此时你可能想要改变,因为这仍然会很痛苦。但是你可以进行挤压并将合并编辑复制到位(使用reset代替新的分支作为练习给读者留下):

git checkout A
git checkout -b feature2
git cherry-pick B..D
... squash away here ...
git cherry-pick E              # copies the merge pain in
git checkout master
git merge feature2