首页 > 解决方案 > `merge --squash` 后的后续合并导致冲突

问题描述

正常合并:

$ git merge feature01
$ git merge feature02

一切正常。

壁球合并:

$ git merge --squash feature01 # OK
$ git merge --squash feature02
Auto-merging src/aaa.js
CONFLICT (content): Merge conflict in src/XXX.js
....

这是为什么?如何使merge --squash工作(后续合并工作找到)?

标签: git

解决方案


您描述的情况要求历史看起来像这样:

--X--Y             <-- your master
   \
    A--B--C--D     <-- feature01
     \
      R--S--T      <-- feature02

(您master是否有提交Y或仍在提交X与以下内容无关。)

这是为什么?

A 请注意,在此示例中,这两个功能具有共同的提交。当您进行常规合并时,Git 知道这一事实并且可以在不产生冲突的情况下处理它。特别是,在第二次合并中,它不会再次引入所做的更改A

但是,当您对 进行 squash 合并时feature01,您将生成以下历史记录:

--X--Y--F1         <-- your master
   \
    A--R--S--T     <-- feature02

我从图片中截断feature01,因为它不再起作用。

当您现在进行合并时feature02(壁球或常规无关紧要),Git 会尝试A再次应用提交,因为它没有足够的信息来知道它已经合并了它。B当其中一个提交,已经在所做的更改附近进行了更改时C,就会出现冲突。DA

如何进行merge --squash工作(后续合并工作正常)?

你不能。不要使用merge --squash.

当然,您可以通过嫁接历史来假装它A实际上已合并到F1; 但这只是一种变通方法,是紧急情况下的创可贴,但这对于常规工作流程来说太乏味了。如果你这样做,你为什么不首先使用常规合并?


推荐阅读