原文: https://w3c.hexschool.com/git/921e90ff
---------
並非每次分支合併都會一帆風順,如果剛好合併內容同時修改同一行 CODE 時,就會導致衝突。
這裡也來分享如何解決衝突,也附上本小節 Git 範例程式碼。
情境解說
dev
的c4
分支,修改了all.css
,加入了h1
樣式進去master
的c5
分支,也同樣改了all.cs
,並加入了h1
樣式
更重要的是他們改的行數是一樣的,所以必然會產生衝突。
接下來我們就 checkout 到 master
後,來合併到 dev
。
git merge dev
此時,終端機會回饋衝突訊息
❯ git merge dev
Auto-merging all.css
CONFLICT (content): Merge conflict in all.css
Automatic merge failed; fix conflicts and then commit the result.
這裡的意思是,all.css 確實發生衝突了,此時該檔案會變成 Unmerged
狀態,所以目前合併過程尚未,Git 請我們將衝突檔案解決掉後,才能順利合併。
所以這裡該怎麼做呢?我們先用 git status
觀看訊息。你會發現 all.css
目前變成 Unmerged paths
狀態。
所以接下來,我們就進入到 all.css
看看發生什麼事情了。
body{
color: red;
}
h1{
<<<<<<< HEAD
color: blue
=======
color: red
>>>>>>> dev
}
來詳細解釋下:
- 從 <<<< 到 === 的內容,意思是你當前的 HEAD 位置,依此範例,就是
master
。 - 從 === 到 >>> 就是
dev
的內容。
此時你要衡量要保留 master
還是 dev
,假使你要保留讓文字變成藍色,那就讓他變成以下程式碼。
body{
color: red;
}
h1{
color: blue
}
當儲存後,你就可以輸入 git add all.css
將它重新加入索引後,你可以使用 git status
觀察狀態。
此時的回饋就會說,您目前沒有任何衝突了,可以使用 git commit
來提交。於是我們就輸入該指令後。就會彈跳編輯器顯示預設訊息。
Merge branch 'dev'
# Conflicts:
# all.css
#
# It looks like you may be committing a merge.
# If this is not correct, please remove the file
# .git/MERGE_HEAD
# and try again.
# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# All conflicts fixed but you are still merging.
#
# Changes to be committed:
# modified: index.html
#
Git 預設訊息裡,你也可以自己編輯相關內容,若是覺得沒問題就儲存關閉,本次合併就完成了!
也附上 Sourcetree 提供參考。
流程回顧
- checkout 到
master
後,輸入git merge dev
- 發生衝突,
all.css
變成Unmerged
狀態 - 修改
all.css
後,重新加入到索引git add all.css
- 透過
git status
指令觀察,是否可以重新提交 - 輸入
git commit
提交,並撰寫 commit 訊息,完成本次合併
小結
通常在衝突上,不會只有單一檔案或某一行程式碼。可能會出現一個檔案會有多處衝突地方,或者是兩個檔案有衝突,此時就依照上面步驟調整好後,再依序加入索引就沒問題了。