--preserve-merges
Instead of ignoring merges, try to recreate them.
This uses the --interactive machinery internally, but combining it
with the --interactive option explicitly is generally not a good idea
unless you know what you are doing (see BUGS below).
Run Code Online (Sandbox Code Playgroud)
那么当你使用时会发生什么--preserve-merges?它与默认行为(没有该标志)有何不同?"重新创建"合并等意味着什么?
我已经在SO上阅读了关于git merge和git rebase的相关问题,但我仍然无法完全理解幕后发生的事情.
这是我们的分支情况:
MASTER------------------------
\ \
\ \----Feature B---
\ \
\-----Feature A----------\---Feature A+B
Run Code Online (Sandbox Code Playgroud)
我们有2个功能分支,它们来自不同时间的master,现在我们想要组合2个分支.我们希望遵循这种first rebase then merge做法,但是当我们将功能A重新命名为功能B时,我们会遇到冲突.这是预期的,因为两个功能(和主人)在相同的区域都有变化.但奇怪的是,同样的冲突在此之后不断出现git rebase --continue.这让我们疯狂,所以我们最终中止了rebase,并使用了git merge.事实证明,冲突实际上很容易解决.
我的问题是双重的:
git rebase适合我们situtation?或者,只有少数(1或2)变化才能改变?rebase解决一个冲突,但通过比较哪个提交到什么?关于SO的相关帖子:
在完成一个主题分支的工作后,我将主题分支合并为master,如下所示:
o---*---o---o topic
/ \
o---o---o---*---o---o---+ master
Run Code Online (Sandbox Code Playgroud)
标有"*"的提交修改了相同的代码,因此合并导致合并提交中解决的合并冲突(标记为"+").
当我合并并解决冲突时,我的同事将新的提交推送到主人(标记为'n'),导致以下历史记录:
o---*---o---o topic
/ \
o---o---o---*---o---o---+ master
\
n---n origin/master
Run Code Online (Sandbox Code Playgroud)
现在,推送我的本地主分支当然会导致错误,因为它没有快进,所以我有两个选择:
扔掉我的工作,将master重置为origin/master并重做合并.我想避免这种情况,因为我必须重新解决冲突.
Rebase master到origin/master并推送.这就是我的问题:执行此rebase(即使使用-p开关)也不能顺利运行,合并提交再次显示相同的冲突,即使新提交('n')没有更改主题分支触及的任何内容.因此,我必须在rebase期间再次解决冲突,并且与选项1具有相同的结果.
我想要实现的是重新定义合并提交'+'而不必再次解决冲突:
o---*---o---o-------- topic
/ \
o---o---o---*---o---o---n---n---+ master & origin/master
Run Code Online (Sandbox Code Playgroud)
编辑:
启用了rerere开关,但似乎没有任何帮助; 除了将config.rerere设置为true以解决我的问题,我还需要做什么吗?
编辑2:
将merge-commit('+')合并到origin/master也可以工作(如注释和答案中所提出的那样),但是会导致一种丑陋的历史记录,我只想通过一次合并提交来避免这种历史记录.