此问题与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
,稍后它将出现在合并的提交消息中。此外,当您在两个以上的分支机构工作时,请尝试这样做!
有更优雅的方式吗?这似乎是一个值得方便的命令的操作,所以我假设有一些捷径。
感谢您的帮助
答案 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