一锭汛、使用svn遇到的問(wèn)題
從參加工作至今昵慌,一直使用svn作為代碼版本工具秃臣,基本能夠滿足日常工程開(kāi)發(fā)過(guò)程中的代碼版本管理需求涧衙,直到維護(hù)目前的線上運(yùn)行的項(xiàng)目哪工。
場(chǎng)景一:
完成一個(gè)版本的開(kāi)發(fā)后,例如3.0版弧哎,在svn上標(biāo)記一下當(dāng)前版本雁比,團(tuán)隊(duì)繼續(xù)開(kāi)發(fā)版本4.0。過(guò)幾天后發(fā)現(xiàn)線上的bug1撤嫩,這時(shí)候從哪個(gè)版本的代碼修復(fù)bug1偎捎,有兩種選擇,一種是直接在4.0的開(kāi)發(fā)代碼上改序攘,盡量把代碼還原到3.0時(shí)的狀態(tài)茴她,再修改bug1;另一種選擇是從svn標(biāo)記的版本檢出進(jìn)行修改程奠。這兩種方法都嘗試過(guò)丈牢,但問(wèn)題是過(guò)幾天再出現(xiàn)bug2,沒(méi)有地方能找到3.0版+bug1修復(fù)的代碼瞄沙,bug2修復(fù)遇到困難赡麦。
場(chǎng)景二:
隨著平臺(tái)3.0版本的發(fā)布,需要長(zhǎng)時(shí)間開(kāi)發(fā)大版本的需求減少帕识,零碎的小需求增多。如果把小需求都拖到大版本一起上線遂铡,會(huì)對(duì)平臺(tái)運(yùn)營(yíng)產(chǎn)生影響肮疗。因此,小版本迭代和大版本開(kāi)發(fā)的同時(shí)進(jìn)行扒接,將成為未來(lái)一段時(shí)間團(tuán)隊(duì)的矛盾點(diǎn)伪货。而與此同時(shí),如何能管理兩個(gè)并行版本的代碼钾怔,對(duì)svn來(lái)講幾乎無(wú)解碱呼。
二、嘗試更換git
通過(guò)在網(wǎng)上的簡(jiǎn)單了解宗侦,git版本庫(kù)擁有分支管理的功能愚臀,似乎可以解決svn使用過(guò)程中的問(wèn)題,決定在團(tuán)隊(duì)內(nèi)部進(jìn)行小規(guī)模的嘗試矾利。
經(jīng)過(guò)配置管理同事的努力姑裂,在公司內(nèi)網(wǎng)搭建了gitlab服務(wù),開(kāi)始git之旅男旗。
首先在iOS和安卓開(kāi)發(fā)團(tuán)隊(duì)進(jìn)行了試點(diǎn)舶斧,初步確定了以人為單位打分支,每人每天下午下班前提交代碼到自己的分支察皇,全部提交后由團(tuán)隊(duì)負(fù)責(zé)人把代碼合并到master分支茴厉。
這種方式進(jìn)行了一個(gè)版本的開(kāi)發(fā),也沒(méi)出什么亂子,仿佛git就是一個(gè)復(fù)雜版的svn矾缓,直到把git推廣到后臺(tái)開(kāi)發(fā)團(tuán)隊(duì)怀酷。
三、問(wèn)題出現(xiàn)
當(dāng)后臺(tái)也開(kāi)始使用git后而账,開(kāi)始出現(xiàn)奇怪的問(wèn)題胰坟,當(dāng)多人的開(kāi)發(fā)的分支合并到master時(shí),開(kāi)始出現(xiàn)代碼混亂泞辐,偶爾操作不規(guī)范時(shí)還會(huì)引起代碼的丟失笔横。
另外,由于后臺(tái)開(kāi)發(fā)成員要多于客戶端的開(kāi)發(fā)成員數(shù)咐吼,每天的代碼分支合并吹缔,會(huì)成為后臺(tái)負(fù)責(zé)人的一項(xiàng)工作負(fù)擔(dān)。
之所以在后臺(tái)團(tuán)隊(duì)開(kāi)始使用git后出現(xiàn)這些問(wèn)題锯茄,主要原因還是客戶端開(kāi)發(fā)人數(shù)少厢塘,每個(gè)端(工程)兩個(gè)人維護(hù),以人為單位打分支的弊端并沒(méi)有被發(fā)現(xiàn)肌幽。
四晚碾、新思路
出現(xiàn)問(wèn)題后開(kāi)始尋找解決辦法,在網(wǎng)上看到一個(gè)說(shuō)法喂急,引起了我的思考:master分支保持和線上版本一致格嘁。
那么,是不是可以嘗試多人共用一個(gè)遠(yuǎn)程分支廊移?模擬了一下在兩臺(tái)開(kāi)發(fā)機(jī)器上使用同一個(gè)遠(yuǎn)程分支的各種情況糕簿,事實(shí)證明可行。
多人共用一個(gè)遠(yuǎn)程分支時(shí)狡孔,和使用svn的效果是相似的(不相同懂诗,這里不展開(kāi)說(shuō))。
既然多人可以共同使用一個(gè)遠(yuǎn)程分支苗膝,是不是可以以版本為單位打遠(yuǎn)程分支殃恒?
五、解決方案
以平臺(tái)實(shí)際的版本開(kāi)發(fā)辱揭,推演了一下新思路芋类,平臺(tái)要在三個(gè)月后上線4.0版本,那么打一個(gè)4.0dev分支界阁。
三個(gè)月期間需要上線三個(gè)小版本侯繁,分別是3.1、3.2泡躯、3.3贮竟,由于三個(gè)小版本按順序開(kāi)發(fā)丽焊,所以只使用一個(gè)遠(yuǎn)程分支即可。
這時(shí)候一共有三個(gè)分支master咕别、4.0dev技健、3.1dev,需要開(kāi)發(fā)對(duì)應(yīng)版本的同事惰拱,克隆對(duì)應(yīng)版本的分支即可雌贱。
當(dāng)3.1版本開(kāi)發(fā)完成,經(jīng)過(guò)測(cè)試上線后偿短,首先將3.1dev的分支合并到master分支欣孤,這樣就保持了master分支和線上代碼一致。合并后昔逗,4.0dev分支從master 拉取代碼降传,拉取成功后(有沖突,解決過(guò)程不展開(kāi)說(shuō))勾怒,4.0dev分支就實(shí)際包含了3.1已發(fā)布的代碼和4.0正在開(kāi)發(fā)的代碼婆排,完美實(shí)現(xiàn)了版本的過(guò)度。
六笔链、小驚喜
無(wú)意間發(fā)現(xiàn)sourcetree的一個(gè)功能段只,分支切換〖ǎ可以把本地工作副本關(guān)聯(lián)到多個(gè)遠(yuǎn)程分支翼悴,需要時(shí)雙擊切換到對(duì)應(yīng)的分支,并刷新一下開(kāi)發(fā)環(huán)境即可幔妨。
這讓一個(gè)人參與多個(gè)分支的開(kāi)發(fā),變得十分便捷谍椅。
七误堡、線上問(wèn)題修改
解決了版本分支的問(wèn)題,解決線上問(wèn)題也變的很輕松雏吭。打出一個(gè)bug修復(fù)分支锁施,在分支上修改代碼,經(jīng)過(guò)測(cè)試后代碼發(fā)布到線上環(huán)境杖们。發(fā)布成功后合并bug修復(fù)分支到master分支悉抵,合并后各個(gè)開(kāi)發(fā)分支再?gòu)膍aster把代碼拉取到本分支。
寫(xiě)在最后
經(jīng)過(guò)兩個(gè)版本的摸索摘完,整個(gè)團(tuán)隊(duì)完成了從svn到git版本庫(kù)的過(guò)度姥饰。過(guò)程中經(jīng)歷過(guò)不少困難,遇到過(guò)很多的阻力孝治,冒著代碼丟失和進(jìn)度無(wú)法推進(jìn)的風(fēng)險(xiǎn)列粪,最終還是成功的完成了這一步审磁。
快速版本迭代成為可能。