一個(gè)項(xiàng)目使用git從多條分支進(jìn)行開(kāi)發(fā),一個(gè)分支上的修改可能和一個(gè)不同分支上的相似,在合并時(shí)難免會(huì)產(chǎn)生沖突。在產(chǎn)生沖突時(shí)通常需要我們自己指導(dǎo)來(lái)解決。
首先用一個(gè)簡(jiǎn)單的場(chǎng)景重現(xiàn)合并產(chǎn)生沖突。
新建一個(gè)文件夾GitMerge,里面新建一個(gè)“a.txt ”,內(nèi)容是hello world,并使用 git init 初始化本地git庫(kù)。
git add a.txt 加入追蹤,并提交到版本庫(kù)git commit -a 提交描述為create txt
git branch alternate 創(chuàng)建分支alternate?
在主線master中修改文件a.txt ,將內(nèi)容修改為“hello world master”,并將修改提交(描述:add master)。
切換到alternate分支,同樣對(duì)a.txt 文件做修改,修改為“hello world alternate”,并提交(描述:add alternate)。
提交完可以使用git log 查看提交的歷史記錄。
下面切換到主線master(git checkout master),把分支alternate合并到master(git merge alternate)。
因?yàn)槲覀冊(cè)趍aster和alternate中都是修改的同一文件的同一地方,可以看到合并時(shí)產(chǎn)生了沖突。這時(shí)Git會(huì)把有沖突的地方標(biāo)記出來(lái),但不會(huì)處理,需要我們自己手動(dòng)去處理??梢允褂?b>git diff 調(diào)查沖突的程度。
其實(shí)在產(chǎn)生沖突的文件中,Git已經(jīng)把產(chǎn)生沖突的地方標(biāo)記出來(lái)了,查看a.txt 文件,可以看到。
可以看出master修改的內(nèi)容在<<<和===之間(當(dāng)前為master分支,HEAD指向master),alternate修改的在===和>>>之間。
這種情況我們可以根據(jù)需求選擇master上的內(nèi)容或者alternate的內(nèi)容,或者是用全新的內(nèi)容來(lái)代替。我這里選擇的是master的內(nèi)容,所以將alternate修改的刪除即可。在手動(dòng)編輯完a.txt 后。
執(zhí)行 git add a.txt?
再執(zhí)行git commit,編輯commit信息。
合并沖突處理完成。
最后使用git log 查看一下提交歷史。
借助第三方可視化工具。
這只是一個(gè)最簡(jiǎn)單的合并沖突場(chǎng)景重現(xiàn),實(shí)際項(xiàng)目中的沖突可能復(fù)雜的多,但是一樣可以依據(jù)這個(gè)來(lái)處理。
補(bǔ)充幾個(gè)命令:
git reset --hard HEAD ?終止合并,撤銷(xiāo)未提交的合并,會(huì)把工作目錄和索引都還原到git merge命令之前。
git reset --hard ORIG_HEAD? 撤銷(xiāo)已經(jīng)提交的合并。可能會(huì)遇到丟失目錄中未提交的修改。用git reset --merge ORIG_HEAD 可避免。