如何使用svn進行merge

版權聲明:可以任意轉載,轉載時請務必以超鏈接形式標明文章 原始出處[url]http://yinwm.cn/blog/2008/04/svn-merge.html[/url]和作者信息。
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這個本地工作區上.


[b]例如: [/b]
[b]1. svn merge --dry-run -r:73:68 http://my.repository.com/my/project/trunk
2. svn merge -r:73:68 http://my.repository.com/my/project/trunk
3. svn commit -m "Reverted to revision 68."[/b]
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章