你有沒有遇到過這樣的情況:興沖沖地改了代碼,準備提交時,Git突然報錯說“Conflict”?別慌,這其實就是Git衝突。今天我們就來聊聊這個常見的Git問題,從“爲什麼會產生”到“怎麼快速解決”,讓你輕鬆上手。
什麼是Git衝突?¶
簡單說,Git衝突就是當兩個不同版本的代碼在同一個文件的同一位置被修改時,Git無法自動判斷該保留哪部分內容,於是需要你手動“拍板”的情況。
想象一下:你和同事同時寫一篇文檔,你改了第一段第一行,同事也改了第一段第一行。當你想把同事的修改“拉”到自己的版本里時,Git就會犯難:“這兩行到底留誰的?”——這就是衝突。
爲什麼會產生衝突?¶
衝突的核心原因是“同一位置的修改”。具體來說,常見場景有:
-
多人協作改同一文件
比如你在本地分支(main)改了文件A的第3行,同時同事在遠程分支(dev)也改了文件A的第3行。當你執行git pull或git merge dev時,Git就會發現衝突。 -
分支合併時的版本差異
如果你從main分支創建了一個新分支(feature),在feature裏改了文件B的第5行,而main分支也被別人改了文件B的第5行。合併main到feature時,就可能衝突。 -
刪除與新增的衝突
比如你刪除了文件C的某行,而別人在那行下面新增了內容,Git會困惑“這行到底刪還是留?”
如何快速解決衝突?¶
解決衝突其實很簡單,記住“找標記→改內容→標記已解決”三步就行。下面用例子一步步教你:
第一步:發現衝突,打開衝突文件¶
當執行git pull或git merge時,Git會提示“Automatic merge failed”(自動合併失敗)。這時候打開報錯的文件(比如test.txt),你會看到類似這樣的衝突標記:
<<<<<<< HEAD
// 這是你本地分支(HEAD)的修改內容
Hello World
=======
// 這是要合併的分支(比如dev)的修改內容
Hi Git
>>>>>>> dev
這些符號是Git自動添加的,用來分隔不同版本的代碼:
- <<<<<<< HEAD:當前分支(HEAD)的修改,你可以理解爲“你的版本”。
- =======:分隔線,上面是你的修改,下面是別人的修改。
- >>>>>>> dev:要合併的分支(比如dev)的修改,你可以理解爲“別人的版本”。
第二步:編輯衝突內容,解決分歧¶
衝突標記之間的內容就是需要你手動選擇或合併的部分。比如上面的例子中,你需要決定“Hello World”和“Hi Git”到底保留哪個,或者改成“Hello Hi Git”(如果兩者都需要保留的話)。
操作建議:
- 如果只需要保留“你的版本”:刪除=======和下面的>>>>>>> dev,只留<<<<<<< HEAD上面的內容。
- 如果只需要保留“別人的版本”:刪除<<<<<<< HEAD和上面的內容,只留=======下面的內容。
- 如果兩者都要保留:合併內容,比如改成Hello Hi Git,並刪除所有衝突標記。
修改後的文件應該是你想要的最終內容,比如:
Hello Hi Git
第三步:標記爲已解決,繼續操作¶
解決完衝突後,需要告訴Git“衝突已解決”,執行:
git add test.txt # 把修改後的文件標記爲已解決(如果有多個文件,逐個add或用git add .)
然後繼續合併或拉取操作:
- 如果是合併衝突:執行git merge --continue(或git rebase --continue,如果是rebase的話)。
- 如果是拉取衝突:執行git pull --continue。
這時候Git會自動生成一個新的提交,衝突就解決啦!
小技巧:用工具快速解決¶
如果衝突比較複雜(比如多行代碼衝突),手動改容易出錯,推薦用可視化工具:
- VS Code:打開衝突文件後,右側會出現“Accept Current Change”(保留你的)、“Accept Incoming Change”(保留別人的)、“Accept Both Changes”(合併兩者)按鈕,直接點擊即可。
- VS Code之外:也可以用命令行工具meld(需提前安裝)或git mergetool,自動彈出比較界面。
如何避免衝突?¶
預防比解決更重要!記住這幾個小習慣:
1. 經常拉取代碼:每天開始工作前,執行git pull拉取最新代碼,避免本地修改和遠程版本差距太大。
2. 小步提交,明確分工:別等所有代碼寫完才提交,拆分成小功能逐步提交;團隊成員儘量分工修改不同文件,減少重疊。
3. 多用分支:每個新功能用獨立分支開發(git checkout -b feature/xxx),合併前確保功能完整,減少合併時的衝突風險。
4. 提交前溝通:如果多人修改同一文件,提前在羣裏同步進度,避免重複勞動。
總結¶
Git衝突並不可怕,本質是Git在告訴你“有兩個版本的代碼需要你決策”。只要記住“找標記→改內容→標記已解決”三步,就能輕鬆解決。更重要的是通過“常拉取、小提交、明分工”的習慣,從源頭減少衝突的發生。
下次遇到衝突,別慌,跟着步驟走,你就是團隊裏最靠譜的“衝突解決小能手”!