1. 假定分支master创建之后,进行一些初始化的操作,提交了几次代码,最后一次commit是7df2b56d76e21474c3a0ff2f7b5244130b4d7fe7
。
2. 有两个员工A和B分别将clone至本地,A对master分支上的文件Main.java文件进行修改之后,提交了代码,提交的commit为9a072f1b2c0643a05f37db084eb6974a4dc6c7c8
。
3. 现在员工B修改了本地master分支的Main.java文件,但是没有提前从远端把最新的代码拉下来。此时员工B提交代码,commit为25d7ee36c72ce9c68b81f4125c760f38405930f1
,此时如果员工B将远端master分支的代码拉下来将出现冲突,因为都对Main.java文件进行了修改。
那么git是如何判断员工B的代码和远端的代码冲突的呢?
首先git需要找到两个分支的ancestor commit,在当前情况下,ancestor commit为两个分支的分开的岔路口(即7df2b56d76e21474c3a0ff2f7b5244130b4d7fe7
)。
其次记录两天分支至ancestor commit之后的修改记录(文本文件记录起始行号和修改范围)。
最后生成合并结果,有三种情况:
1, 只有一条分支进行了修改,此时判断没有发生冲突;
2, 两条分支都进行了修改,但是修改记录没有发生重叠,则没有发生冲突;
3,两条分支都进行了修改,并且修改记录发生了重叠,则发生了冲突。
冲突记录方式:
<<<<<<< HEAD
3
=======
2
>>>>>>> branch1
<<<<<<<与=======之间是我们本地分支的修改,而=======与>>>>>>>是所拉取的分支的修改。