一.冲突的产生

原因: 对两个已经提交的分支的 相同文件相同位置 的 不同操作 进行了合并

很多命令都可能出现冲突,但从根本上来讲,都是merge 和 patch(应用补丁)时产生冲突。

二.git merge原理

1.merge 常见误区

(1).git merge 是用时间先后决定merge结果的,后面会覆盖前面的?

答 :git 是分布式的文件版本控制系统,在分布式环境中时间是不可靠的,git是靠 三路合并算法 进行合并的。

(2).git merge 只要两行不相同就一定会报冲突,叫人工解决?

答:git 尽管两行内容不一样,git 会进行取舍,当git无法进行取舍的时候才会进行人工解决冲突

2.merge原理

git 合并文件是 以行为单位进行一行一行进行合并的 ,但是有些时候并不是两行内容不一样git就会报冲突,因为smart git 会帮我们自动帮我们进行取舍,分析出那个结果才是我们所期望的,如果smart git 都无法进行取舍时候才会报冲突,这个时候才需要我们进行人工干预。那git 是如何帮我们进行Smart 操作的呢?

二路合并算法就是讲两个文件进行逐行对别,如果行内容不同就报冲突。

Mine 代表你本地修改 Theirs 代表其他人修改 假设对于同一个文件,出现你和其他人一起修改,此时如果git来进行合并,git就懵逼了,因为Git既不敢得罪你(Mine),也不能得罪他们(Theirs) 无理无据,git只能自己搞了,但是这种情况太多了而且也没有必要…

三路合并就是先找出一个基准,然后以基准为Base 进行合并,如果2个文件相对基准(base)都发生了改变 那git 就报冲突,然后让你人工决断。否则,git将取相对于基准(base) 变化的那个 为最终结果。

Base 代表上一个版本,即公共祖先 Mine 代表你本地修改 Theirs 代表其他人修改 这样当git进行合并的时候,git就知道是其他人修改了,本地没有更改,git就会自动把最终结果变成如下:

如果换成下面的这样,就需要人工解决了:

上面就是git merge 最基本的原理 “三路合并”。

三.冲突的类型

git自动处理(合并/应用补丁)成功,但是逻辑上是有问题的。

比如另外一个人修改了文件名,但我还使用老的文件名,这种情况下自动处理是能成功的,但实际上是有问题的。

文件名修改造成的冲突,称为树冲突。

比如,a分支把文件改名为A,b分支把同一个文件改名为B,那么将这两个commit合并时,会产生冲突。

两个分支修改了同一个文件的同一块区域,git会报告内容冲突。我们常见的都是这种,后面的解决办法也主要针对这种冲突。

四.内容冲突的解决办法

1.发现冲突

(1).命令行模式

一般来讲,出现冲突时都会有“CONFLICT”字样:

(2).sourceTree中

当拉完代码出现冲突时,sourceTree会出现提示,可以在 文件状态 中查看是哪个文件出现了冲突,然后进入VScode中手动解决冲突。

2.手动解决冲突

解决冲突就是把Git合并失败的文件手动编辑为我们希望的内容,再提交。

(1).直接编辑冲突文件

冲突产生后,文件系统中冲突了的文件里面的内容会显示为类似下面这样:

其中:冲突标记<<<<<<< (7个<)与=======之间的内容是之前的,=======与>>>>>>>之间的内容是新合进来的。

最简单的办法,就是直接编辑冲突了的文件,把冲突标记删掉,把想要保留的代码留下,把冲突解决。

(2).VScode提供的选项

分别对应3种解决方案:保留当前的改变、保留引入的改变、保留全部