分类: 项目管理
2010-01-06 20:54:02
分支(branches)就是一份拷贝,对主干(trunk)上的拷贝,你把它赋予分支的意义,那么它就是分支。在分支上面工作目的是为了让自己的工作不要影响到别人。(注意版本号应该时全局得,无论分支还是主干,其版本号是唯一得。对吗?)
**关于分支的创建
*创建分支方法1:
步骤如下:
$cd calc
$svn copy trunk branches/my-calc-branch
$svn commit -m "建立一个分支"
这样,将建立一个calc/trunk主干的拷贝(分支)。这里的拷贝不是拷贝整个目录是“廉价”的拷贝,只是做了一个链接,但是效果和拷贝的一样,以后的修改只在本分支上能体现出来。
*创建分支方法2:
$svn copy \
\
-m "创建一个分支"
这里,和前面的方法没有什么区别,这里是一个即时的拷贝,直接在服务器上面操作,不用将数据取出再提交了。(网络上有说 reversion是分支创建时的版本,HEAD是分支最新版本,对吗?)
**
**关于分支的合并
*查看主干线项目的修改:
$svn diff -r 343:344
这样将在屏幕上输出主干线上343和344版本的区别,你可以知道主干线上做了什么修改进而确定是否应该将这些修改合并到自己的分支中,保持尽量和主干线的最新修改一致。
*合并主干线上指定版本的修改到当前目录所在分支:
$svn merge -r 343:344
这里,假设你当前所在的工作目录就是你的分支目录,这样会将主干版本343到344上的修改直接应用(patch)到你当前的分支上面了,而不是仅仅打印到屏幕上面,保持你的分支和主干线不会脱离太远。可以这样提交:
$svn commit -m "将主干上面343到344版本上做的修改应用到本分支上了"
合并的结果和对diff的输出进行patch是一样的,但是svn merge命令比patch命令更强,patch只能支持指定文件,svn merge还可以支持目录等。如果你没有指定目标,svn就会假定你要合并修改到当前目录,或当前目录的同名文件上。
*合并主干线上指定版本的修改到指定的目录分支:
$svn merge -r 343:344 my-calc-branch
这样,就将主干线上()指定的343到344的修改合并到分支my-calc-branch上了。和svn update一样,svn merge也会产生冲突不过两者冲突文件的名字会不同这样有利区分。
*合并两个指定目录上面的修改到目标分支:
$svn merge my-calc-branch
这样,会将主线(trunk)到branch1上面进行的修改应用到my-calc-branch.我们一定要注意记录合并的信息,防止重复合并修改造成错误。
*模拟合并,仅输出并不实际操作:
$svn merge --dry-run -r 343:344
这样仅仅输出合并信息,并不实际合并操作我们这样再结合svn status可以判断当前的合并是不是重复或者错误的合并。我们也可以利用和svn merge一样的参数的svn diff来检测是否应该合并。
*取消修改:
$svn revert
如果你喜欢合并的修改,你可以使用svn commit来提交,如果不喜欢,就用svn revert来恢复修改。
**
**常见操作
*合并分支到主干:
步骤如下:
1)$svn log --verbose --stop-on-copy \
这里,stop-on-copy将只打印my-calc-branch分支的版本,更多信息查看svn help log这里是341。
2)$cd calc/trunk
$svn update
这里进入主干目录得工作拷贝,然后更新成为最新得主干,假设版本号为405。
3)$svn merge -r 341:405
这里,通过比较不同,会将分支合并到主干目录得工作拷贝上面。(问题:假设分支没有合并过主干的修改,那么主干在分支之后不就白做修改了?)
4)$svn commit -m "Merged my-calc-branch changes r345:405 into trunk"
这样,会提交合并的结果到服务器,完成把分支合并到主干上,版本号是406。(问题:是不是分支必须要先将主干的最新修改给合并进来?)
*再次合并分支到主干:
假设又在分支上工作了一段时间,想要进行再次合并到主干,步骤如下:
1)$cd calc/trunk
$svn log
这里,首先在主干上查看上次分支合并到主干上得相关日志版本,可防止重复合并,发现是406。
2)$cd calc/trunk
svn update
这里,合并前先把主干更新一下,假设HEAD版本是480。
3)$svn merge -r 406:480
这样,就把分支上面的修改合并到主干上了。(问题,假设主干期间变化了,分支没有合并主干的信息行吗?会不会把主干的修改信息给冲掉了?)
4)$svn commit -m "Merged my-calc-branch changes r406:480 into trunk"
这样,就完成了第二次合并分支到主干的工作。
最大的问题:是不是必须要在分支合并到主干前,保证期间主干上的修改分支都合并过才行?
**