• <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>

               C++ 技術中心

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

            公告

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

            留言簿(27)

            搜索

            •  

            最新隨筆

            最新評論

            評論排行榜

            使用svn幾年了,一直對分支和合并敬而遠之,一來是因為分支的管理不該我操心,二來即使涉及到分支的管理,也不敢貿然使用合并功能,生怕合并出了問題對團隊造成不良影響,最主要的原因是,自己對分支的目的和合并的方法不甚了解,這才是硬傷。


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


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


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

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



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


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


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


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


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


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

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



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


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


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

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


            2、Check out

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


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

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



            4、創(chuàng)建branch

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


            5、Check out分支

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


            6、branch提交一個新文件


            7、trunk緊接著提交一個修改


            8、branch再次提交一個修改

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


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

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



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

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

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



            10、提交合并后的branch


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


            11、將branch合并回trunk

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



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

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


            12、提交合并后的trunk

            so easy...


            13、刪除branch

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



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

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


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




            終于可以寫寫總結了:

            • branch主要用于新功能的開發(fā)
            • 合并發(fā)生在本地working copy,只要你不提交就不會影響到repository
            • 合并前一定要先update、commit,保證不會out of day,并將本地的修改保存到repository
            • branch和trunk并行開發(fā)的過程中,要經常同步,將trunk的修改合并到branch,合并時選擇"Merge a range of revision"
            • branch最后合并回trunk時,merge type選擇"Reintegrate a branch"
            posted on 2017-04-12 15:15 C++技術中心 閱讀(414) 評論(0)  編輯 收藏 引用 所屬分類: 其他編程
            狠狠色丁香婷综合久久| 国产精品久久久亚洲| 久久久国产精品| 偷偷做久久久久网站| 久久精品无码专区免费东京热| 人妻精品久久无码区| 久久精品三级视频| 99久久国产宗和精品1上映| 丁香五月网久久综合| 国产香蕉久久精品综合网| 久久精品国产网红主播| 伊人久久亚洲综合影院| 久久99精品国产一区二区三区| 亚洲国产成人精品无码久久久久久综合 | 91久久婷婷国产综合精品青草| 久久99精品久久久久久水蜜桃 | 无码精品久久一区二区三区| 日本欧美久久久久免费播放网| 一本一本久久a久久精品综合麻豆| 久久久久人妻一区二区三区vr| 国产精品久久久香蕉| 色播久久人人爽人人爽人人片aV| 99久久人妻无码精品系列| 久久精品国产亚洲AV高清热| 久久w5ww成w人免费| 丰满少妇人妻久久久久久4| 国内精品伊人久久久久影院对白| 久久国产精品成人免费| 国产精品99久久免费观看| 一本久久久久久久| 欧美久久一级内射wwwwww.| 欧美日韩成人精品久久久免费看| 久久国产精品视频| 无码人妻久久一区二区三区免费| 久久99久久99精品免视看动漫| 国产精品99久久久久久人| 亚洲v国产v天堂a无码久久| 成人免费网站久久久| 久久久噜噜噜久久中文字幕色伊伊 | 亚洲美日韩Av中文字幕无码久久久妻妇 | 欧美丰满熟妇BBB久久久|