如何利用 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 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式