從使用git開(kāi)始,遇到過(guò)各種各樣的merge事故,本團(tuán)隊(duì)內(nèi)的大大小小的事故就不下10起藕各。小的merge錯(cuò)誤,有的被測(cè)試當(dāng)做bug提出焦除,有的則是自己對(duì)該模塊的代碼再次修改時(shí)激况,才能再次發(fā)現(xiàn);大的merge錯(cuò)誤膘魄,則會(huì)block整個(gè)團(tuán)隊(duì)提交代碼的動(dòng)作乌逐,甚至?xí)绊懓l(fā)版。本文主要討論一些merge的注意事項(xiàng)以及小技巧瓣距。
1. 強(qiáng)烈建議使用Beyond Compare merge代碼
Android Studio的VCS某些功能很好用黔帕,如批量pull與push,但是merge代碼的功能實(shí)在不敢恭維蹈丸。舉一個(gè)比較簡(jiǎn)單的例子:
上圖中成黄,沖突的解決,需要手動(dòng)選擇local(left)與remote(right)逻杖,撤芩辏看到新手直接選擇remote,或者直接選擇local荸百,把其中一個(gè)丟棄闻伶,甚至直接自信點(diǎn)擊右下角apply,這無(wú)疑造成了一起merge事故够话。
來(lái)看看Beyond Compare的merge方式:
圖片下半部分中蓝翰,Beyond Compare會(huì)給出建議的merge結(jié)果光绕,可視化效果也做得很不錯(cuò),讓用戶有意識(shí)去選擇local(left)畜份,或者remote(right)诞帐,處理過(guò)后的結(jié)果還不滿意,也可以自己手動(dòng)編輯爆雹。在這個(gè)例子中停蕉,可以「choose left then right」。
以上的例子還算簡(jiǎn)單钙态,遇到復(fù)雜且數(shù)量多的沖突慧起,Beyond Compare會(huì)明顯比Android Studio好用,而且基本都會(huì)提供靠譜「建議結(jié)果」册倒。需要注意的是蚓挤,即使提供了「建議結(jié)果」,也需要一一review剩失,不要想當(dāng)然屈尼。另外,如果自己不了解業(yè)務(wù)層代碼拴孤,或者實(shí)在不知道怎么解決一個(gè)沖突脾歧,請(qǐng)叫人叫人叫當(dāng)事人。
2. 盡量避免沖突
避免沖突演熟,merge的時(shí)候就會(huì)省去很多力氣鞭执。有幾個(gè)避免沖突的小技巧(歡迎補(bǔ)充):
- 公共模塊,盡量不要在文件的末尾增加代碼芒粹。如styles.xml這類的公共模塊文件兄纺,如新增的style直接在末尾增加,其他開(kāi)發(fā)者也把新增的style添加在末尾化漆,merge時(shí)則會(huì)造成沖突估脆。如果沒(méi)有嚴(yán)格的順序要求,可以把新增的style增加到一個(gè)隨機(jī)的中間位置座云。
-
禁止大面積format代碼疙赠。有的同學(xué)有強(qiáng)迫癥,寫(xiě)代碼時(shí)容不下一兩個(gè)空格的差異朦拖,然后順手按下cmmd+shift+f圃阳,就把整個(gè)文件format了。merge的時(shí)候璧帝,發(fā)現(xiàn)幾十個(gè)沖突(如果其他人也編輯了這個(gè)文件)捍岳,用的還是Android Studio,瞬間懵逼。如果非要format代碼锣夹,可以用鼠標(biāo)選中看不順眼那幾行再format:
- 提前溝通页徐,減小沖突的可能性。如果某些模塊需要兩個(gè)人一起修改晕城,這時(shí)兩人需要提前溝通各自需要修改的地方泞坦,merge代碼時(shí)可能造成沖突的地方,然后再分工砖顷,盡量減小沖突,而且一定不要有重復(fù)工作赃梧。
3. 注意remote被刪除了的情況
可能存在這種情況滤蝠,merge的時(shí)候,remote上的a.java文件被刪除了授嘀,而local又不小心地(1)在a.java增加了一些空格物咳;(2)甚至進(jìn)行了業(yè)務(wù)代碼的修改。
首先蹄皱,要識(shí)別出remote文件被刪除并造成沖突的情況览闰。如下圖:
圖片中的①位置diff區(qū)域,可以看出是空白的巷折,而執(zhí)行②压鉴,使用Beyond Compare merge時(shí),Beyond Compare會(huì)沒(méi)有反應(yīng)锻拘,且圖中③的位置會(huì)莫名其妙多出好多merge時(shí)的tmp文件油吭。這時(shí)就可斷定出remote中的該文件被刪除了。
針對(duì)以上(1)的情況署拟,可以選擇「resolve using 'theirs'」直接把文件刪除婉宰。而針對(duì)(2)的情況,需要與文件的刪除者溝通推穷,再把自己修改的代碼挪到相應(yīng)的地方心包。
反之,也可能出現(xiàn)local中文件被刪除馒铃,remote中有人修改該文件的情況:
可以看到diff區(qū)域全是增加(+)的綠色蟹腾。處理的方法和上述類似。
4. 新建文件重構(gòu)時(shí)骗露,注意及時(shí)同步代碼
如果要新建a.java與b.java文件岭佳,對(duì)c.java文件進(jìn)行重構(gòu),2個(gè)星期后萧锉,重構(gòu)完成珊随,需要保證這兩個(gè)星期內(nèi)在c.java的修改,也同步到重構(gòu)后的a.java與b.java中。
5. import相關(guān)的沖突基本可以忽略叶洞,使用BC推薦的解決沖突方式即可
有時(shí)候import的沖突也比較多鲫凶,解決起來(lái)也比較繁瑣,其實(shí)可以跳過(guò)手工合并衩辟,直接選擇Beyond Compare推薦的結(jié)果螟炫,即使推薦錯(cuò)了,編譯期也能發(fā)現(xiàn)編譯錯(cuò)誤艺晴,到時(shí)候再自動(dòng)import即可昼钻。
6. Merge時(shí)的commit message使用默認(rèn)的
常常看到有人修改了merge節(jié)點(diǎn)的commit message封寞,替換成倆字:merge然评。務(wù)必使用默認(rèn)的commit message,如下圖狈究,帶有conflict信息:
保留的conflict信息也對(duì)日后有用碗淌。
總結(jié),使用好的解決沖突工具:Beyond Compare抖锥,當(dāng)然還有Source Tree這樣優(yōu)秀的git工具亿眠。盡量減小沖突。以認(rèn)真的態(tài)度對(duì)待merge磅废。