一個項目使用git從多條分支進行開發(fā)行疏,一個分支上的修改可能和一個不同分支上的相似,在合并時難免會產(chǎn)生沖突。在產(chǎn)生沖突時通常需要我們自己指導(dǎo)來解決。
首先用一個簡單的場景重現(xiàn)合并產(chǎn)生沖突酱固。
新建一個文件夾GitMerge,里面新建一個“a.txt ”头朱,內(nèi)容是hello world运悲,并使用 git init 初始化本地git庫。
git add a.txt 加入追蹤项钮,并提交到版本庫git commit -a 提交描述為create txt
git branch alternate 創(chuàng)建分支alternate?
在主線master中修改文件a.txt 班眯,將內(nèi)容修改為“hello world master”,并將修改提交(描述:add master)烁巫。
切換到alternate分支署隘,同樣對a.txt 文件做修改,修改為“hello world alternate”亚隙,并提交(描述:add alternate)磁餐。
提交完可以使用git log 查看提交的歷史記錄。
下面切換到主線master(git checkout master)阿弃,把分支alternate合并到master(git merge alternate)崖媚。
因為我們在master和alternate中都是修改的同一文件的同一地方,可以看到合并時產(chǎn)生了沖突恤浪。這時Git會把有沖突的地方標(biāo)記出來畅哑,但不會處理,需要我們自己手動去處理水由≤牛可以使用git diff 調(diào)查沖突的程度。
其實在產(chǎn)生沖突的文件中砂客,Git已經(jīng)把產(chǎn)生沖突的地方標(biāo)記出來了泥张,查看a.txt 文件,可以看到鞠值。
可以看出master修改的內(nèi)容在<<<和===之間(當(dāng)前為master分支媚创,HEAD指向master),alternate修改的在===和>>>之間彤恶。
這種情況我們可以根據(jù)需求選擇master上的內(nèi)容或者alternate的內(nèi)容钞钙,或者是用全新的內(nèi)容來代替。我這里選擇的是master的內(nèi)容声离,所以將alternate修改的刪除即可芒炼。在手動編輯完a.txt 后。
執(zhí)行 git add a.txt?
再執(zhí)行git commit术徊,編輯commit信息本刽。
合并沖突處理完成。
最后使用git log 查看一下提交歷史。
借助第三方可視化工具子寓。
這只是一個最簡單的合并沖突場景重現(xiàn)暗挑,實際項目中的沖突可能復(fù)雜的多,但是一樣可以依據(jù)這個來處理斜友。
補充幾個命令:
git reset --hard HEAD ?終止合并窿祥,撤銷未提交的合并,會把工作目錄和索引都還原到git merge命令之前蝙寨。
git reset --hard ORIG_HEAD? 撤銷已經(jīng)提交的合并晒衩。可能會遇到丟失目錄中未提交的修改墙歪。用git reset --merge ORIG_HEAD 可避免听系。