在 從資料夾來理解分支的概念 中我們已經介紹過分支的觀念,但也有提到一個「Conflict(衝突)」的概念,所以這篇會解釋一下什麼是衝突?以及如何解決衝突?
衝突怎麼發生的?
簡單來說,衝突指的就是「兩個人都改到同一個檔案的同一個地方」。
舉個例子:
假設有 A、B 分支,現在 PeaNu 在分支 A 改了 DDDDD 這個檔案的第 1 行,PPB 也剛好在分支 B 改了 DDDDD 這個檔案的第 1 行。
那當要合併時,你把自己想成是 Git,你覺得應該要相信 PeaNu 還是 PPB?
很無解吧?所以這種時候 Git 沒辦法幫你自動處理,它只能無奈的跟你說:「PeaNu 在 DDDDD 檔案的第 1 行改了什麼,PPB 也在 DDDDD 檔案的第 1 行改了什麼。我不知道誰的才是對的,所以你們自己處理私人恩怨囉。」
這種時候就需要人工來處理,也就是俗稱的「解 Conflict」。
怎麼解決衝突?
我們用一個例子來說明吧。
假設跟剛剛的例子一樣,但為了方便區分,這裡的兩條分支改成 PeaNu-branch 跟 PPB-branch。而 PeaNu 跟 PPB 都在各自的分支上改了 DDDDD 檔案的第一行:
(這是 PeaNu 做的修改)
1 | 花生醬好吃! |
(這是 PPB 做的修改)
1 | 花生醬噁爛! |
接下來我想要從 PeaNu-branch 把 PPB-branch 分支合併進來時,就跟前面說的一樣,Git 就會跟我哀號:
1 | UnMerged paths: |
(意思就是說 PeaNu 跟 PPB 都改到 DDDDD 檔案的同個地方,所以你們自己決定要怎麼處理。)
所以這時候就要來「解 Conflict」。打開 DDDDD 檔案,你會看到這樣的內容:
1 | <<<<<<< HEAD(目前所在的分支,也就是 PeaNu-branch) |
(======= 之前的部分代表 PeaNu 更改的內容,======= 之後的部分代表 PPB 更改的內容。)
這個時候你就要自己決定你想採用誰的內容。你可以選擇留下「花生醬好吃」;也可以選擇留下「花生醬噁爛」;或你也可以選擇「都不要留下」;甚至你也可以選擇「建立全新的內容」(例如:草莓醬萬歲)。
總而言之,最後你想怎麼選擇都看你自己。當你把發生衝突的地方給處理完畢後,接下來就可以繼續用 git commit -am 來完成這個合併的動作。
總結
按照慣例我們來複習一下:
- 當兩個人在不同分支上修改同個檔案中的相同部分,就會引發 Conflict
- 解決 Confict 的辦法,是自己決定要採用什麼樣的內容
- 解決發生衝突的部分後,必須在執行一次
git commit -am來完成合併的動作