一直在 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 中。
如何与测试团队合作
- 从 trunk 上建立开发 branch
- 开发完成后,merge trunk 代码到 branch 上
- 提交 branch 给测试部门进行测试
- 测试完成后,先锁定 trunk,避免其他人并行合并带来的问题。然后,将 branch 合并入 trunk. 然后通知测试团队切到 trunk 上测试。
- 测试通过后,发布 trunk。trunk 代码解锁,打 tag 归档。
参考
微信关注我哦 👍
我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊, 查看更多联系方式