svn的branch truck tag

對於branch truck tag一直迷迷糊糊的,想搞明白,可是一直又沒來弄明白,最近就用了這種方式來開發 能夠我又不是徹底瞭解怎麼操做,因此查看了下資料,這個解釋得很詳細呀,連我都看得懂的東西,真所謂「寫得真好」,記錄下,轉載http://blog.csdn.net/keda8997110/article/details/21813035java

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

 

branch存在的意義在於,在不干擾trunk的狀況下,和trunk並行開發,待開發結束後合併回trunk中,在branch和trunk各自開發的過程當中,他們均可以不斷地提交本身的修改,從而使得每次修改在repository中都有記錄。測試

 

設想如下場景,若是你的項目須要開發一個新功能,而該功能可能會修改項目中的絕大多數文件,而與此同時,你的另外一位同事正在進行bug fix,若是你的新功能不在branch中開發而直接在trunk中開發,那麼你極有可能影響另外一位同事的bug fix,他/她在bug修復中可能會遇到各類各樣的問題,由於你的頻繁提交代碼引入了過多的不穩定因素。你可能會說,那我在開發的過程當中不提交不就好了,等到我所有開發結束我再提交,是,你能夠這麼作,那還要版本控制幹什麼呢?也許等到你最後提交代碼的時候(也許一週,也許兩週?),你會發現有一大堆conflict等着你resolve。。。ui

 

那麼,正確的作法是什麼?使用branch,從trunk建立branch,而後在你的branch上開發,開發完成後再合併到trunk中。spa

 

關於branch先講到這裏,下面說說什麼叫作合併。很好理解,當branch開發完成後(包括必要的測試),將branch中的修改同步到trunk中,這個過程有可能包括修改文件、增長文件、刪除文件等等。.net

 

說到這裏,貌似本文差很少能夠結束了,不就是分支和合並麼?只要再簡單地說說如何創建分支和如何合併就能夠收尾了,可能只需兩個命令,也可能只需鼠標點幾下而後鍵盤敲兩下便可。其實事情遠非這麼簡單,愛動腦筋的同窗可能會問了,將branch的改動merge到trunk的時候,和上文說的直接在trunk中所有開發完而後提交有何區別?你最後還不是要處理一大堆conflict?版本控制

 

這個問題問得很是好,其實這正是本文的重點:branch和trunk在並行開發的過程當中如何感知對方,branch如何才能在開發過程當中不會和trunk越走越遠,致使最後沒法合併?試想一下,若是在你開發branch的過程當中,trunk中的某個類文件已經被刪除了(這多是另一個傢伙在另外一個branch上開發了兩週後才合併到trunk的),而你居然在這個類文件上作了大量修改,試問你到最後合併回trunk的時候該有多蛋疼?解決這一問題的惟一手段是,branch要不停地和trunk保持同步,你要及時地知道trunk都作了什麼修改,這些修改是否會影響你正在開發的新功能,若是須要,你必須及時調整branch的代碼,使之能與trunk「兼容」。orm

 

那麼如何讓branch和trunk保持同步?合併,從trunk合併到branch,你沒聽錯,是從trunk合併到branch。關於TortoiseSVN的合併,有幾點須要注意:blog

  • TortoiseSVN的合併發生在本地,也即你的working copy中,你無需過多擔憂會對repository中的代碼形成影響
  • 不論是從trunk合併到branch仍是最終從branch合併回trunk,在每次合併前最好先update,而後將本地的修改先所有commit,保護好現場,萬一合併不理想隨時均可以revert
  • 合併完成後看是否能正確編譯,而後測試驗證,最後將合併後的改動提交到repository

 

 

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

 

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

 

一、本地Repository的建立

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

 

二、Check out

假設要check out到D:\TortoiseSVN\TestSVN,一樣很簡單,在D:\TortoiseSVN目錄下建立TestSVN目錄,而後在該目錄上右鍵,選擇"SVN Check out...",在彈出的窗口中的"URL of repository"中填入"file:///D:/TortoiseSVN/TestRepository",其餘默認便可,最後點擊ok。

 

三、trunk建立新項目MyProject

至關簡單就不贅述了,只列出本次操做所做出的修改:

 

四、建立branch

在/trunk/MyProject目錄上右鍵,依次選擇"TortoiseSVN" -> "Branch/tag...",在彈出窗口的"To URL"中填入分支的地址,在這裏目標revision選擇HEAD revision,以下圖所示,添加log後點擊ok分支便創建了。這個操做速度很是快,新建的branch在repository中其實只是一個指向trunk某個revision的軟鏈接而已,並無真的複製文件。

 

五、Check out分支

右鍵TestSVN目錄選擇"TortoiseSVN Update"便可將剛剛創建的分支下載回本地。進入/branches/MyProject目錄下你會發現其文件結構和/trunk/MyProject如出一轍。

 

六、branch提交一個新文件

 

七、trunk緊接着提交一個修改

 

八、branch再次提交一個修改

 

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

6-8演示的是branch和trunk在獨立、並行地開發。爲了防止在「錯誤」的道路上越走越遠,如今branch意識到是時候和trunk來一次同步了(將trunk合併到branch)。

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

 

點擊next後,出現以下窗口:

 

因爲是要從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後出現下圖:

 

在這裏只需保留默認設置便可。在點擊Merge按鈕前你能夠先Test merge一把,當作功與否,以及merge的詳細信息。點擊Merge按鈕後trunk所作的修改將同步到branch中。

 

十、提交合並後的branch

 

至此,branch已經徹底和trunk同步,branch和trunk的代碼相處很融洽,沒有任何衝突,若是branch已經開發結束,那是時候將branch合併回trunk了,固然,若是branch還要繼續開發,那你將不斷地重複6-10這幾個步驟。

 

十一、將branch合併回trunk

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

 

點擊next後出現以下窗口:

 

在這裏,"From URL"選擇/branches/MyProject,無需選擇revision號,Reintegrate會將branch上全部修改合併到trunk。後面的步驟和上文第9步中的同樣,再也不囉嗦了。如無心外,branch將成功合併到trunk,你須要作的只是將合併後的trunk趕忙commit!

 

十二、提交合並後的trunk

so easy...

 

1三、刪除branch

若是你認爲你新加的功能已經開發完成了,你能夠刪除你的分支

 

 

到這裏,我已經給你演示完了整個過程,我一身的汗也下來了,我想罷工了,不過最後咱們仍是看看全部的log信息吧,經過log能發現咱們乾的全部事情:

 

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

 

圖中灰色的是和merge相關的log,共發生了兩次merge,第一次是在r6,在r6中,branch合併了trunk在r4時提交的變化;第二次是在r7,在r7中,trunk合併了branch從r2到r6的全部變化。

相關文章
相關標籤/搜索