1

这个问题与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,稍后将出现在合并的提交消息中。此外,当您在两个以上的分支上工作时,请尝试这样做!

有没有更优雅的方式来做到这一点?这似乎是一个值得一个方便命令的操作,所以我认为有一些捷径。

谢谢你的帮助

4

2 回答 2

1

如果您可以忍受稍微不同的历史,即

                               + --- a' --- b' --- c' --- d' --- e' (特征)
                              /
                             /
开发——修复1——修复2——修复3(修复)

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

$ git rebase 修复功能

您的历史记录是否有什么特别之处,使您想feature在该谱系已经存在时保留合并提交中的父链接fixes

于 2013-10-06T00:05:20.077 回答
1

您可能想要使用--preserve-merges选项git rebase --interactive,重新排序提交,以便首先合并,然后将所有合并压缩在一起。如果我是你,我会做两次 rebase,一次重新排序,一次压缩,这样解决冲突会更简单。

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

git checkout devel^0
git merge --no-ff --edit fixes
git rebase HEAD feature
于 2013-10-06T01:44:38.000 回答