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

更新日期: 2015-12-12 阅读次数: 10000 分类: 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 聊聊。 白天工地搬砖,晚上哄熊孩子,可能回复有点慢,见谅。 查看更多联系方式

相关文章

爱评论不评论

近期节日

2020年02月24日 第三世界青年日
2020年02月24日 龙抬头
2020年02月28日 世界居住条件调查日
2020年03月01日 国际海豹日
2020年03月03日 全国爱耳日
2020年03月05日 学雷锋日
2020年03月05日 惊蛰
2020年03月08日 三八妇女节
2020年03月12日 植树节
2020年03月14日 白色情人节
2020年03月15日 消费者权益日
2020年03月17日 国际航海日
查看更多节日