比如有两个分支,master
和develop
。针对1.txt
文件,
master分支
:
222
3333 66
555
develop分支
:
222
4444 77
888
先是有master,然后我创建了develop分支,然后再在develop分支下修改了1.txt,然后add和commit,然后切换回master分支,然后merge,就只报66和77冲突,别的两个地方不报冲突
为什么只有66和77那会产生冲突。而4444与3333,还有555和888不冲突呢?不明白
看上图,在master分支是555555,在dev我改成了5445,然后add commit,然后切换回master分支,merge,没有冲突,最后合并为了5445,是不是你说的情况?
是否出现 Conflicts(冲突),取决于 commit 修改先后顺序
楼上朋友提到了自动合并,也就是不会产生冲突的情况,举个例子:
master 上面,你有一个 commit,内容是 "1234"
这时候你在 master 基础上创建了新的 branch,叫
develop
,那么这个develop
branch 上面也有内容为 "1234" 的那个commit然后你提交了新的 commit,把 "1234" 变成了 "1234 666",那这个时候你
merge
,就不会有冲突再举个例子,会产生冲突的情况:
你在这个 commit 之后创建了新的 branchmaster
里面有一个 commit,内容是 "1234"master
里面有一个 commit,内容是 "1234"你在这个 commit 之后创建了新的 branch,叫
develop
。那这个时候你的develop
,叫
develop
。那这个时候你的develop
branch 里有第一个 commit,内容为 "1234"develop
里面,提交了一个 commit,内容是 "1234 777"在这期间,你的
master
更新了,你的同事或者朋友,或者你自己,在master
然后你在develop
里面,提交了一个 commit,内容是 "1234 777"在这期间,你的
master
更新了,你的同事或者朋友,或者你自己,在master
上提交了一个新的 commit,把它更新成了 "1234 666"这时候你再 merge,就会有冲突了,因为 git 发现这两个 branch 有个共同的祖先(ancestor),也就是那个 "1234",但 git 并不知道你现在合并,到底是要 "666" 还是 "777"
因为还有自动合并啊。你是在手动合并分支时看到冲突的吗?
试过发现不行,下面是原答案。
都是我猜的。
一开始master类似这样:
然后你fork了一个develop,修改成这样:
这个时候,develop是可以直接合并会master的,没冲突,因为develop在master后,是对master的修改。
但是你没合并develop,而是改了master:
这时66和77那里就冲突了。因为git知道develop里的4444是从3333改的,888是从555改的,现在的master那个位置还是有3333和555。但是77本来是从22改的,但是现在master的22那里变成66,就有了两个冲突的修改,git就不能把77合并到66那里了。
或者说本来master和develop是一条线上的,但是你改了master,这个新的master就和原来的develop不在同一条线上了。