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之后的版本,也就是例子中的1
01
可以使用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起來很是費勁