二路合并是对两个文件进行逐行比较,行内容不同就报冲突:

mine是你的提交,theirs是其它人的,
但是这种冲突太多了且没有必要。
三路合并是先找出一个共同的base节点,然后以base节点为基准:

如果mine相对于base没有修改,而theirs有修改,会采用theirs的修改:

如果两个分支相对于base都进行了改动,那么就会报冲突,需要人工来解决:

<<<<<<< HEAD
表示冲突开头,
>>>>>>> refs/remotes/origin/……
表示冲突结尾,
=======
分隔冲突内容,
下面是合并来的分支。
分支合并示意图:

实际中的情况会更复杂。

如果寻找e、d的父节点,会发现有不止一个,
b、c都是,此时会怎么合并:
第一步,把b、c合并为一个虚拟的合并节点,然后以此节点作为e、d合并的base节点;
第二部,寻找b、c的父节点,然后进行合并;
第三步,如果b、b的父节点也不止一个,那么请继续执行第一、第二两步,就是递归。
父节点可以在其它的分支上。
如果找不到父节点,那就采用二路合并。
Refs:
walter lv:git的合并原理(递归三路合并算法)
Harlen_luan:git merge原理(递归三路合并算法)