面試官:說說 Git 發生沖突的場景?如何解決?
本文轉載自微信公眾號「JS每日一題」,作者灰灰。轉載本文請聯系JS每日一題公眾號。
一、是什么
一般情況下,出現沖突的場景有如下:
- 多個分支代碼合并到一個分支時
- 多個分支向同一個遠端分支推送
具體情況就是,多個分支修改了同一個文件(任何地方)或者多個分支修改了同一個文件的名稱
如果兩個分支中分別修改了不同文件中的部分,是不會產生沖突,直接合并即可
應用在命令中,就是push、pull、stash、rebase等命令下都有可能產生沖突情況,從本質上來講,都是merge和patch(應用補丁)時產生沖突
二、分析
在本地主分值master創建一個a.txt文件,文件起始位置寫上master commit,如下:
然后提交到倉庫:
- git add a.txt
- git commit -m 'master first commit'
創建一個新的分支featurel1分支,并進行切換,如下:
- git checkout -b featurel1
然后修改a.txt文件首行文字為 featurel commit,然后添加到暫存區,并開始進行提交到倉庫:
- git add a.txt
- git commit -m 'featurel first change'
然后通過git checkout master切換到主分支,通過git merge進行合并,發現不會沖突
此時a.txt文件的內容變成featurel commit,沒有出現沖突情況,這是因為git在內部發生了快速合并
如果當前分支的每一個提交(commit)都已經存在另一個分支里了,git 就會執行一個“快速向前”(fast forward)操作
git 不創建任何新的提交(commit),只是將當前分支指向合并進來的分支
如果此時切換到featurel分支,將文件的內容修改成featrue second commit,然后提交到本地倉庫
然后切換到主分支,如果此時在a.txt文件再次修改,修改成mastet second commit,然后再次提交到本地倉庫
此時,master分支和feature1分支各自都分別有新的提交,變成了下圖所示:
這種情況下,無法執行快速合并,只能試圖把各自的修改合并起來,但這種合并就可能會有沖突
現在通過git merge featurel進行分支合并,如下所示:
從沖突信息可以看到,a.txt發生沖突,必須手動解決沖突之后再提交
而git status同樣可以告知我們沖突的文件:
打開a.txt文件,可以看到如下內容:
git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容:
- <<<<<<< 和 ======= 之間的區域就是當前更改的內容
- ======= 和 >>>>>>> 之間的區域就是傳入進來更改的內容
現在要做的事情就是將沖突的內容進行更改,對每個文件使用 git add 命令來將其標記為沖突已解決。一旦暫存這些原本有沖突的文件,Git就會將它們標記為沖突已解決然后再提交:
- git add a.txt
- git commit -m "conflict fixed"
此時master分支和feature1分支變成了下圖所示:
使用git log命令可以看到合并的信息:
三、總結
當Git無法自動合并分支時,就必須首先解決沖突,解決沖突后,再提交,合并完成
解決沖突就是把Git合并失敗的文件手動編輯為我們期望的內容,再提交
參考文獻
- https://www.liaoxuefeng.com/wiki/896043488029600/900004111093344
- https://vue3js.cn/interview