zoukankan      html  css  js  c++  java
  • [svn] 分支开发

    参考博客:
    http://www.cnblogs.com/cxd4321/archive/2012/07/12/2588110.html

    (1)为什么要使用SVN分支开发和主干合并?

    目的:在SVN下进行版本升级模式的开发
    
    需求1、项目目前已经有比较稳定的版本(release_version_1.0),需要在稳定版本上面做程序的升级
    2、升级开发时,可能有10个程序员同时在修改程序,且都需要对绝大多数文件做大部分改动
    3、恶心的技术经理说:现在需要把数据库换成hbase,但是没有更改完毕之前依旧保持mysql不变
    4、多人频繁提交代码引入了过多的不稳定因素
    5、为不同用户客定制不同的版本
    
    目标1、在开发过程中需要保证随时可以切换到指定的版本(1.0/2.0/3.02、最大程度避免程序的肆意修改和较多的冲突
    3、程序员间相互的修改不受影响
    
    解决方案:在SVN下进行分支开发与主干合并

    (2)SVN标准结构

    url_of_repository
        |-trunk
            |-cnblogs
        |-tags
            |-cnblogs_release_version_1.0
            |-cnblogs_release_version_1.2
            |-cnblogs_release_version_2.0
        |-branches
            |-cnblogs_update_version_1.2_20151012
            |-cnblogs_update_version_2.0_20151213
    
    
    解读:
    
    从目录可以看出,目前有三个版本,分别是1.0、1.2、2.0.
    其中最新稳定可发布版本是2.0。
    
    目前项目针对1.2和2.0版本在做分支升级开发,1.2版本是从1012开始进行升级,2.0版本是1213开始进行升级维护的。

    (3)Trunk、Tags、Branches详细解读

    ① trunk[主干]

    任何时候,应该保证trunk里面的代码是最新的稳定版本
    当branch里面修改的代码经过多次测试成功通过后,应该把branch里面的代码合并到主干trunk里

    ② tags[存储阶段性的发布版本]

    将某时刻认为稳定的最新版本作为一个备份保存在tags目录下,以便随时切换到该稳定节点版本
    作为一个里程碑的版本进行存档
    注意:tags下面的版本文件默认是只读的(可以强制修改),但还是建议不要修改tags下面的任何文件。
    
    常常听项目经理说:
    A.嗯,不错。这个版本比较稳定,给打个2.0版本极限吧。
    B.有没有搞错,这个版本这么多错误还敢上线!赶紧给我回退到上一个版本!
    
    相对应的操作是:
    A.将当前trunk里的代码"复制"一份到tags下面(cnblogs_release_version_2.0),并注明这个版本的更新和修改情况
    B.忽略本次发布版本(cnblogs_release_version_2.0),将系统回退到上一个经测试验证后比较稳定的版本(cnblogs_release_version_1.2)

    ③ branches[分支]

    一个branch是某个 trunk 的一个拷贝
    新建的branch在repository中其实只是一个指向trunk某个revision的软连接而已,并没有真的复制文件。
    
    流程:从trunk创建(create)branch,然后在branch上做开发,开发完毕后合并(merge)到trunk中。
    
    项目经理把小李子和小叶子叫过来说:
    你们负责的模块都有不同程度的问题,需要修改一下。
    但是我不想让你们在trunk里面直接修改,你们回头各自创建一个branch,分别修改完自己的bug再合并到trunk里面吧
    
    1)一个重要问题:branch和trunk在并行开发的过程中如何感知对方,避免两者越走越远,导致最后无法合并?
    解决这一问题的唯一手段是:branch要不停地和trunk保持同步,你要及时地知道trunk都做了什么修改,这些修改是否会影响你正在开发的新功能,如果需要,你必须及时调整branch的代码,使之能与trunk“兼容”。
    
    2)那么如何让branch和trunk保持同步?合并,从trunk合并到branch,你没听错,是从trunk合并到branch。
    
    关于TortoiseSVN的合并,有几点需要注意:
    
    A.TortoiseSVN的合并发生在本地,也即你的working copy中,你无需过多担心会对repository中的代码造成影响
    
    B.不管是从trunk合并到branch还是最终从branch合并回trunk,在每次合并前最好先update,然后将本地的修改先全部commit,保护好现场,万一合并不理想随时都可以revert
    
    C.合并完成后看是否能正确编译,然后测试验证,最后将合并后的改动提交到repository

    (4)Branch和Merge具体执行流程

    ① 创建Branch/Tag

    在/trunk/MyProject目录上右键,选择“分支/标记”,在弹出框中的"ToURL"中填入分支/标记的地址,
    在这里目标revision选择HEAD revision。添加log后点击ok分支/标记便建立了。

    ② 检出(Check Out)或者切换(Switch)到分支,在分支中做修改

    ③ 将trunk中的修改同步到branch

    首先,保证此时trunk中的代码是最新的,没有任何冲突。(该Commit的和Update的都已经执行完毕)
    
    "Merge a range of revision" - 将某个分支或主线上提交的多个revision间的变化合并到另外一个分支上。
    
    当branch和trunk在独立、并行地开发时,为了防止在“错误”的道路上越走越远,branch意识到是时将trunk合并到branch了。

    trunk先Update至最新代码,在
    /branches/MyProject上右键,选择Merge选项,选择"Merge a range of revision"。

    在点击Merge按钮前你可以先Testmerge一把,看成功与否,以及merge的详细信息。

    点击Merge按钮后trunk所做的修改将同步到branch中。

    至此,branch已经完全和trunk同步,branch和trunk的代码相处很融洽,没有任何冲突。

    ④ 将branch合并回trunk

    首先,需要保证此时branches中的代码是最新的,没有任何冲突。(该Commit的和Update的都已经执行完毕)
    
    "Reintegrate a branch" - 在分支开发结束后将所有的改动合并回主线。
    
    在/trunk/MyProject上右键,选择“Merge”,在弹出的窗口中,Merge type选择"Reintegrate a branch"
    
    最后,需要将成功合并后的trunk赶紧commit!

    ⑤ 删除branch

    如果你认为你新加的功能已经开发完成了,你可以删除你的分支。
  • 相关阅读:
    泛在电力物联网建设路线
    如何建设泛在电力物联网?
    泛在电力物联网到底该怎么建?
    泛在电力物联网(能源互联网+物联网)浅析
    泛在电力物联网分析—架构形式
    泛在电力物联网:两个业务 两种发展逻辑
    国网“泛在电力物联网”的战略与逻辑
    MVC中使用Hangfire按秒执行任务
    hangfire 实现已完成的job设置过期,防止数据无限增长
    解决ASP.NET Core部署到IIS,更新项目"另一个程序正在使用此文件,进程无法访问"
  • 原文地址:https://www.cnblogs.com/avivaye/p/5063381.html
Copyright © 2011-2022 走看看