Git:重新定义冲突的合并提交

rha*_*aft 8 git merge conflict rebase

在完成一个主题分支的工作后,我将主题分支合并为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)

现在,推送我的本地主分支当然会导致错误,因为它没有快进,所以我有两个选择:

  1. 扔掉我的工作,将master重置为origin/master并重做合并.我想避免这种情况,因为我必须重新解决冲突.

  2. 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也可以工作(如注释和答案中所提出的那样),但是会导致一种丑陋的历史记录,我只想通过一次合并提交来避免这种历史记录.

sam*_*fix 0

如果您在 master 之上重新设置主题,然后将 master 重置为之前的提交并从远程拉取,这样您就会得到以下结果:

          o---*---o---o 
         /             \
o---o---o---*---o---o---+ topic
                    \
                     n---n master & origin/master
Run Code Online (Sandbox Code Playgroud)

然后将主题合并到 master 中,结果如下(新的合并提交标记为“#”):

          o---*---o----o 
         /              \
o---o---o---*---o---o----+ topic
                    \     \
                     n--n--# master
Run Code Online (Sandbox Code Playgroud)

这会引起冲突吗?它对你有用吗?