Git三路合并算法的弊端
背景
最近在做分支merge,结果发现有的行莫名其妙丢失了。
在看接下来的内容前,请先了解“revert的副作用”: https://blog.csdn.net/qq_32460431/article/details/130770633https://blog.csdn.net/qq_32460431/article/details/130770633
三路合并算法的介绍
当Git merge 两个分支F1和F2时,例如 将 F2 merge给 F1时,且F1和F2 的merge-base称为Base。Git 针对一块代码,将会有如下反应:
Remote (F2) | Base | Local(F1) | 含义 | 结果 |
A | A | A | 完全一致 | 不是冲突,没有合并,保持现状: A |
A | A | B | 单边差异 | 不是冲突,只是合并,结果是: B |
A | B | B | 单边差异 | 不是冲突,只是合并,结果是: A |
A | B | C | 两边都变更了 | 是冲突,要手动处理 |
表格中,Remote 也就是 来客Incoming 。Local 是 当前接受merge者,是当前分支。
于是,F2上的 临时性修改、错误修改、(关于A的)Revert ,这些都是典型的代码丢失,或错误的情况:
本质上是F2分支上的不正确代码,污染了merge后的结果。
这里提到的F2如果是F1,也是同样情况(对称的情况)。