如何利用 svn 分支管理进行迭代开发

更新日期: 2015-12-12 阅读次数: 14212 分类: SVN

一直在 linux 和 mac 上使用 git 进行项目代码管理,首次在 linux 上使用 svn 进行开发 (之前都是在 Windows 上使用 SVN 图形管理工具)。

建立一个测试项目,熟悉一下 SVN 的命令行操作, 主要是分支管理。

场景

目前线上运行着主干分支(trunk)的代码,现在要进行2期的迭代开发(为期两周)。

如何保证,在开发新需求的同时,不影响主干分支的紧急 bug 修复; 并同时开发不紧急的需求。

初始化项目

SVN China 注册一个测试用的账号,新建一个项目。

checkout 项目到本机

svn checkout http://www.svnchina.com/svn/sunzhongwei --username sunzhongwei

开始规划我们的 SVN 项目目录

sunzhongwei (项目根目录)
|_trunk (主干分支)
|_tags
|_branches (其他分支)
  |_iterative-2 (迭代分支)
  |_iterative-2-feature1 (基于迭代分支的特性1分支)
  |_iterative-2-feature2 (基于迭代分支的特性2分支)

主干分支上创建第一个代码文件

cd sunzhongwei
mkdir trunk
touch trunk/hello.py
svn add trunk
svn commit -m "init"
svn update
svn log 

tips: 不要忘了 svn update,否则 svn log 无法看到提交历史。

此时,SVN China 上也能同时看到对应的提交。

创建我们的第一个迭代分支

首先创建分支目录

mkdir branches
svn add branches
svn commit -m "创建分支目录"
svn update

实际上有两种创建分支的方式

第一种方式

svn copy trunk branches/iterative-2
svn status
svn commit -m "创建二期迭代分支"
svn update

第二种方式

svn copy http://www.svnchina.com/svn/sunzhongwei/trunk \
	 http://www.svnchina.com/svn/sunzhongwei/branches/iterative-2 \
	 -m "创建二期迭代分支"
svn update

推荐使用第二种方式,原因是不需要有工作拷贝。

注意,svn copy 之后,不要忘了 svn update 来更新本地代码。

$ svn log -v
------------------------------------------------------------------------
r3 | sunzhongwei | 2015-03-03 14:23:27 +0800 (Tue, 03 Mar 2015) | 1 line
Changed paths:
   A /branches/iterative-2 (from /trunk:2)

创建二期迭代分支
------------------------------------------------------------------------
r2 | sunzhongwei | 2015-03-03 14:21:52 +0800 (Tue, 03 Mar 2015) | 1 line
Changed paths:
   A /branches

创建分支目录
------------------------------------------------------------------------
r1 | sunzhongwei | 2015-03-03 12:30:35 +0800 (Tue, 03 Mar 2015) | 2 lines
Changed paths:
   A /trunk
   A /trunk/hello.py

init

------------------------------------------------------------------------

基于迭代分支创建特性分支

因为一次迭代开发可能包含N多新功能,而这 N 个功能可能由 N 个开发人员来并行开发。 所以最佳方案是每个功能点再建一个分支出来,实现之后再合并回二期迭代分支。

svn copy http://www.svnchina.com/svn/sunzhongwei/branches/iterative-2 \
         http://www.svnchina.com/svn/sunzhongwei/branches/iterative-2-feature-say-hi \
	 -m "2期需求:say hi 功能"
svn update

实现特性功能

vim branches/iterative-2-feature-say-hi/hello.py
// 做一些修改
svn commit -m "say hi 功能"
svn update

可以看到,修改的文件修改历史中包含了所有祖先分支的操作。

$ svn log -v hello.py 
------------------------------------------------------------------------
r5 | sunzhongwei | 2015-03-03 14:48:50 +0800 (Tue, 03 Mar 2015) | 1 line
Changed paths:
   M /branches/iterative-2-feature-say-hi/hello.py

say hi 功能
------------------------------------------------------------------------
r4 | sunzhongwei | 2015-03-03 14:46:39 +0800 (Tue, 03 Mar 2015) | 1 line
Changed paths:
   A /branches/iterative-2-feature-say-hi (from /branches/iterative-2:3)

2期需求:say hi 功能
------------------------------------------------------------------------
r3 | sunzhongwei | 2015-03-03 14:23:27 +0800 (Tue, 03 Mar 2015) | 1 line
Changed paths:
   A /branches/iterative-2 (from /trunk:2)

创建二期迭代分支
------------------------------------------------------------------------
r1 | sunzhongwei | 2015-03-03 12:30:35 +0800 (Tue, 03 Mar 2015) | 2 lines
Changed paths:
   A /trunk
   A /trunk/hello.py

init

合并回迭代分支

cd branches/iterative-2
svn update
cd branches/iterative-2-feature1/
svn merge http://www.svnchina.com/svn/sunzhongwei/branches/iterative-2
svn commit -m "合并迭代分支的修改"
// 自测,没问题后,合并回迭代分支
cd branches/iterative-2
svn merge --reintegrate http://www.svnchina.com/svn/sunzhongwei/branches/iterative-2-feature-say-hi
svn status
// 对比合并发生的修改
svn diff
svn commit -m "合并回迭代分支"

这时候你会发现使用 reintegrate 合并后,迭代分支并没有保存特性分支的提交历史 (但是在 branches 目录下,能看到完整的提交历史)

$ svn log
------------------------------------------------------------------------
r7 | sunzhongwei | 2015-03-03 16:06:36 +0800 (Tue, 03 Mar 2015) | 2 lines

合并回迭代分支

------------------------------------------------------------------------
r3 | sunzhongwei | 2015-03-03 14:23:27 +0800 (Tue, 03 Mar 2015) | 1 line

创建二期迭代分支
------------------------------------------------------------------------
r1 | sunzhongwei | 2015-03-03 12:30:35 +0800 (Tue, 03 Mar 2015) | 2 lines

init

------------------------------------------------------------------------

删除特性分支

svn rm  http://www.svnchina.com/svn/sunzhongwei/branches/iterative-2-feature-say-hi
svn update

然后采用相同的策略将迭代分支合并到 trunk 中。

如何与测试团队合作

  1. 从 trunk 上建立开发 branch
  2. 开发完成后,merge trunk 代码到 branch 上
  3. 提交 branch 给测试部门进行测试
  4. 测试完成后,先锁定 trunk,避免其他人并行合并带来的问题。然后,将 branch 合并入 trunk. 然后通知测试团队切到 trunk 上测试。
  5. 测试通过后,发布 trunk。trunk 代码解锁,打 tag 归档。

参考

关于作者 🌱

我是来自山东烟台的一名开发者,有敢兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式