posts - 262,  comments - 221,  trackbacks - 0
【20】从主干更新分支
在前面我们创建了分支,而且把用户guest的本地工作副本E:\Temp\ECoupon_tmp从版本库的主干切换到该分支上。现在用户guest和其他人可以并行地开发而不影响彼此了,因为分支自创建点那一刻开始就拥有了自己的版本线。

假设现在突然发现主干上的一个重大bug,该bug存在于各个分支,经过修正后需要马上更新到其他分支。那么问题就来了:难道需要一个个地修改分支上的文件吗?有没有更好点的方法?有---那就是svn merge命令。

C:\>svn cat http://localhost:8000/svn/Workspace/Ericsson/ECoupon/read-from-wc.txt
modify by user qlinpen
add by user qlinpen
add by user guest

fix bugs of ECoupn project

C:\
>svn cat http://localhost:8000/svn/Workspace/Ericsson/ECoupon_GA/branches/paul/read-from-wc.txt
modify by user qlinpen
add by user qlinpen
add by user guest

为了把主干上的更新同步到分支,我们使用svn merge命令,svn merge的命令用法有三种:

 A.svn merge sourceURL1[@N] sourceURL2[@M] [WCPATH]
 B.svn merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH]
 C.svn merge[[-c M]...|[-r N:M]...] [SOURCE[@REV][WCPATH]]

最常用的是第三种,即把当前一个阶段内的版本都合并到WCPATH的位置。其中-c M相当于-r M-1 M。下面我们来看如何应用这个命令来集成主干的改变

 Step 1:确定要从哪个版本开始~那个版本结束

通常从主干到分支彼此之间的集成不会太频繁,不要指望能够一天一次或几天一次。通常都是在主干的代码开发完毕,测试通过后才会更新到分支。在此期间可以主干上的开发人员已经进行了多次的提交,为了令到这一时间段内的变化都能够被分支感知,我们会把这一阶段内的所有变化都集成到分支上。

所以集成前的第一步就是使用svn log查看要从哪个版本开始集成。

C:\>svn log http://localhost:8000/svn/Workspace/Ericsson/ECoupon_GA
------------------------------------------------------------------------
r38 
| qlinpen | 2009-12-10 18:47:59 +0800 (星期四, 10 十二月 2009| 1 line

我们看到分支的创建在版本38,那么我就要从版本号38开始。而在版本号38之后主干上又发生了什么改变呢?
C:\>svn log -38:HEAD http://localhost:8000/svn/Workspace/Ericsson/ECoupon
------------------------------------------------------------------------
r39 
| qlinpen | 2009-12-11 11:03:09 +0800 (星期五, 11 十二月 2009| 1 line

commit change to trunk
------------------------------------------------------------------------
r40 
| qlinpen | 2009-12-11 11:45:41 +0800 (星期五, 11 十二月 2009| 1 line

add 
new file readme.txt
------------------------------------------------------------------------
r41 
| qlinpen | 2009-12-11 11:46:27 +0800 (星期五, 11 十二月 2009| 1 line

delete file read
-from-repo.txt
------------------------------------------------------------------------

可以看到在版本38之后,主干上一共发生了三次提交。那么集成的结束版本就是41。

 Step 2: 执行集成

C:\>svn merge -38:41 http://localhost:8000/svn/Workspace/Ericsson/ECoupon E:\Temp\ECoupon_tmp 
--- Merging r39 through r41 into 'E:\Temp\ECoupon_tmp':
U    E:\Temp\ECoupon_tmp\read
-from-wc.txt
A    E:\Temp\ECoupon_tmp\readme.txt
D    E:\Temp\ECoupon_tmp\read
-from-repo.txt

我们告诉SVN,把从版本号38开始到41之间的所有改变都集成到本地工作副本ECoupon_tmp项目中,于是从版本号39开始~41的所有变化都会被应用到本地工作副本。

 Step 3: 提交集成结果

由于svn merge命令的最终应用时WCPATH,也就是说你只能把来自主干的改变同步到分支的本地副本。此时你本地的副本已经时最新的了,但版本库上的分支还不是。所以还得执行一次commit

C:\>svn commit E:\Temp\ECoupon_tmp -"commit Paul's latest code merged from trunk since r38:r41"
Sending        E:
\Temp\ECoupon_tmp
Deleting       E:
\Temp\ECoupon_tmp\read-from-repo.txt
Sending        E:
\Temp\ECoupon_tmp\read-from-wc.txt
Adding         E:
\Temp\ECoupon_tmp\readme.txt
Transmitting file data .
Committed revision 
42.

这时所有的改变都应用到版本库的分支上了

需要注意的一点:merge成功不代表一切都没有问题,还需要检查merge的内容是不是真正符合我们要求的


-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2009-12-11 12:02 Paul Lin 阅读(438) 评论(2)  编辑  收藏 所属分类: 项目管理


FeedBack:
# re: 【原】SVN In Action(18)
2009-12-11 16:05 | 爱美女
感谢,正在使用eclipse svn插件`  回复  更多评论
  
# re: 【原】SVN In Action(18)
2011-10-18 23:41 |
你好
svn merge -r 38:41 http://localhost:8000/svn/Workspace/Ericsson/ECoupon E:\Temp\ECoupon_tmp
与下面的形式等价吗?
svn merge http://localhost:8000/svn/Workspace/Ericsson/ECoupon@38 http://localhost:8000/svn/Workspace/Ericsson/ECoupon@41 E:\Temp\ECoupon_tmp
按理说是等价的,但貌似得到的结果不一样。  回复  更多评论
  

只有注册用户登录后才能发表评论。


网站导航:
 
<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(21)

随笔分类

随笔档案

BlogJava热点博客

好友博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜