多人開發(fā)時(shí)Git下沖突的產(chǎn)生和解決
沖突的產(chǎn)生很多命令都可能出現(xiàn)沖突,但從根本上來講,都是merge 和 patch(應(yīng)用補(bǔ)?。r(shí)產(chǎn)生沖突。而rebase就是重新設(shè)置基準(zhǔn),然后應(yīng)用補(bǔ)丁的過程,所以也會(huì)沖突。git pull會(huì)自動(dòng)merge,repo sync會(huì)自動(dòng)rebase,所以git pull和repo sync也會(huì)產(chǎn)生沖突。當(dāng)然git rebase就更不用說了。沖突的類型邏輯沖突git自動(dòng)處理(合并/應(yīng)用補(bǔ)?。┏晒?,但是邏輯上是有問題的。比如另外一個(gè)人修改了文件名,但我還使用老的文件名,這種情況下自動(dòng)處理是能成功的,但實(shí)際上是有問題的。又比如,函數(shù)返回值含義變化,但我還使用老的含義,這種情況自動(dòng)處理成功,但可能隱藏著重大BUG。這種問題,主要通過自動(dòng)化測(cè)試來保障。所以最好是能夠?qū)懗霰容^完備的自動(dòng)化測(cè)試用例。這種沖突的解決,就是做一次BUG修正。不是真正解決git報(bào)告的沖突。內(nèi)容沖突兩個(gè)用戶修改了同一個(gè)文件的同一塊區(qū)域,git會(huì)報(bào)告內(nèi)容沖突。我們常見的都是這種,后面的解決辦法也主要針對(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來解決,但整個(gè)解決過程是在交互式問答中完成的,用d 刪除不要的文件,用c保留需要的文件。最后執(zhí)行g(shù)it commit提交即可。內(nèi)容沖突的解決辦法發(fā)現(xiàn)沖突一般來講,出現(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ù)器最新的,它都可能報(bào)告這個(gè)錯(cuò)誤,解決方法都是一樣。?這個(gè)時(shí)候,需要進(jìn)入報(bào)錯(cuò)的項(xiàng)目(git庫)目錄,然后執(zhí)行g(shù)it rebase解決:git rebase remote-branch-name沖突解決的一般過程merge/patch的沖突解決先編輯沖突,然后git commit提交。注:對(duì)于git來講,編輯沖突跟平時(shí)的修改代碼沒什么差異。修改完成后,都是要把修改添加到緩存,然后commit。rebase的沖突解決rebase的沖突解決過程,就是解決每個(gè)應(yīng)用補(bǔ)丁沖突的過程。解決完一個(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è)