文章目录:
问题记录
正文
1.什么是commit?
2.合并
3.什么是冲突?
4. 那么什么样commit产生冲突呢?
5.例子
6.解决merge conflict
7.原文链接
问题记录
问题概述:
1. 图中所示, 在master分支里aa.txt内容为: 111 222 333
2. dev分支里aa.txt内容为: 111 222
3. 两个分支进行合并为何会产生冲突??
或许你看完这篇文章应该会有所收获!
正文
什么是commit?
首先git的区分文件变化的最细粒度是line行, 不是单词更不是字母, 行变化主要是增删改三种,
commit可以看成是记录这些增删改操作的数据.
commit是一个add,del,update的集合,update分解为一个del配置一个add,
update n 可以表示为(del n)+(add n.5)+ [add(n)+c]或者(del n)+(add (n-1).5)+ [add(n)+c],
其中n表示为第n行, n.5表示为 在第n行后添加一行,c表示为在n行后的末尾添加数据.
看到这里可能大家看不懂这里写的内容, 我给大家详细讲解清楚.
在git中修改(update)某行可以包括以下内容:
1. 删除某行
2. 在某行的末尾添加内容
3. 在某行的后面添加一行. 也就是n.5.
注意: 在平时当中好像没有第三点的内容,在某行的后面添加一行, 但在在git冲突里,就有这个, 这个在git冲突里很密切.
说白了,也就是说, 这三点其中一个或者多个都是属于修改(update)的范围之内.
所以commit只是一个del和add的集合,只要记录下del的行号. add的gap号的集合,配合待变化的base文件.就可以精确确定修改内容是什么.这些add和del是无序的,只要全部应用到base文件,就会得到相同的结果文件.
注: gap就是平均数的意思, 在文中gap号就是1.5 2.5 3.5 4.5...之类的. 都是以.5结尾的小数.
通过 第一行的行号为1和第二行的行号为2 累加求平均为1.5 以此类推.
base文件就是源文件(基地文件).
2.合并
合并两次commit就是两个ops集合的合并,合并是可以递归的,一系列commit可以合并成一个commit,对应就是一系列ops集合合并为一个大ops集合.
3.什么是冲突?
冲突就是指两次commit的执行顺序会影响到最终结果文件内容的不同.这就是通常说的冲突.
也就是不能简单机械地合并,否则不符合预期, 那么我们的预期是什么呢? 预期就是颠倒两次commit得到的结果是一样的.
这样的合并过程需要人为参与,告诉git合并的时候应该以什么的结果为准.
4.那么什么样commit产生冲突呢?
根据实验验证了得到以下结论:
1. 两个commit.add到同一个gap. 那么不同的操作顺序最终结果不同. 这两个commit是conflict(冲突)
2. 两个commit.当删除第n行或者在第n行末尾添加新内容或者把第n行替换成新内容或者在第n行上把该行的内容删除一部分时,只留下一部分时, 这一行本身和这一行前后的gap都被被锁定-----可以认为时被污染的范围之内. 此时在本行的前后面不能继续删除以及不能在末尾添加新内容以及在本行的前面或者后面不能添加一行新内容. 这样会产生冲突.
3. 可以看以下图:
注意: 根据实验验证出来的,如果有地方不是正确的,欢迎你的指正.
5.例子
用整数来表示行号, 用x.5表示第x行后的gap,即: 在第x行后添加一行新内容. c表示要在末尾添加的内容,c取决用户的输入.
commitA : update lin4--------> 修改的范围有: del 4, add 3.5, add 4.5 (add4)+c
commitB : update lin3--------> 修改的范围有: del 3, add 2.5, add 3.5 (add3)+c
commitC : update lin2--------> 修改的范围有: del 2, add 1.5, add 2.5 (add2)+c
从上面三个A,B,C值可以得到以下分析:
- 在commitA,commitB,commitC都有对应的修改范围. 当commitA和commitB进行合并时,产生的冲突会大,因为当删除第4行或者在第4行末尾添加内容时,此时第4行的前后面都不能有对应的删除和行末尾添加内容的操作. 同时在3.5和4.5里上不能添加一行内容。 commitA和commitB产生冲突的原因还有, commitA在3.5上添加一行新内容,同时commitB也在3.5上添加一行新内容,如果添加一行新内容相同则不会冲突,如果添加一行新内容不相同就会冲突. commitA和commitB也有不会产生冲突的原因,比如commitA在4.5上添加一行新内容,commitB在3.5上添加一行新内容.如果两个添加一行新内容相同或者不相同都不会产生冲突.
- commitA和commitC一定是不会产生冲突的
- commitB和commitC是会产生冲突的.与第1种一样, 以此类推.
解决merge conflict
7.原文链接
https://www.cnblogs.com/linlei2099/p/10016355.html
记录:
1. 原文链接文章里和我实验验证有不同的地方. 本文章是根据原文的内容再次实验验证得出的新结论,
2. 我感觉原文章里的可以推翻. 如果有想去深入了解的小伙伴,可以先去原文章.根据原文章内容和实验验证得出的结论跟我的文章对比看看.
3. 如果我文章有地方写的不对, 欢迎来指正. 我感激不尽.