如何使用svn進行merge

          Posted on 2009-06-02 12:36 林光炎 閱讀(22847) 評論(0)  編輯  收藏 所屬分類: SVN
          |  | Comments (0) | TrackBacks (0)
          版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息。
          svn 的 merge其實很好用,當然前提是你明白了svn merge這個命令,還好,我用了大約一年明白了這個命令 -___-!!

          跟大家說一下用法,比如我們要把分支merge到主干上

          # svn merge --help
          merge: Apply the differences between two sources to a working copy path.
          usage: 1. merge sourceURL1[@N] sourceURL2[@M] [WCPATH]
                 2. merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]
                 3. merge [-c M | -r N:M] SOURCE[@REV] [WCPATH]

          我們以第一個為例
          merge sourceURL1[@N] sourceURL2[@M] [WCPATH]
          這個help里面提示,merge需要三個參數
          sourceURL1,sourceURL2的含義并不是兩個分支,或者一個分支一個主干,而是同一個分支的兩個狀態,或者說是兩個版本。對這兩個版本做一個diff,然后把diff的結果,應用到最后的參數WCPATH上,WCPATH代表是一個本地已經checkout的工作區

          svn merge的思想是diff and apply

          比如,我開發一個項目叫做proj
          目錄結構是
          proj/trunk
          proj/branches
          proj/tags

          (省略了http:// 之后的,只是相對路徑,但是真正使用時候不能省略)

          當版本達到100的時候,我決定做一個branch進行一些其他開發
           [Reversion:100]
           $svn cp proj/trunk proj/branches/proj_branch_1
           OK Reversion:101

          然后,trunk和proj_branch_1都在開發,到了某一個版本,比如150,branch開發完成,需要merge回到trunk
          此時的目錄結構是
          [Reversion:150]
          proj/trunk
          proj/branches/proj_branch_1
          proj/tags

          按照svn的實現,我需要知道proj_branch_1所做的所有的變化,也就是當前的狀態對剛剛生成時候狀態的變化。根據這個變化生成一個diff文件,在apply一個本地的工作區上。(建議是一個干凈的本地trunk工作區)

          那么執行
          $cd proj/trunk
          $svn merge proj/branches/proj_branch_1@101 proj/branches/proj_branch_1 .

          其實,第一個URL(我們稱之為左邊),為起始狀態,通過最后的@101,表示取版本101,這個101就是cp成功之后的那個版本。第二個URL(我們稱之為右邊),為最終狀態,取最新的,
           左邊和右邊做了一個diff,應用到當前工作區目錄,也就是trunk。
           此時
           $svn st就可以看到變化了

          這里的一個問題是如何獲取這個cp之后的版本,也就是例子中的101
          可以使用svn log里面的--stop-on-copy命令
          $svn log --stop-on-copy proj/branches/proj_branch_1
          會到cp的時候停下來,那里邊標注的版本就是需要的版本

           比如,這是一個真正項目的一個例子,
           ------------------------------------------------------------------------
           r995 | yinweiming | 2007-10-24 09:07:08 +0800 (三, 24 10月 2007) | 1 line

           Create a branch for proj client using
           ------------------------------------------------------------------------
           其中的r995,995就是我需要的版本
           (說明一下,commit時候寫commet的好處,比如這里我就很明確的肯定這是branch的起始點)

          對于svn merge的另外的用法也是類似,只要是明白了
          他是根據左邊,右邊生成diff,然后應用到本地的一個工作區就容易理解了。

          還有可以使用svn merge --dry-run來模擬假裝merge一下,看一下merge會發生什么,而不是真正的做這個動作。


          而對于merge的help里面的 3. merge [-c M | -r N:M] SOURCE[@REV] [WCPATH]
          這個也很容易理解,就是取 SOURCE 這個東西,版本N,M之間的區別,作用在WCPATH這個本地工作區上

          注意!
          做branch千萬別根據本地修改過的工作區做,一定基于某一個URL的版本做
          我就吃過這個虧
          diff的時候,diff不出來,因為基于本地工作區的,所以現在merge起來很是費勁

          posts - 104, comments - 33, trackbacks - 0, articles - 0

          Copyright © 林光炎

          主站蜘蛛池模板: 揭阳市| 仲巴县| 亚东县| 八宿县| 博白县| 盈江县| 闻喜县| 崇礼县| 南川市| 西安市| 广饶县| 大渡口区| 腾冲县| 恩施市| 贵德县| 绍兴市| 永川市| 马边| 晋州市| 原平市| 美姑县| 陆河县| 万盛区| 盐城市| 隆子县| 依安县| 富源县| 盘山县| 阿勒泰市| 怀集县| 游戏| 乐业县| 札达县| 阿城市| 乌苏市| 黎川县| 山阳县| 手游| 瑞昌市| 黄平县| 台东县|