多人開發(fā)時Git下沖突的產(chǎn)生和解決
沖突的產(chǎn)生很多命令都可能出現(xiàn)沖突,但從根本上來講,都是merge 和 patch(應(yīng)用補(bǔ)丁)時產(chǎn)生沖突。而rebase就是重新設(shè)置基準(zhǔn),然后應(yīng)用補(bǔ)丁的過程,所以也會沖突。git pull會自動merge,repo sync會自動rebase,所以git pull和repo sync也會產(chǎn)生沖突。當(dāng)然git rebase就更不用說了。沖突的類型邏輯沖突git自動處理(合并/應(yīng)用補(bǔ)?。┏晒?,但是邏輯上是有問題的。比如另外一個人修改了文件名,但我還使用老的文件名,這種情況下自動處理是能成功的,但實(shí)際上是有問題的。又比如,函數(shù)返回值含義變化,但我還使用老的含義,這種情況自動處理成功,但可能隱藏著重大BUG。這種問題,主要通過自動化測試來保障。所以最好是能夠?qū)懗霰容^完備的自動化測試用例。這種沖突的解決,就是做一次BUG修正。不是真正解決git報(bào)告的沖突。內(nèi)容沖突兩個用戶修改了同一個文件的同一塊區(qū)域,git會報(bào)告內(nèi)容沖突。我們常見的都是這種,后面的解決辦法也主要針對這種沖突。樹沖突文件名修改造成的沖突,稱為樹沖突。比如,a用戶把文件改名為a.c,b用戶把同一個文件改名為b.c,那么b將這兩個commit合并時,會產(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í)行前面兩個git rm時,會告警“file-name : needs merge”,可以不必理會。?樹沖突也可以用git mergetool來解決,但整個解決過程是在交互式問答中完成的,用d 刪除不要的文件,用c保留需要的文件。最后執(zhí)行g(shù)it commit提交即可。內(nèi)容沖突的解決辦法發(fā)現(xiàn)沖突一般來講,出現(xiàn)沖突時都會有“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)錯,可能并不是直接提示沖突,而是下面這樣:error:?project mini/sample注:無論是否存在沖突,只要本地修改不是基于服務(wù)器最新的,它都可能報(bào)告這個錯誤,解決方法都是一樣。?這個時候,需要進(jìn)入報(bào)錯的項(xiàng)目(git庫)目錄,然后執(zhí)行g(shù)it rebase解決:git rebase remote-branch-name沖突解決的一般過程merge/patch的沖突解決先編輯沖突,然后git commit提交。注:對于git來講,編輯沖突跟平時的修改代碼沒什么差異。修改完成后,都是要把修改添加到緩存,然后commit。rebase的沖突解決rebase的沖突解決過程,就是解決每個應(yīng)用補(bǔ)丁沖突的過程。解決完一個補(bǔ)丁應(yīng)用的沖突后,執(zhí)行下面命令標(biāo)記沖突已解決(也就是把修改內(nèi)容加入緩存):git add?-u注:-u 表示把所有已track的文件的新的修改加入緩存,但不加入新的文件。?然后執(zhí)行下面命令繼續(xù)rebase:git rebase?--continue有沖突繼續(xù)解決,重復(fù)這這些步驟,直到rebase完成。?如果中間遇到某個補(bǔ)丁不需要應(yīng)用,可以用下面命令忽略:git rebase?--skip?如果想回到rebase執(zhí)行之前的狀態(tài),可以執(zhí)行:git rebase?--abort?注:rebase之后,不需要執(zhí)行commit,也不存在新的修改需要提交,都是git自動完成。編輯沖突的方法直接編輯沖突文件沖突產(chǎn)生后,文件系統(tǒng)中沖突了的文件(這里是test.txt)里面的內(nèi)容會顯示為類似下面這樣:a123
<<<<<<<?HEAD
b789
=======
b45678910
>>>>>>>?6853e5ff961e684d3a6c02d4d06183b5ff330dcc
c其中:沖突標(biāo)記<<<<<<< (7個