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