解決 Git 中的衝突(Conflict)

從資料夾來理解分支的概念 中我們已經介紹過分支的觀念,但也有提到一個「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
2
3
4
花生醬好吃!
AAAAA
BBBBB
CCCCC

(這是 PPB 做的修改)

1
2
3
4
花生醬噁爛!
AAAAA
BBBBB
CCCCC

接下來我想要從 PeaNu-branch 把 PPB-branch 分支合併進來時,就跟前面說的一樣,Git 就會跟我哀號:

1
2
3
UnMerged paths:
(use "git add <file>..." to mark resolution)
both modified: DDDDD.txt

(意思就是說 PeaNu 跟 PPB 都改到 DDDDD 檔案的同個地方,所以你們自己決定要怎麼處理。)

所以這時候就要來「解 Conflict」。打開 DDDDD 檔案,你會看到這樣的內容:

1
2
3
4
5
6
7
8
<<<<<<< HEAD(目前所在的分支,也就是 PeaNu-branch)
花生醬好吃
=======
花生醬噁爛
>>>>>>> PPB-branch(另一個分支)
AAAAA
BBBBB
CCCCC

======= 之前的部分代表 PeaNu 更改的內容,======= 之後的部分代表 PPB 更改的內容。)

這個時候你就要自己決定你想採用誰的內容。你可以選擇留下「花生醬好吃」;也可以選擇留下「花生醬噁爛」;或你也可以選擇「都不要留下」;甚至你也可以選擇「建立全新的內容」(例如:草莓醬萬歲)。

總而言之,最後你想怎麼選擇都看你自己。當你把發生衝突的地方給處理完畢後,接下來就可以繼續用 git commit -am 來完成這個合併的動作。

總結

按照慣例我們來複習一下:

  1. 當兩個人在不同分支上修改同個檔案中的相同部分,就會引發 Conflict
  2. 解決 Confict 的辦法,是自己決定要採用什麼樣的內容
  3. 解決發生衝突的部分後,必須在執行一次 git commit -am 來完成合併的動作
mentor-program-day02 從資料夾來理解分支的概念
Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×