青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

   C++ 技術(shù)中心

   :: 首頁 :: 聯(lián)系 ::  :: 管理
  160 Posts :: 0 Stories :: 87 Comments :: 0 Trackbacks

公告

鄭重聲明:本BLOG所發(fā)表的原創(chuàng)文章,作者保留一切權(quán)利。必須經(jīng)過作者本人同意后方可轉(zhuǎn)載,并注名作者(天空)和出處(CppBlog.com)。作者Email:coder@luckcoder.com

留言簿(27)

搜索

  •  

最新隨筆

最新評(píng)論

評(píng)論排行榜

使用svn幾年了,一直對(duì)分支和合并敬而遠(yuǎn)之,一來是因?yàn)榉种У墓芾聿辉撐也傩模砑词股婕暗椒种У墓芾恚膊桓屹Q(mào)然使用合并功能,生怕合并出了問題對(duì)團(tuán)隊(duì)造成不良影響,最主要的原因是,自己對(duì)分支的目的和合并的方法不甚了解,這才是硬傷。


最近由于適配機(jī)型的需要(本人從事手機(jī)客戶端的開發(fā)),需要經(jīng)常接觸分支和合并兩項(xiàng)工作,突然發(fā)現(xiàn)這玩意整不明白很難開展工作,遂這兩天著重研究了一下,有點(diǎn)收獲,怕以后忘了,故趁著余溫尚在趕緊寫下來,好記性不如爛筆頭嘛。下文的實(shí)踐主要是參考了TortoiseSVN的幫助文檔和Subversion的在線文檔,Subversion的在線文檔:http://svnbook.red-bean.com/en/1.5/svn-book.html


話說我公司現(xiàn)在的源代碼管理挺亂的,svn目錄并沒有采取標(biāo)準(zhǔn)的source/branches、source/trunk結(jié)構(gòu),主線和分支放得到處都是,release版本也并沒有當(dāng)成tag處理,而是當(dāng)成branch來管理,經(jīng)常還要在release版本上改來改去。。。


先說說什么是branch。按照Subversion的說法,一個(gè)branch是某個(gè)development line(通常是主線也即trunk)的一個(gè)拷貝,見下圖:

branch存在的意義在于,在不干擾trunk的情況下,和trunk并行開發(fā),待開發(fā)結(jié)束后合并回trunk中,在branch和trunk各自開發(fā)的過程中,他們都可以不斷地提交自己的修改,從而使得每次修改在repository中都有記錄。



設(shè)想以下場景,如果你的項(xiàng)目需要開發(fā)一個(gè)新功能,而該功能可能會(huì)修改項(xiàng)目中的絕大多數(shù)文件,而與此同時(shí),你的另一位同事正在進(jìn)行bug fix,如果你的新功能不在branch中開發(fā)而直接在trunk中開發(fā),那么你極有可能影響另一位同事的bug fix,他/她在bug修復(fù)中可能會(huì)遇到各種各樣的問題,因?yàn)槟愕念l繁提交代碼引入了過多的不穩(wěn)定因素。你可能會(huì)說,那我在開發(fā)的過程中不提交不就行了,等到我全部開發(fā)結(jié)束我再提交,是,你可以這么做,那還要版本控制干什么呢?也許等到你最后提交代碼的時(shí)候(也許一周,也許兩周?),你會(huì)發(fā)現(xiàn)有一大堆conflict等著你resolve。。。


那么,正確的做法是什么?使用branch,從trunk創(chuàng)建branch,然后在你的branch上開發(fā),開發(fā)完成后再合并到trunk中。


關(guān)于branch先講到這里,下面說說什么叫做合并。很好理解,當(dāng)branch開發(fā)完成后(包括必要的測試),將branch中的修改同步到trunk中,這個(gè)過程有可能包括修改文件、增加文件、刪除文件等等。


說到這里,貌似本文差不多可以結(jié)束了,不就是分支和合并么?只要再簡單地說說如何建立分支和如何合并就可以收尾了,可能只需兩個(gè)命令,也可能只需鼠標(biāo)點(diǎn)幾下然后鍵盤敲兩下即可。其實(shí)事情遠(yuǎn)非這么簡單,愛動(dòng)腦筋的同學(xué)可能會(huì)問了,將branch的改動(dòng)merge到trunk的時(shí)候,和上文說的直接在trunk中全部開發(fā)完然后提交有何區(qū)別?你最后還不是要處理一大堆conflict?


這個(gè)問題問得非常好,其實(shí)這正是本文的重點(diǎn):branch和trunk在并行開發(fā)的過程中如何感知對(duì)方,branch如何才能在開發(fā)過程中不會(huì)和trunk越走越遠(yuǎn),導(dǎo)致最后無法合并?試想一下,如果在你開發(fā)branch的過程中,trunk中的某個(gè)類文件已經(jīng)被刪除了(這可能是另外一個(gè)家伙在另一個(gè)branch上開發(fā)了兩周后才合并到trunk的),而你竟然在這個(gè)類文件上做了大量修改,試問你到最后合并回trunk的時(shí)候該有多蛋疼?解決這一問題的唯一手段是,branch要不停地和trunk保持同步,你要及時(shí)地知道trunk都做了什么修改,這些修改是否會(huì)影響你正在開發(fā)的新功能,如果需要,你必須及時(shí)調(diào)整branch的代碼,使之能與trunk“兼容”。


那么如何讓branch和trunk保持同步?合并,從trunk合并到branch,你沒聽錯(cuò),是從trunk合并到branch。關(guān)于TortoiseSVN的合并,有幾點(diǎn)需要注意:

  • TortoiseSVN的合并發(fā)生在本地,也即你的working copy中,你無需過多擔(dān)心會(huì)對(duì)repository中的代碼造成影響
  • 不管是從trunk合并到branch還是最終從branch合并回trunk,在每次合并前最好先update,然后將本地的修改先全部commit,保護(hù)好現(xiàn)場,萬一合并不理想隨時(shí)都可以revert
  • 合并完成后看是否能正確編譯,然后測試驗(yàn)證,最后將合并后的改動(dòng)提交到repository



下面我將step by step地演示如何一次完整的branching和merging,包括創(chuàng)建分支、分支開發(fā)、分支和主線同步,分支合并到主線的全過程,甚至包括如何在本地創(chuàng)建一個(gè)測試用的repository。


首先需要安裝TortoiseSVN,我安裝的版本是:TortoiseSVN 1.6.15, Build 21041 - 32 Bit , 2011/03/23 18:00:27


1、本地Repository的創(chuàng)建

repository的創(chuàng)建很簡單,假設(shè)我要在D:\TortoiseSVN\TestRepository目錄中創(chuàng)建repository,只需右鍵TestRepository目錄,依次選擇"TortoiseSVN" -> "Create repository here"便完成了repository的創(chuàng)建。


2、Check out

假設(shè)要check out到D:\TortoiseSVN\TestSVN,同樣很簡單,在D:\TortoiseSVN目錄下創(chuàng)建TestSVN目錄,然后在該目錄上右鍵,選擇"SVN Check out...",在彈出的窗口中的"URL of repository"中填入"file:///D:/TortoiseSVN/TestRepository",其他默認(rèn)即可,最后點(diǎn)擊ok。


3、trunk創(chuàng)建新項(xiàng)目MyProject

相當(dāng)簡單就不贅述了,只列出本次操作所作出的修改:



4、創(chuàng)建branch

在/trunk/MyProject目錄上右鍵,依次選擇"TortoiseSVN" -> "Branch/tag...",在彈出窗口的"To URL"中填入分支的地址,在這里目標(biāo)revision選擇HEAD revision,如下圖所示,添加log后點(diǎn)擊ok分支便建立了。這個(gè)操作速度非常快,新建的branch在repository中其實(shí)只是一個(gè)指向trunk某個(gè)revision的軟連接而已,并沒有真的復(fù)制文件。


5、Check out分支

右鍵TestSVN目錄選擇"TortoiseSVN Update"即可將剛剛建立的分支下載回本地。進(jìn)入/branches/MyProject目錄下你會(huì)發(fā)現(xiàn)其文件結(jié)構(gòu)和/trunk/MyProject一模一樣。


6、branch提交一個(gè)新文件


7、trunk緊接著提交一個(gè)修改


8、branch再次提交一個(gè)修改

9、將trunk中的修改同步到branch


6-8演示的是branch和trunk在獨(dú)立、并行地開發(fā)。為了防止在“錯(cuò)誤”的道路上越走越遠(yuǎn),現(xiàn)在branch意識(shí)到是時(shí)候和trunk來一次同步了(將trunk合并到branch)。

首先,在本地trunk中先update一下,有沖突的解決沖突,保證trunk和repository已經(jīng)完全同步,然后在/branches/MyProject上右鍵,依次選擇"TortoiseSVN" -> “Merge...”,在彈出的窗口中選擇第一項(xiàng)"Merge a range of revision",這個(gè)類型的Merge已經(jīng)介紹得很清楚,適用于將某個(gè)分支或主線上提交的多個(gè)revision間的變化合并到另外一個(gè)分支上。



點(diǎn)擊next后,出現(xiàn)如下窗口:

由于是要從trunk合并到branch,理所當(dāng)然這里的"URL to merge from"應(yīng)該填trunk的路徑,"Revision range to merge"很好理解,就是你要將trunk的哪些revision所對(duì)應(yīng)的變化合并到branch中,可以是某一連串的revision,比如4-7,15-HEAD,也可以是某個(gè)單獨(dú)的revision號(hào)。由于在r4中,trunk修改了Person.Java中的talk()方法,所以這里的revision只需填4即可。點(diǎn)擊next后出現(xiàn)下圖:

在這里只需保留默認(rèn)設(shè)置即可。在點(diǎn)擊Merge按鈕前你可以先Test merge一把,看成功與否,以及merge的詳細(xì)信息。點(diǎn)擊Merge按鈕后trunk所做的修改將同步到branch中。



10、提交合并后的branch


至此,branch已經(jīng)完全和trunk同步,branch和trunk的代碼相處很融洽,沒有任何沖突,如果branch已經(jīng)開發(fā)結(jié)束,那是時(shí)候?qū)ranch合并回trunk了,當(dāng)然,如果branch還要繼續(xù)開發(fā),那你將不斷地重復(fù)6-10這幾個(gè)步驟。


11、將branch合并回trunk

在/trunk/MyProject上右鍵(注意是在主線的目錄上右鍵),依次選擇"TortoiseSVN" -> "Merge...",在彈出的窗口中,Merge type選擇第二項(xiàng)"Reintegrate a branch",這種類型的合并適合在分支開發(fā)結(jié)束后將所有的改動(dòng)合并回主線。



點(diǎn)擊next后出現(xiàn)如下窗口:

在這里,"From URL"選擇/branches/MyProject,無需選擇revision號(hào),Reintegrate會(huì)將branch上所有修改合并到trunk。后面的步驟和上文第9步中的一樣,不再啰嗦了。如無意外,branch將成功合并到trunk,你需要做的只是將合并后的trunk趕緊commit!


12、提交合并后的trunk

so easy...


13、刪除branch

如果你認(rèn)為你新加的功能已經(jīng)開發(fā)完成了,你可以刪除你的分支



到這里,我已經(jīng)給你演示完了整個(gè)過程,我一身的汗也下來了,我想罷工了,不過最后我們還是看看所有的log信息吧,通過log能發(fā)現(xiàn)我們干的所有事情:

r1-r7正是我上文在干的事情,從Message中你能發(fā)現(xiàn)我對(duì)trunk和branch都干了什么,另外,在Log Messages窗口的左下角勾選了"Include merged revisions"你還能看到額外的Merge information:


圖中灰色的是和merge相關(guān)的log,共發(fā)生了兩次merge,第一次是在r6,在r6中,branch合并了trunk在r4時(shí)提交的變化;第二次是在r7,在r7中,trunk合并了branch從r2到r6的所有變化。




終于可以寫寫總結(jié)了:

  • branch主要用于新功能的開發(fā)
  • 合并發(fā)生在本地working copy,只要你不提交就不會(huì)影響到repository
  • 合并前一定要先update、commit,保證不會(huì)out of day,并將本地的修改保存到repository
  • branch和trunk并行開發(fā)的過程中,要經(jīng)常同步,將trunk的修改合并到branch,合并時(shí)選擇"Merge a range of revision"
  • branch最后合并回trunk時(shí),merge type選擇"Reintegrate a branch"
posted on 2017-04-12 15:15 C++技術(shù)中心 閱讀(440) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 其他編程
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美午夜精彩| 欧美一级片一区| 亚洲欧美在线磁力| 亚洲男人av电影| 欧美亚洲三区| 久久精品夜色噜噜亚洲a∨| 欧美在线视频一区二区| 久久精品91| 你懂的亚洲视频| 日韩性生活视频| 香港成人在线视频| 欧美暴力喷水在线| 欧美日一区二区在线观看| 国产精品日韩在线| 亚洲成人在线视频播放| 一本久久综合亚洲鲁鲁| 性8sex亚洲区入口| 欧美国产第二页| 亚洲视频图片小说| 久久久一本精品99久久精品66| 免费视频一区| 国产精品免费观看在线| 亚洲欧洲日韩综合二区| 西瓜成人精品人成网站| 欧美国产精品日韩| 亚洲精品三级| 亚洲一区免费看| 久久亚洲综合色一区二区三区| 欧美精品亚洲精品| 国产视频在线观看一区二区| 在线播放亚洲| 午夜精品久久久久久99热| 欧美黄色影院| 久久av在线看| 国产精品分类| 日韩一区二区高清| 免费黄网站欧美| 亚洲一区二区三区影院| 欧美寡妇偷汉性猛交| 国内久久婷婷综合| 香蕉成人久久| 一区二区三区四区国产| 蜜桃久久精品乱码一区二区| 国产日韩欧美在线播放| 亚洲一区二区三区四区五区黄| 欧美大尺度在线| 欧美在线播放高清精品| 国产精品第13页| 亚洲视频在线观看| 亚洲日本视频| 美国成人直播| 亚洲缚视频在线观看| 久久乐国产精品| 久久9热精品视频| 国产亚洲成av人在线观看导航| 亚洲欧美日韩系列| 中日韩视频在线观看| 国产精品国产三级国产aⅴ9色| 一区二区三区毛片| 日韩亚洲欧美成人一区| 欧美日韩中文另类| 欧美一级二级三级蜜桃| 欧美有码在线视频| 亚洲国产成人精品视频| 亚洲福利久久| 欧美伦理91| 亚洲砖区区免费| 欧美一级片久久久久久久| 国产亚洲精久久久久久| 久久精品视频99| 久久久久久婷| 99热这里只有精品8| 亚洲美女免费视频| 国产欧美三级| 欧美gay视频| 欧美久色视频| 久久精品亚洲热| 欧美+亚洲+精品+三区| 亚洲视频免费观看| 久久成人免费网| 亚洲精品一区二区三区99| 99在线精品视频| 国产自产v一区二区三区c| 欧美大片在线观看| 国产精品日韩欧美| 亚洲东热激情| 欧美在线首页| 久久躁狠狠躁夜夜爽| 国产精品国产福利国产秒拍| 亚洲免费视频网站| 久久国产精品亚洲77777| 尤物精品国产第一福利三区| 亚洲福利视频一区二区| 欧美亚韩一区| 欧美成人69av| 国产精品视频专区| 亚洲高清在线精品| 国产精品网站在线播放| 亚洲第一中文字幕| 国产日本欧美在线观看| 亚洲大片av| 国产午夜久久| 一区二区三区福利| 亚洲欧洲日本mm| 欧美一区二区私人影院日本 | 一本色道88久久加勒比精品| 亚洲午夜免费视频| 99re热这里只有精品视频| 性伦欧美刺激片在线观看| 99视频精品| 欧美成人亚洲成人| 美女国产一区| 国产综合久久| 亚洲视频在线免费观看| 亚洲日本中文字幕| 久久这里有精品15一区二区三区 | 最新日韩欧美| 久久国产精品久久久久久久久久 | 亚洲另类一区二区| 久久色中文字幕| 久久亚洲一区二区三区四区| 国产麻豆综合| 亚洲图片在线| 亚洲一区二区三区四区五区午夜| 欧美激情aaaa| 欧美激情中文字幕乱码免费| 黑人一区二区| 欧美在线网站| 狼狼综合久久久久综合网| 国产日韩欧美视频| 欧美一区二区三区四区高清 | 亚洲精品乱码久久久久久久久| 午夜国产精品视频免费体验区| 亚洲午夜国产一区99re久久| 欧美激情影音先锋| 亚洲精品国产精品乱码不99按摩 | 午夜精品免费在线| 亚洲另类视频| 日韩一级黄色片| 欧美人成免费网站| 99热这里只有精品8| 亚洲一区二区三| 国产精品成人一区二区网站软件| av成人免费| 欧美一级理论片| 国产一区二区三区不卡在线观看| 久久精品国产久精国产爱| 久久爱www久久做| 国产日韩av在线播放| 欧美一区二区三区在线| 欧美a级一区| 亚洲深夜影院| 国产午夜精品麻豆| 另类亚洲自拍| 亚洲人在线视频| 香蕉免费一区二区三区在线观看| 国产欧美日韩免费| 看欧美日韩国产| 99精品视频一区二区三区| 久久精品一区| 亚洲美女视频在线免费观看| 欧美日韩视频| 久久精品30| 一本久道久久综合狠狠爱| 欧美一区二区视频观看视频| 一区视频在线播放| 欧美三日本三级三级在线播放| 午夜亚洲视频| 91久久精品美女| 久久精品视频一| 一区二区三区国产精品| 国产日韩精品在线播放| 欧美成人精品一区二区| 午夜视频在线观看一区二区三区| 欧美电影专区| 久久爱www久久做| 一区二区日韩伦理片| 一区二区三区在线免费观看| 欧美日韩一区二区视频在线| 欧美影院久久久| 在线午夜精品自拍| 亚洲国产精品福利| 久久久久久穴| 午夜精品久久久久久久久久久久| 亚洲国产小视频| 狠狠久久婷婷| 国产精品美女主播在线观看纯欲| 欧美成人69av| 久久国产日本精品| 亚洲尤物在线| 亚洲深夜激情| 亚洲日韩视频| 最新国产乱人伦偷精品免费网站| 久久精品午夜| 欧美在线|欧美| 欧美亚洲视频| 西西人体一区二区| 亚洲欧美激情四射在线日| 夜夜嗨av色一区二区不卡| 极品少妇一区二区三区精品视频|