例如有兩個分支,master
和develop
。針對1.txt
文件,
master分支
:
222
3333 66
555
develop分支
:
222
44444 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不在同一條線上了。