大家好,我是陳哥,今天想和大家聊聊Git合併衝突解決~
背景
前幾天,我正好收到了一位讀者的留言:又又又又遇到了Git合併衝突,解決衝突比寫程式碼還費勁,突然想起SVN的好。該怎麼避免Git衝突啊?
我想,比如這樣?
在我看來,Git合併衝突是不可避免的。在本文,我想和大家簡單分享一下遇到Git衝突該如何解決,希望對大家有所幫助。 在此之前,我們先來了解一下Git的合併衝突是什麼以及合併衝突的型別有哪些。或者如果只對如何解決Git合併衝突感興趣,也可以滑至第三部分直接閱讀。
一、如何識別Git中的合併衝突?
在Git中,我們在兩個不同的分支對同一個檔案進行更改,特別是在同一檔案的同一行盡心更改,會容易產生合併衝突。 在這種情況下,Git無法自動解決這些更改之間的不一致性,它會暫停合併過程,並將衝突標記出來,等待我們手動解決。
舉一個簡單的合併衝突的示例:
- 在分支main中工作,並修改了mytext.txt檔案的第1行,如Hi world。
- 切換到分支new-feature,然後對mytext.txt的第二行進行修改,如Hello earth。
當我們準備嘗試將new-feature分支合併到main分支時,Git無法自動決定在Hi world和Hello earth之間接受哪一個。因此,Git會提醒合併衝突錯誤,並告訴我們手動解決衝突。
這時,Git會自動用小於號(<)、等號(=)和大於號(>)註釋出衝突行,如下所示:
<<<<<<< HEAD(Current Change)
Hi world
=======
Hello earth
>>>>>>> new-feature(Incoming Change)
小於號(<)和等號(=)之間的內容是當前分支(Current Change)中的更改。等號(=)和大於號(>)之間的內容是我們要合併到另一個分支的分支變更。
我們可以自行刪除這些註釋,再決定如何處理衝突程式碼行。因此,我們不必將合併衝突看作絆腳石,而可以將其作為需要刪除的一些註釋以及需要接受或拒絕的內容。
二、Git中合併衝突的型別有那些?
常見的合併衝突有兩種型別:內容衝突和結果衝突。
1、內容衝突
我們在兩個不同分支上,對同一行程式碼進行修改,就會發生內容衝突。例如,我們在一個分支的第2行修改了display: flex,又在另一個分支的同一檔案的第2行修改了text-align: center。這就是會產生內容衝突,Git會提示我們對程式碼進行調整。
2、結構合併衝突
結構衝突是指我們在兩個不同分支上進行的修改會影響同一個檔案。雖然彼此之間不發生逐行衝突,但這些更改會影響檔案的結構或組織,如重新命名變數、函式、移動程式碼塊等。如果發生結構衝突,Git會提示我們想保留哪些更改。
三、如何解決Git中的合併衝突
既然我們已經瞭解了Git的合併衝突以及合併衝突的型別,那麼我們具體來看看到底該如何解決Git中的合併衝突。
現在許多程式碼編輯器都能有在本地合併時,解決合併衝突的介面,我將以vscode為例子說明如何解決合併衝突。
1、如何在vscode中解決合併衝突
當我們切換到要合併的分支並執行git merge branch-to-merge時,如果存在衝突,系統會提示我們需要解決。vscode中的介面如下所示:
如果我們還沒有準備好解決衝突,可以先透過執行git merge --abort來中止合併。如果想要繼續解決衝突,我們有三種方式來解決衝突:接受新的更改、接受當前更改或同時接受兩個更改。 選擇三種方式中的任何一種,就能夠解決合併衝突。
2、vscode合併編輯器如何解決Git中的合併衝突
執行git merge <branch-to-merge>後,點選“開啟合併編輯器”,會出現如下的三個檢視:
左側是新分支的更改,右側是當前分支的更改,以及兩者下方的預覽。Incoming是我們想要合併到目標分支的分支中的更改,而current是我們想要合併到的分支中已有的更改。
在合併編輯器中,可使用以下任一方式開始解決衝突:
- 逐行檢視衝突,透過選擇核取方塊來選澤保留左側還是右側更改。
- 選擇“接受傳入”按鈕以接受所有傳入的更改,或選擇“接受當前”按鈕以保留所有存在衝突的更改的當前版本。
- 在“結果”視窗中手動編輯程式碼。
解決合併衝突後,單擊“接受合併”按鈕即可。
四、合併衝突並非全然是壞事
當然,如果團隊在為大型程式碼庫建立了PR,並出現合併衝突,那麼還有另一種解決方法。我們可以透過執行git pull --rebase upstream main與main重新繫結。這時,我們會看到一個解決衝突的介面以及包含衝突的檔案。完成後,執行git add .、git rebase --continue,然後強制推送到分支。
其實,合併衝突並非全然是壞事,這也是一次程式碼審查的機會。當我們掌握Git合併衝突的處理方法後,會發現團隊協作會變得更加順暢。如果你們還對Git有任何疑問,歡迎參加禪道·中國行(西安站),我們將採用遊戲工作坊的形式帶大家學習、瞭解Git。
最後,希望我的分享可以幫助到你,也歡迎給我留言與我討論。