解決 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
(因為我們已將其設定為預設差異工具)。請看下圖。
左窗格顯示在本地分支中對檔案 README.md
所做的編輯。中間窗格包含為解決衝突所做的更改結果。右窗格顯示在遠端分支(即我們要合併的分支)中的編輯內容,即 main
。
我們可以選擇保留本地和遠端更改或其中之一。我們將選擇保持遠端分支更改如下。
然後我們將儲存並退出 meld
工具。
我們將列印 README.md
檔案並檢視更新。
$ cat README.md
# Upwork
Upwork projects
我們現在將更改提交到 Git。
$ git commit -m "merged from main"
[feature1 3c39d7b] merged from main
我們現在將執行 git diff
命令來檢查 feature1
和 main
分支之間的衝突。
$ 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
合併兩個分支時的衝突。