1. 程式人生 > >SVN中Branch/tag的比較

SVN中Branch/tag的比較

 

在SVN中Branch/tag在一個功能選項中,在使用中也往往產生混淆。

在實現上,branch和tag,對於svn都是使用copy實現的,所以他們在預設的許可權上和一般的目錄沒有區別。至於何時用tag,何時用branch,完全由人主觀的根據規範和需要來選擇,而不是強制的(比如cvs)。

一般情況下,
tag,是用來做一個milestone的,不管是不是release,都是一個可用的版本。這裡,應該是隻讀的。更多的是一個顯示用的,給人一個可讀(readable)的標記。
branch,是用來做並行開發的,這裡的並行是指和trunk進行比較。

比如,3.0開發完成,這個時候要做一個tag,tag_release_3_0,然後基於這個tag做release,比如安裝程式等。trunk進入 3.1的開發,但是3.0發現了bug,那麼就需要基於tag_release_3_0做一個branch,branch_bugfix_3_0,基於這 個branch進行bugfix,等到bugfix結束,做一個tag,tag_release_3_0_1,然後,根據需要決定 branch_bugfix_3_0是否併入trunk。

對於svn還要注意的一點,就是它是全域性版本號,其實這個就是一個tag的標記,所以我們經常可以看到,什麼什麼release,基於xxx專案的 2xxxx版本。就是這個意思了。但是,它還明確的給出一個tag的概念,就是因為這個更加的可讀,畢竟記住tag_release_1_0要比記住一個 很大的版本號容易的多。

svn中建立branch或者tag的方法比較簡單,totoiseSVN中的操作是:
1.選擇Branch/tag..
2.在出來的介面中的To URL中填上URL,一般是svn://IP/Project/branches/branch-1, 這樣就建立了一個branch-1的branch. 建立tag是一樣的操作,只不過URL一般是svn://IP/Project/tags/tag-1
3.後面的Create copy from是用於選擇從你當前的working base中的哪個版本中建立branch/tag,可以根據自己的選擇來訂製,一般選擇Head Revision
subclipse中幾乎是一樣的操作。

Merge分為很多種:
1.多個branch之間merge
2.branch merge到trunk
3.trunk merge到branch
第2種用的比較多,比如在otfs介面中netamount的需求提出後就得建立一個netamount的branch,trunk繼續在非 netamount的情況下繼續開發,netamount單獨開發,當netamount功能測試通過後,將netamount branch merge到trunk下,然後將trunk release。
第3種情況用的也不少,如上的例子,當用戶進行netamount測試時,如果使用者不想只測試netamount的功能,則需要將trunk中的修改merge到netamount branch,然後從netamount branch中釋出一個版本供使用者測試。

branch merge to trunk在tortoiseSVN操作如下:
1.選擇TortoiseSVN->Merge
2.選擇Reintegrate a branch
3.選擇From URL,URL填好之後可以點選Show Log,可以看看這個branch是否是你要merge的內容,下面的Working copy中也可以Show Log,可以確認一下你的工作目錄是否是trunk。確認後點擊Next
4.Merge Options裡面有些選項,根據需要來選擇,Test Merge按鈕會告訴你這次Merge會做哪些操作,最好先Test Merge一下!如果是預期的Merge操作,點選Merge則可以將branch Merge到本地工作目錄下
5.有衝突的檔案需要解決好衝突,解決之後點選svn commit則完成了merge

從多個revision中merge到本地工作目錄在tortoiseSVN的操作如下:
1.選擇TortoiseSVN->Merge
2.選擇Merge a range of revisions
3.URL to merge from填上merge的來源,merge 來源一般和你的working copy是不同的branch或者working copy是trunk 而merge from是branch
4.Revision range to merge填上需要merge的revision,格式是1,3,5或者 1-10
5.後續操作同Reintegrate a branch

subclipse進行Merge操作同tortoiseSVN的操作方式有所區別,原理基本同Merge a range of revisions。
點選Team->Merge後,只有一個介面,這個介面提供了兩種Merge操作方式:
1.Merge某個版本範圍內的修改到本地工作目錄上
2.Merge feature branch到trunk (也需要先merge到本地)
第1種的操作方法是:
1.在from url中填上branch的url
2.from revision中選擇建立這個branch的revision號,不是最新的那個版本號!
3.to url框中勾上"Use 'From:' URL"這個check box, To Revision中選擇需要需要Merge到的revision號,一般勾head revision
4.Dry run讓你預覽一下merge效果,Unified Diff將Merge的兩邊進行Diff並將Diff結果儲存到檔案中。(在我機器中Dry run沒有窗口出來,diff結果的檔案除非只有很小的變化,不然看得頭大)
5.點選Merge將merge到本地,這時候與版本庫進行一下同步應該和上一步的dry run有同樣的效果,如果merge過來的東西不是你預期的更改可以選擇revert,但是新增的檔案需要手工刪除!如果是預期的merge效果,那 commit,記得在comments中寫上merge來的branch、from revision、to revision(不要寫head,寫數字)

總的來看subclipse的merge操作並不方便,不如tortoiseSVN