情緒穩定!別再讓Git合併衝突影響你工作了

陈哥聊测试發表於2024-10-21

大家好,我是陳哥,今天想和大家聊聊Git合併衝突解決~

背景

前幾天,我正好收到了一位讀者的留言:又又又又遇到了Git合併衝突,解決衝突比寫程式碼還費勁,突然想起SVN的好。該怎麼避免Git衝突啊?

我想,比如這樣?
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合併衝突

如果我們還沒有準備好解決衝突,可以先透過執行git merge --abort來中止合併。如果想要繼續解決衝突,我們有三種方式來解決衝突:接受新的更改、接受當前更改或同時接受兩個更改。 選擇三種方式中的任何一種,就能夠解決合併衝突。

2、vscode合併編輯器如何解決Git中的合併衝突

執行git merge <branch-to-merge>後,點選“開啟合併編輯器”,會出現如下的三個檢視:
Git合併衝突

左側是新分支的更改,右側是當前分支的更改,以及兩者下方的預覽。Incoming是我們想要合併到目標分支的分支中的更改,而current是我們想要合併到的分支中已有的更改。

在合併編輯器中,可使用以下任一方式開始解決衝突:

  • 逐行檢視衝突,透過選擇核取方塊來選澤保留左側還是右側更改。
  • 選擇“接受傳入”按鈕以接受所有傳入的更改,或選擇“接受當前”按鈕以保留所有存在衝突的更改的當前版本。
  • 在“結果”視窗中手動編輯程式碼。
    解決合併衝突後,單擊“接受合併”按鈕即可。

四、合併衝突並非全然是壞事

當然,如果團隊在為大型程式碼庫建立了PR,並出現合併衝突,那麼還有另一種解決方法。我們可以透過執行git pull --rebase upstream main與main重新繫結。這時,我們會看到一個解決衝突的介面以及包含衝突的檔案。完成後,執行git add .、git rebase --continue,然後強制推送到分支。

其實,合併衝突並非全然是壞事,這也是一次程式碼審查的機會。當我們掌握Git合併衝突的處理方法後,會發現團隊協作會變得更加順暢。如果你們還對Git有任何疑問,歡迎參加禪道·中國行(西安站),我們將採用遊戲工作坊的形式帶大家學習、瞭解Git。

最後,希望我的分享可以幫助到你,也歡迎給我留言與我討論。

相關文章