同時修改同一個檔案的同一行code,就會發生衝突。
若修改同一個檔案的不同行code,就會成功合併。
這個邏輯很容易理解,因為同時修改同一個地方,git根本不知哪個才是正確的內容。
延續Git-合併分支。
現在,產生一個發生衝突的情況。
建立feature分支。
線圖。
在master分支,將a.txt內容的第一行改為123,再commit。
線圖。
在feature分支,再將a.txt內容的第一行改為456,再commit。
線圖。
接下來,將master分支合併feature分支。
果然發生衝突了。
Auto-merging a.txt:
表示git正在自動合併a.txt這個檔案。
CONFLICT (content) : Merge conflict in a.txt:
合併衝突的種類屬於內容衝突「CONFLICT (content)」,
發生衝突的檔案是a.txt「Merge conflict in a.txt」。
Automatic merge failed; fix conflicts and then commit the result.:
自動合併錯誤,請修復衝突,然後再commit結果。
看看git status的訊息
You have unmerged paths.
你有一個未合併的路徑。意味著,目前的合併尚未完成。
分支顯示(master|MERGING)也明確指示正處於合併狀態。
git status的訊息提示,有兩個解決方式。
(fix conflicts and run "git commit")
修復衝突,再commit。
(use "git merge --abort" to abort the merge)
放棄這次的合併。
我們先放棄這次合併,回到合併前的狀態。
重點注意,訊息顯示nothing to commit, working tree clean,
這才是正常狀態,表示目前都沒有東西需要commit,工作目錄是乾淨的狀態。
再一次合併,依舊會發生衝突。
訊息Unmerged paths:
(use "git add <file>..." to mark resolution)
git會提示你,add 衝突的檔案,標記為解決方案。
下面紅字,就代表衝突的檔案,並特別標示both modified。
打開a.txt
<<<<<<< HEAD
123
=======
456
>>>>>>> feature
會發現,內容被git修改了。
這是因為遇到衝突時,git會將衝突的檔案內容改成它自訂的格式,顯示所有的修改內容。
表示目前所在分支的檔案內容。
<<<<<<< HEAD
123
表示目前feature分支的檔案內容。
456
>>>>>>> feature
中間以=======相隔
因為git不會知道,哪個才是我們要的code,預設就是全部留下來。
但,這絕不會是我們需要的,一定都是手動修改完後再合併。
假設將code修改成這樣,儲存。
123456
修改完成後,執行add,再看一次狀態。
這時訊息顯示All conflicts fixed but you are still merging.
表示衝突已解決,但注意看分支狀態,目前還處在合併中,所以仍然需要進行合併。
git有給提示:(use "git commit" to conclude merge)
可以執行git commit來結束commit。
一樣會跳出合併訊息,儲存後離開。
git log
線圖。
工作目錄是處於乾淨的狀態。
本文為觀看網路教學的學習筆記。