解決 Git 中的合併衝突

Azhar Bashir Khan 2022年4月1日
解決 Git 中的合併衝突

在本教程中,我們將演示如何解決在 Git 中合併兩個分支時出現的衝突。

通常,協作團隊環境中的不同團隊成員通常對相同的檔案進行工作。例如,一位從事某些功能開發的團隊成員可能會編輯 README 檔案以提供有關所開發功能的資訊。

另一位致力於修復錯誤的團隊成員可能會在同一個 README 檔案中新增有關已修復錯誤的資訊。他們可能在不同的分支上工作並在各自的分支中提交他們的更改。

有時,需要合併不同的分支以提供有凝聚力的構建。因此,在不同分支更新相同檔案時,此操作會導致合併衝突。

然後需要解決衝突併合並更改。我們現在將通過一個例子來說明這一點。

使用 git mergetool 解決合併兩個分支時出現的衝突

在解決合併衝突之前,我們應該設定 Git 使用的 diff 工具,如下所示。

$ git config merge.tool meld
$ git config merge.conflictstyle diff3
$ git config mergetool.prompt false

上面的命令將 meld 設定為預設的 diff 工具。此外,我們已將 conflictstyle 設定為 diff3;這將 diff 工具設定為顯示兩個檔案的共同祖先(當前分支一和分支中要合併的分支)。

要檢視支援的不同差異工具,請執行以下命令。

$ git mergetool --tool-help

現在,我們從示例開始演示如何解決衝突。假設我們有兩個分支,如下所示。

$ git branch
* main
  feature1

第一個分支是 main 分支,第二個是名為 feature1 的功能開發分支。

我們在 main 分支中有一個 README.md 檔案,其內容如下。

$ cat README.md
# Upwork
Upwork projects

如上所示,我們目前在 main 分支。然後,我們切換到 feature1 分支。

$ git checkout feature1
Switched to branch 'feature1'

$ git branch
  main
* feature1

我們更新 README.md 並列印其內容如下。

$ cat README.md
This is conflicting branch line.

現在,我們將 main 分支與 feature1 分支合併以獲取該分支中的最新更改。

合併時,Git 顯示合併衝突如下。

$ git merge main
Auto-merging README.md
CONFLICT (add/add): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.

我們可以通過以下方式獲得有關衝突的更多資訊。

$ git status
On branch feature1
You have unmerged paths.
  (fix conflicts and run "git commit")

Unmerged paths:
  (use "git add <file>..." to mark resolution)

	both added:      README.md

no changes added to commit (use "git add" and/or "git commit -a")

我們現在將列印檔案 README.md 的內容,該檔案存在衝突。

$ cat README.md 
<<<<<<< HEAD
This is conflicting branch line.

||||||| merged common ancestors
=======
# Upwork
Upwork projects
>>>>>>> main

該檔案現在顯示了各種符號。

符號 <<<<<<< 後跟 HEAD 是當前分支的別名。這表示此部分中編輯的開始。

======== 符號表示當前分支中修訂的結束和新分支中編輯的開始。

符號 >>>>>>>> 後跟遠端分支名稱,即 main,顯示嘗試合併的位置。

現在,我們將使用 mergetool 來解決衝突。

$ git mergetool
Merging:
README.md

Normal merge conflict for 'README.md':
  {local}: created file
  {remote}: created file

這將啟動 meld(因為我們已將其設定為預設差異工具)。請看下圖。

git-mergetool-meld1

左窗格顯示在本地分支中對檔案 README.md 所做的編輯。中間窗格包含為解決衝突所做的更改結果。右窗格顯示在遠端分支(即我們要合併的分支)中的編輯內容,即 main

我們可以選擇保留本地和遠端更改或其中之一。我們將選擇保持遠端分支更改如下。

git-mergetool-meld2

然後我們將儲存並退出 meld 工具。

我們將列印 README.md 檔案並檢視更新。

$ cat README.md
# Upwork
Upwork projects

我們現在將更改提交到 Git。

$ git commit -m "merged from main"
[feature1 3c39d7b] merged from main

我們現在將執行 git diff 命令來檢查 feature1main 分支之間的衝突。

$ git diff feature1 main

我們將檢查 feature1 分支的狀態。

$ git status
On branch feature1

Untracked files:
  (use "git add <file>..." to include in what will be committed)

	README.md.orig

它顯示了一個檔案 README.md.orig,它是在合併時由 mergetool 建立的。

執行以下命令將其刪除:

$ git clean -f

因此,我們已經成功解決了使用 Git 的 mergetool 合併兩個分支時的衝突。

相關文章 - Git Merge