一.冲突的产生
原因: 对两个已经提交的分支的 相同文件相同位置 的 不同操作 进行了合并
很多命令都可能出现冲突,但从根本上来讲,都是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种解决方案:保留当前的改变、保留引入的改变、保留全部