1 回答

TA貢獻(xiàn)1802條經(jīng)驗(yàn) 獲得超4個(gè)贊
沖突的產(chǎn)生
很多命令都可能出現(xiàn)沖突,但從根本上來(lái)講,都是merge 和 patch(應(yīng)用補(bǔ)?。r(shí)產(chǎn)生沖突。
而rebase就是重新設(shè)置基準(zhǔn),然后應(yīng)用補(bǔ)丁的過(guò)程,所以也會(huì)沖突。
git pull會(huì)自動(dòng)merge,repo sync會(huì)自動(dòng)rebase,所以git pull和repo sync也會(huì)產(chǎn)生沖突。當(dāng)然git rebase就更不用說(shuō)了。
沖突的類型
邏輯沖突
git自動(dòng)處理(合并/應(yīng)用補(bǔ)丁)成功,但是邏輯上是有問(wèn)題的。
比如另外一個(gè)人修改了文件名,但我還使用老的文件名,這種情況下自動(dòng)處理是能成功的,但實(shí)際上是有問(wèn)題的。
又比如,函數(shù)返回值含義變化,但我還使用老的含義,這種情況自動(dòng)處理成功,但可能隱藏著重大BUG。這種問(wèn)題,主要通過(guò)自動(dòng)化測(cè)試來(lái)保障。所以最好是能夠?qū)懗霰容^完備的自動(dòng)化測(cè)試用例。
這種沖突的解決,就是做一次BUG修正。不是真正解決git報(bào)告的沖突。
內(nèi)容沖突
兩個(gè)用戶修改了同一個(gè)文件的同一塊區(qū)域,git會(huì)報(bào)告內(nèi)容沖突。我們常見(jiàn)的都是這種,后面的解決辦法也主要針對(duì)這種沖突。
樹沖突
文件名修改造成的沖突,稱為樹沖突。
比如,a用戶把文件改名為a.c,b用戶把同一個(gè)文件改名為b.c,那么b將這兩個(gè)commit合并時(shí),會(huì)產(chǎn)生沖突。
$ git status
added by us: b.c
both deleted: origin-name.c
added by them: a.c
如果最終確定用b.c,那么解決辦法如下:
git rm a.c
git rm origin-name.c
git add b.c
git commit
執(zhí)行前面兩個(gè)git rm時(shí),會(huì)告警“file-name : needs merge”,可以不必理會(huì)。
樹沖突也可以用git mergetool來(lái)解決,但整個(gè)解決過(guò)程是在交互式問(wèn)答中完成的,用d 刪除不要的文件,用c保留需要的文件。
最后執(zhí)行g(shù)it commit提交即可。
內(nèi)容沖突的解決辦法
發(fā)現(xiàn)沖突
一般來(lái)講,出現(xiàn)沖突時(shí)都會(huì)有“CONFLICT”字樣:
$ git pull
Auto-merging test.txt
CONFLICT (content): Merge conflict in test.txt
Automatic merge failed; fix conflicts and then commit the result.
但是,也有例外,repo sync的報(bào)錯(cuò),可能并不是直接提示沖突,而是下面這樣:
error: project mini/sample
注:無(wú)論是否存在沖突,只要本地修改不是基于服務(wù)器最新的,它都可能報(bào)告這個(gè)錯(cuò)誤,解決方法都是一樣。
這個(gè)時(shí)候,需要進(jìn)入報(bào)錯(cuò)的項(xiàng)目(git庫(kù))目錄,然后執(zhí)行g(shù)it rebase解決:
git rebase remote-branch-name
沖突解決的一般過(guò)程
merge/patch的沖突解決
先編輯沖突,然后git commit提交。
注:對(duì)于git來(lái)講,編輯沖突跟平時(shí)的修改代碼沒(méi)什么差異。修改完成后,都是要把修改添加到緩存,然后commit。
rebase的沖突解決
rebase的沖突解決過(guò)程,就是解決每個(gè)應(yīng)用補(bǔ)丁沖突的過(guò)程。
解決完一個(gè)補(bǔ)丁應(yīng)用的沖突后,執(zhí)行下面命令標(biāo)記沖突已解決(也就是把修改內(nèi)容加入緩存):
git add -u
注:-u 表示把所有已track的文件的新的修改加入緩存,但不加入新的文件。
然后執(zhí)行下面命令繼續(xù)rebase:
git rebase --continue
有沖突繼續(xù)解決,重復(fù)這這些步驟,直到rebase完成。
如果中間遇到某個(gè)補(bǔ)丁不需要應(yīng)用,可以用下面命令忽略:
git rebase --skip
如果想回到rebase執(zhí)行之前的狀態(tài),可以執(zhí)行:
git rebase --abort
注:rebase之后,不需要執(zhí)行commit,也不存在新的修改需要提交,都是git自動(dòng)完成。
編輯沖突的方法
直接編輯沖突文件
沖突產(chǎn)生后,文件系統(tǒng)中沖突了的文件(這里是test.txt)里面的內(nèi)容會(huì)顯示為類似下面這樣:
a123
<<<<<<< HEAD
b789
=======
b45678910
>>>>>>> 6853e5ff961e684d3a6c02d4d06183b5ff330dcc
c
其中:沖突標(biāo)記<<<<<<< (7個(gè)<)與=======之間的內(nèi)容是我的修改,=======與>>>>>>>之間的內(nèi)容是別人的修改。
此時(shí),還沒(méi)有任何其它垃圾文件產(chǎn)生。
最簡(jiǎn)單的編輯沖突的辦法,就是直接編輯沖突了的文件(test.txt),把沖突標(biāo)記刪掉,把沖突解決正確。
- 1 回答
- 0 關(guān)注
- 4053 瀏覽
添加回答
舉報(bào)