posts - 262,  comments - 221,  trackbacks - 0
          【20】從主干更新分支
          在前面我們創建了分支,而且把用戶guest的本地工作副本E:\Temp\ECoupon_tmp從版本庫的主干切換到該分支上。現在用戶guest和其他人可以并行地開發而不影響彼此了,因為分支自創建點那一刻開始就擁有了自己的版本線。

          假設現在突然發現主干上的一個重大bug,該bug存在于各個分支,經過修正后需要馬上更新到其他分支。那么問題就來了:難道需要一個個地修改分支上的文件嗎?有沒有更好點的方法?有---那就是svn merge命令。

          C:\>svn cat http://localhost:8000/svn/Workspace/Ericsson/ECoupon/read-from-wc.txt
          modify by user qlinpen
          add by user qlinpen
          add by user guest

          fix bugs of ECoupn project

          C:\
          >svn cat http://localhost:8000/svn/Workspace/Ericsson/ECoupon_GA/branches/paul/read-from-wc.txt
          modify by user qlinpen
          add by user qlinpen
          add by user guest

          為了把主干上的更新同步到分支,我們使用svn merge命令,svn merge的命令用法有三種:

           A.svn merge sourceURL1[@N] sourceURL2[@M] [WCPATH]
           B.svn merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]
           C.svn merge[[-c M]...|[-r N:M]...] [SOURCE[@REV][WCPATH]]

          最常用的是第三種,即把當前一個階段內的版本都合并到WCPATH的位置。其中-c M相當于-r M-1 M。下面我們來看如何應用這個命令來集成主干的改變

           Step 1:確定要從哪個版本開始~那個版本結束

          通常從主干到分支彼此之間的集成不會太頻繁,不要指望能夠一天一次或幾天一次。通常都是在主干的代碼開發完畢,測試通過后才會更新到分支。在此期間可以主干上的開發人員已經進行了多次的提交,為了令到這一時間段內的變化都能夠被分支感知,我們會把這一階段內的所有變化都集成到分支上。

          所以集成前的第一步就是使用svn log查看要從哪個版本開始集成。

          C:\>svn log http://localhost:8000/svn/Workspace/Ericsson/ECoupon_GA
          ------------------------------------------------------------------------
          r38 
          | qlinpen | 2009-12-10 18:47:59 +0800 (星期四, 10 十二月 2009| 1 line

          我們看到分支的創建在版本38,那么我就要從版本號38開始。而在版本號38之后主干上又發生了什么改變呢?
          C:\>svn log -38:HEAD http://localhost:8000/svn/Workspace/Ericsson/ECoupon
          ------------------------------------------------------------------------
          r39 
          | qlinpen | 2009-12-11 11:03:09 +0800 (星期五, 11 十二月 2009| 1 line

          commit change to trunk
          ------------------------------------------------------------------------
          r40 
          | qlinpen | 2009-12-11 11:45:41 +0800 (星期五, 11 十二月 2009| 1 line

          add 
          new file readme.txt
          ------------------------------------------------------------------------
          r41 
          | qlinpen | 2009-12-11 11:46:27 +0800 (星期五, 11 十二月 2009| 1 line

          delete file read
          -from-repo.txt
          ------------------------------------------------------------------------

          可以看到在版本38之后,主干上一共發生了三次提交。那么集成的結束版本就是41。

           Step 2: 執行集成

          C:\>svn merge -38:41 http://localhost:8000/svn/Workspace/Ericsson/ECoupon E:\Temp\ECoupon_tmp 
          --- Merging r39 through r41 into 'E:\Temp\ECoupon_tmp':
          U    E:\Temp\ECoupon_tmp\read
          -from-wc.txt
          A    E:\Temp\ECoupon_tmp\readme.txt
          D    E:\Temp\ECoupon_tmp\read
          -from-repo.txt

          我們告訴SVN,把從版本號38開始到41之間的所有改變都集成到本地工作副本ECoupon_tmp項目中,于是從版本號39開始~41的所有變化都會被應用到本地工作副本。

           Step 3: 提交集成結果

          由于svn merge命令的最終應用時WCPATH,也就是說你只能把來自主干的改變同步到分支的本地副本。此時你本地的副本已經時最新的了,但版本庫上的分支還不是。所以還得執行一次commit

          C:\>svn commit E:\Temp\ECoupon_tmp -"commit Paul's latest code merged from trunk since r38:r41"
          Sending        E:
          \Temp\ECoupon_tmp
          Deleting       E:
          \Temp\ECoupon_tmp\read-from-repo.txt
          Sending        E:
          \Temp\ECoupon_tmp\read-from-wc.txt
          Adding         E:
          \Temp\ECoupon_tmp\readme.txt
          Transmitting file data .
          Committed revision 
          42.

          這時所有的改變都應用到版本庫的分支上了

          需要注意的一點:merge成功不代表一切都沒有問題,還需要檢查merge的內容是不是真正符合我們要求的


          -------------------------------------------------------------
          生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。
          posted on 2009-12-11 12:02 Paul Lin 閱讀(460) 評論(2)  編輯  收藏 所屬分類: 項目管理


          FeedBack:
          # re: 【原】SVN In Action(18)
          2009-12-11 16:05 | 愛美女
          感謝,正在使用eclipse svn插件`  回復  更多評論
            
          # re: 【原】SVN In Action(18)
          2011-10-18 23:41 |
          你好
          svn merge -r 38:41 http://localhost:8000/svn/Workspace/Ericsson/ECoupon E:\Temp\ECoupon_tmp
          與下面的形式等價嗎?
          svn merge http://localhost:8000/svn/Workspace/Ericsson/ECoupon@38 http://localhost:8000/svn/Workspace/Ericsson/ECoupon@41 E:\Temp\ECoupon_tmp
          按理說是等價的,但貌似得到的結果不一樣。  回復  更多評論
            
          <2009年12月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          常用鏈接

          留言簿(21)

          隨筆分類

          隨筆檔案

          BlogJava熱點博客

          好友博客

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 柳河县| 仁寿县| 平果县| 普宁市| 鄢陵县| 北辰区| 石台县| 遂平县| 亚东县| 思南县| 如东县| 长沙县| 台南县| 甘泉县| 南郑县| 新津县| 辉县市| 平陆县| 北川| 广东省| 荣成市| 天祝| 辉县市| 五原县| 正宁县| 许昌市| 昂仁县| 山西省| 元谋县| 寿阳县| 平顶山市| 麦盖提县| 南昌市| 涟源市| 察哈| 白沙| 嫩江县| 华安县| 广东省| 枣强县| 牡丹江市|