融合合并提交

时间:2013-10-05 22:07:20

标签: git merge feature-branch

此问题与git rebase interactive: squash merge commits together非常相关。

假设您正在为某个项目编写新功能。您从某个分支开始,例如devel,然后为您的功能feature/X构建分支。您还会不时在项目中发现一些问题,因此您决定从fixes开始构建名为devel的第二个分支。

由于您需要在feature/X继续时应用修补程序,因此您会不时地执行git merge fixes,因此您最终会遇到以下情况:

      a --- b --- M --- c --- M --- d ---- e --- M (feature)
     /           /           /                  /
    /           /           /                  /
devel ----- fix1 ------ fix2 ------------- fix3 (fixes)

由于这从未推过(因此我没有打破其他人的历史),我想将所有合并分解为一个,获得以下内容:

      a ---------------------- M --- b --- c --- d --- e (feature)
     /                        /
    /                        /
devel -- fix1 -- fix2 -- fix3 (fixes)

获得此结果的方法是

git co -b feature2 devel
git merge --no-ff fixes
git rebase featur2 feature

这实际上完成了这项工作,但迫使我创建了另一个分支feature2,稍后它将出现在合并的提交消息中。此外,当您在两个以上的分支机构工作时,请尝试这样做!

有更优雅的方式吗?这似乎是一个值得方便的命令的操作,所以我假设有一些捷径。

感谢您的帮助

2 个答案:

答案 0 :(得分:1)

如果你可以忍受略有不同的历史,即

                               + --- a' --- b' --- c' --- d' --- e' (feature)
                              /
                             /
devel -- fix1 -- fix2 -- fix3 (fixes)

然后你可以在一个命令中完成它。

$ git rebase fixes feature

您的历史记录是否存在一些特殊内容,如果feature中已存在该谱系,您希望保留fixes上的合并提交中的父链接?

答案 1 :(得分:1)

您可能希望使用--preserve-merges的{​​{1}}选项,重新排序提交以使合并成为第一个,然后将所有合并压缩在一起。如果我是你,我会做两个rebase,一个重新排序,另一个重击,这样解决冲突会更简单。

但是,使用'feature2'的解决方案似乎已经足够好了,您可以编辑合并提交消息,因此名称'feature2'不是问题,而且,您不需要创建分支,您可以工作在一个独立的头上:

git rebase --interactive