iT邦幫忙

2021 iThome 鐵人賽

DAY 23
1
Modern Web

【Git】從零開始學習 Git - 30 天的學習筆記系列 第 23

Day23|【Git】各種合併衝突與分別解決方式

了解分支的用途後,在合作開發上一定便利許多,但同樣地,不是每件事情都順順利利,只要有合作的事情,總是會有衝突、摩擦的狀況發生。在 Git 分支裡,常碰到「合併衝突」的情形發生,什麼是合併衝突,又怎麼樣才能解決呢?以下會慢慢講解。


合併衝突

👉 合併衝突 - 錯誤訊息提示

Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

常見的合併衝突狀況|

👉 合併內容同時修改同一行 code 時,就會有衝突情況。

假設今天有兩位服裝設計師為你打造符合你的特質的打扮,兩人共同協作,但在過程中,對於其中一件配件兩人彼此看法不同,例如帽子,但是你只有一個頭,如果雙方提供的帽子都搭上去的話,這樣就會裝載不下,也失去了初衷,這時候我們可以決定其中一個來做最後的選擇。

同理,在一個專案中,如果有多人合作,萬一改到相同的樣式設定,或者改到同一行 html 結構,那麼在合併分支時,Git 就會很貼心的提醒你,現在有地方發生衝突,只要我們查看後決定要留下哪一個 code ,之後再繼續提交就解決囉!

衝突範例|

  1. 先建立一個檔案,針對此檔案建立兩個分支(master、a_branch)

    $ mkdir demo # 建立一個 demo 資料夾
    $ cd demo # 進入 demo 資料夾
    $ git init # 建立數據庫
    $ touch index.html # 新增一個 index.html 檔案
    $ git add . # 加至暫存區
    $ git commit -m"update index.html" # 提交至儲存庫
    

    https://ithelp.ithome.com.tw/upload/images/20211005/20141010QlecCwpjNw.png

    提交完成後,我們另外建立一個分支:git branch a_branch

    https://ithelp.ithome.com.tw/upload/images/20211005/20141010071wEIgqL1.png

  2. 建立完兩個分支後,分別在兩個分支的狀態對這個 index.html 檔案做修改並提交版本。

    首先是 master 分支:

    https://ithelp.ithome.com.tw/upload/images/20211005/201410105NlpUNotsw.png

    // 檔案修改完後,加至暫存區並提交
    $ git add . # 加至暫存區
    $ git commit -m"訊息記錄" # 提交至儲存庫
    

    https://ithelp.ithome.com.tw/upload/images/20211005/20141010UzbbTvADOL.png

    再來切換到 a_branch 分支,修改 index.html 檔案。

    https://ithelp.ithome.com.tw/upload/images/20211005/201410100OgPN3rQSW.png

    https://ithelp.ithome.com.tw/upload/images/20211005/20141010xa6ndqZxM6.png

    一樣要記得加至暫存區並提交

    https://ithelp.ithome.com.tw/upload/images/20211005/20141010ha7sHTDgm9.png

  3. 現在試著將 master 分支與 a_branch 分支合併:

    $ git merge a_branch # 在 master 分支上合併 a_branch 分支
    

    https://ithelp.ithome.com.tw/upload/images/20211005/20141010tjKPPwO6A6.png

    錯誤訊息!合併發生衝突了!

解讀衝突訊息

Auto-merging index.html
CONFLICT (content): Merge conflict in index.html
Automatic merge failed; fix conflicts and then commit the result.

Auto-merging index.html - git 正在自動合併 index.html 檔案。

CONFLICT (content): Merge conflict in index.html - 合併衝突的種類屬於內容衝突 CONFLICT (content)

Automatic merge failed; fix conflicts and then commit the result. - 自動合併錯誤,請修復衝突的地方,再來進行 commit 動作。


解決方法

解決流程|

  1. 發現合併衝突訊息
  2. 使用 git status 指令查看狀態
  3. 打開有錯誤的檔案(GIt 會很貼心的幫你找出錯誤的那一行 code )
  4. 修改 - 留下最後需要的 code
  5. 使用 git add 指令將修改後的檔案加回暫存區
  6. git commit 指令繼續提交新的版本到儲存庫

🛠 實際操作範例|

首先發現有衝突提示:

https://ithelp.ithome.com.tw/upload/images/20211005/20141010PROuiNVxTW.png

使用 git status 指令查看狀態

$ git status # 查看狀態

https://ithelp.ithome.com.tw/upload/images/20211005/20141010EAs3zgjZL6.png

both modified: index.html

打開有錯誤的檔案,可以看到 Git 有貼心的幫你指出哪邊發生衝突

https://ithelp.ithome.com.tw/upload/images/20211005/20141010GKgLnhnwfm.png

將衝突的地方修改,選擇留下最終要的那個 Code

https://ithelp.ithome.com.tw/upload/images/20211005/20141010CAnZUhQNGy.png
最後才重新加至暫存區,並提交,最後就完成這次合併的動作囉!

$ git add . # 加至暫存區
$ git commit -m"訊息記錄" # 提交至儲存庫

https://ithelp.ithome.com.tw/upload/images/20211005/20141010Qn1rHHmpHP.png


使用 Rebase 合併時遇到衝突

只要是檔案之間有溝通不良情形,就會打架,即使是使用 Rebase 指令合併,也會有合併衝突的情形發生。但是使用 Rebase 指令合併發生衝突時,它的過程跟一般合併不一樣的地方在於:執行過程卡住。

這部分可以使用 SourceTree 有分支圖示會更好理解喔!

解決方式|

跟上面提過的解決方式一樣,當我們發現錯誤訊息時,首先使用檢查狀態指令,查看哪個地方出問題,後續再修改,修改完畢後再繼續執行指令,就可以完成提交囉!

👉 流程大概:
發現錯誤訊息
git status 找到問題點
→ 修改
git add 加回暫存區
git rebase --continue


非文字檔的合併衝突

$ git checkout --ours [檔名] // 如果決定使用當前分支的檔案
$ git checkout --theirs [檔名] // 如果決定使用對方的檔案

先前提到的檔案合併大多都是文字檔案,Git 就可以使用標記的方式告訴我們哪裡出錯,但有時候會遇到例如圖片檔之類的二進位檔,這時候就會難以使用肉眼的方式發現衝突的地方。

解決方式|

查看錯誤訊息提示

決定要使用哪個分支的檔案作為最後的選擇

根據當前的分支,來決定使用的參數 --ours / --theirs

git add 指令加回暫存區

git commit 指令提交至儲存庫


上一篇
Day22|【Git】合併的另一個指令 - Rebase 與取消方式
下一篇
Day24|【Git】認識 git tag 標籤常用指令、標籤與分支的差異
系列文
【Git】從零開始學習 Git - 30 天的學習筆記30

尚未有邦友留言

立即登入留言