本地分支衝突

洧杰 已發佈 2019-11-17

並非每次分支合併都會一帆風順,如果剛好合併內容同時修改同一行 CODE 時,就會導致衝突。

這裡也來分享如何解決衝突,也附上本小節 Git 範例程式碼

情境解說

images

  1. devc4 分支,修改了 all.css,加入了 h1 樣式進去
  2. masterc5 分支,也同樣改了 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 狀態。

images

所以接下來,我們就進入到 all.css 看看發生什麼事情了。

body{
    color: red;
}
h1{
<<<<<<< HEAD
    color: blue
=======
    color: red
>>>>>>> dev
}

來詳細解釋下:

  1. 從 <<<< 到 === 的內容,意思是你當前的 HEAD 位置,依此範例,就是 master
  2. 從 === 到 >>> 就是 dev 的內容。

此時你要衡量要保留 master 還是 dev,假使你要保留讓文字變成藍色,那就讓他變成以下程式碼。

body{
    color: red;
}
h1{
    color: blue
}

當儲存後,你就可以輸入 git add all.css 將它重新加入索引後,你可以使用 git status 觀察狀態。

images

此時的回饋就會說,您目前沒有任何衝突了,可以使用 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 提供參考。

images

流程回顧

  1. checkout 到 master 後,輸入 git merge dev
  2. 發生衝突,all.css 變成 Unmerged 狀態
  3. 修改 all.css 後,重新加入到索引 git add all.css
  4. 透過 git status 指令觀察,是否可以重新提交
  5. 輸入 git commit 提交,並撰寫 commit 訊息,完成本次合併

小結

通常在衝突上,不會只有單一檔案或某一行程式碼。可能會出現一個檔案會有多處衝突地方,或者是兩個檔案有衝突,此時就依照上面步驟調整好後,再依序加入索引就沒問題了。

影片教學

這裡也附上我錄製的影片,幫助你加深觀念。

關於筆者

暱稱:洧杰

介紹:六角學院校長,熱愛分享與交流的前端工程師,目前專注於兼容桌面/移動網頁前端開發,期間已協助數百位平面設計師,網頁設計師導入標準網頁設計。