zoukankan      html  css  js  c++  java
  • TortoiseSVN中分支和合并实践

    使用svn几年了,一直对分支和合并敬而远之,一来是因为分支的管理不该我操心,二来即使涉及到分支的管理,也不敢贸然使用合并功能,生怕合并出了问题对团队造成不良影响,最基本的原因是。自己对分支的目的和合并的方法不甚了解。这才是硬伤。

     

    近期因为适配机型的须要(本人从事手机client的开发),须要常常接触分支和合并两项工作。突然发现这玩意整不明确非常难开展工作,遂这两天着重研究了 一下,有点收获,怕以后忘了,故趁着余温尚在赶紧写下来,好记性不如烂笔头嘛。下文的实践主要是參考了TortoiseSVN的帮助文档和 Subversion的在线文档。Subversion的在线文档:http://svnbook.red-bean.com/en/1.5/svn-book.html

     

    话说我公司如今的源码管理挺乱的,svn文件夹并没有採取标准的source/branches、source/trunk结构。主线和分支放得到 处都是,release版本号也并没有当成tag处理,而是当成branch来管理。常常还要在release版本号上改来改去。

    。。

     

    先说说什么是branch。

    依照Subversion的说法。一个branch是某个development line(一般是主线也即trunk)的一个拷贝。见下图:

    TortoiseSVN中分支和合并实践

     

    branch存在的意义在于,在不干扰trunk的情况下。和trunk并行开发。待开发结束后合并回trunk中,在branch和trunk各自开发的过程中。他们都能够不断地提交自己的改动。从而使得每次改动在repository中都有记录。

     

    设想以下场景,假设你的项目须要开发一个新功能,而该功能可能会改动项目中的绝大多数文件,而与此同一时候,你的还有一位同事正在进行bug fix。假设你的新功能不在branch中开发而直接在trunk中开发,那么你极有可能影响还有一位同事的bug fix,他/她在bug修复中可能会遇到各种各样的问题,因为你的频繁提交代码引入了过多的不稳定因素。

    你可能会说,那我在开发的过程中不提交不就可以了, 等到我全部开发结束我再提交,是,你能够这么做,那还要版本号控制干什么呢?或许等到你最后提交代码的时候(或许一周。或许两周?)。你会发现有一大堆 conflict等着你resolve。。。

     

    那么,正确的做法是什么?使用branch。从trunk创建branch,然后在你的branch上开发,开发完毕后再合并到trunk中。

     

    关于branch先说到这里。以下说说什么叫做合并。非常好理解,当branch开发完毕后(包含必要的測试)。将branch中的改动同步到trunk中。这个过程有可能包含改动文件、添加文件、删除文件等等。

     

    说到这里,貌似本文几乎相同能够结束了,不就是分支和合并么?仅仅要再简单地说说怎样建立分支和怎样合并就能够收尾了。可能仅仅需两个命令,也可能仅仅需鼠 标点几下然后键盘敲两下就可以。

    事实上事情远非这么简单。爱动脑筋的同学可能会问了。将branch的改动merge到trunk的时候,和上文说的直接在 trunk中全部开发完然后提交有何差别?你最后还不是要处理一大堆conflict?

     

    这个问题问得非常好,事实上这正是本文的重点:branch和trunk在并行开发的过程中怎样感知对方。branch怎样才干在开发过程中不会和 trunk越走越远。导致最后无法合并?试想一下,假设在你开发branch的过程中,trunk中的某个类文件已经被删除了(这可能是另外一个家伙在另 一个branch上开发了两周后才合并到trunk的),而你居然在这个类文件上做了大量改动。试问你到最后合并回trunk的时候该有多蛋疼?解决这一 问题的唯一手段是,branch要不停地和trunk保持同步,你要及时地知道trunk都做了什么改动,这些改动是否会影响你正在开发的新功能,假设需 要,你必须及时调整branch的代码。使之能与trunk“兼容”。

     

    那么怎样让branch和trunk保持同步?合并,从trunk合并到branch,你没听错,是从trunk合并到branch。

    关于TortoiseSVN的合并,有几点须要注意:

    • TortoiseSVN的合并发生在本地,也即你的working copy中,你无需过多操心会对repository中的代码造成影响

    • 无论是从trunk合并到branch还是终于从branch合并回trunk,在每次合并前最好先update。然后将本地的改动先全部commit,保护好现场,万一合并不理想随时都能够revert

    • 合并完毕后看能否正确编译。然后測试验证。最后将合并后的改动提交到repository

     

     

    以下我将step by step地演示怎样一次完整的branching和merging,包含创建分支、分支开发、分支和主线同步,分支合并到主线的全过程,甚至包含怎样在本地创建一个測试用的repository。

     

    首先须要安装TortoiseSVN,我安装的版本号是:TortoiseSVN 1.6.15, Build 21041 - 32 Bit , 2011/03/23 18:00:27

     

    1、本地Repository的创建

    repository的创建非常easy。假设我要在D:TortoiseSVNTestRepository文件夹中创建repository,仅仅需 右键TestRepository文件夹。依次选择"TortoiseSVN" -> "Create repository here"便完毕了repository的创建。

     

    2、Check out

    假设要check out到D:TortoiseSVNTestSVN。相同非常easy,在D:TortoiseSVN文件夹下创建TestSVN文件夹,然后在该文件夹上右 键。选择"SVN Check out...",在弹出的窗体中的"URL of repository"中填入"file:///D:/TortoiseSVN/TestRepository",其它默认就可以,最后点击ok。

     

    3、trunk创建新项目MyProject

    相当简单就不赘述了,仅仅列出本次操作所作出的改动:

    TortoiseSVN中分支和合并实践

     

    4、创建branch

    在/trunk/MyProject文件夹上右键,依次选择"TortoiseSVN" -> "Branch/tag..."。在弹出窗体的"To URL"中填入分支的地址,在这里目标revision选择HEAD revision,例如以下图所看到的,加入log后点击ok分支便建立了。

    这个操作速度非常快,新建的branch在repository中事实上仅仅是一个指向 trunk某个revision的软连接而已,并没有真的拷贝文件。

    TortoiseSVN中分支和合并实践

     

    5、Check out分支

    右键TestSVN文件夹选择"TortoiseSVN Update"就可以将刚刚建立的分支下载回本地。

    进入/branches/MyProject文件夹下你会发现其文件结构和/trunk/MyProject一模一样。

     

    6、branch提交一个新文件

    TortoiseSVN中分支和合并实践

     

    7、trunk紧接着提交一个改动

    TortoiseSVN中分支和合并实践

     

    8、branch再次提交一个改动

    TortoiseSVN中分支和合并实践

     

    9、将trunk中的改动同步到branch

    6-8演示的是branch和trunk在独立、并行地开发。为了防止在“错误”的道路上越走越远,如今branch意识到是时候和trunk来一次同步了(将trunk合并到branch)。

    首先,在本地trunk中先update一下。有冲突的解决冲突,保证trunk和repository已经全然同步,然后在/branches /MyProject上右键,依次选择"TortoiseSVN" -> “Merge...”。在弹出的窗体中选择第一项"Merge a range of revision",这个类型的Merge已经介绍得非常清楚,适用于将某个分支或主线上提交的多个revision间的变化合并到另外一个分支上。

    TortoiseSVN中分支和合并实践

     

    点击next后。出现例如以下窗体:

    TortoiseSVN中分支和合并实践

     

    因为是要从trunk合并到branch,理所当然这里的"URL to merge from"应该填trunk的路径,"Revision range to merge"非常好理解,就是你要将trunk的哪些revision所相应的变化合并到branch中。能够是某一连串的revision,比方 4-7,15-HEAD,也能够是某个单独的revision号。

    因为在r4中,trunk改动了Person.java中的talk()方法,所以这里 的revision仅仅需填4就可以。点击next后出现下图:

    TortoiseSVN中分支和合并实践

     

    在这里仅仅需保留默认设置就可以。在点击Mergebutton前你能够先Test merge一把,看成功与否,以及merge的具体信息。点击Mergebutton后trunk所做的改动将同步到branch中。

     

    10、提交合并后的branch

    TortoiseSVN中分支和合并实践

     

    至此,branch已经全然和trunk同步,branch和trunk的代码相处非常融洽。没有不论什么冲突。假设branch已经开发结束。那是时候将branch合并回trunk了。当然。假设branch还要继续开发,那你将不断地反复6-10这几个步骤。

     

    11、将branch合并回trunk

    在/trunk/MyProject上右键(注意是在主线的文件夹上右键),依次选择"TortoiseSVN" -> "Merge...",在弹出的窗体中,Merge type选择第二项"Reintegrate a branch"。这样的类型的合并适合在分支开发结束后将全部的改动合并回主线。

    TortoiseSVN中分支和合并实践

     

    点击next后出现例如以下窗体:

    TortoiseSVN中分支和合并实践

     

    在这里,"From URL"选择/branches/MyProject,无需选择revision号。Reintegrate会将branch上全部改动合并到 trunk。后面的步骤和上文第9步中的一样,不再啰嗦了。

    如无意外。branch将成功合并到trunk,你须要做的仅仅是将合并后的trunk赶紧 commit!

     

    12、提交合并后的trunk

    so easy...

     

    13、删除branch

    假设你觉得你新加的功能已经开发完毕了,你能够删除你的分支

     

     

    到这里,我已经给你演示完了整个过程,我一身的汗也下来了。我想罢工了。只是最后我们还是看看全部的log信息吧,通过log能发现我们干的全部事情:

    TortoiseSVN中分支和合并实践

     

    r1-r7正是我上文在干的事情,从Message中你能发现我对trunk和branch都干了什么,另外,在Log Messages窗体的左下角勾选了"Include merged revisions"你还能看到额外的Merge information:

    TortoiseSVN中分支和合并实践

     

    图中灰色的是和merge相关的log,共发生了两次merge,第一次是在r6,在r6中。branch合并了trunk在r4时提交的变化;第二次是在r7,在r7中,trunk合并了branch从r2到r6的全部变化。

     

     

    总结:

    • branch主要用于新功能的开发

    • 合并发生在本地working copy。仅仅要你不提交就不会影响到repository

    • 合并前一定要先update、commit,保证不会out of day,并将本地的改动保存到repository

    • branch和trunk并行开发的过程中,要常常同步,将trunk的改动合并到branch,合并时选择"Merge a range of revision"

    • branch最后合并回trunk时。merge type选择"Reintegrate a branch"

  • 相关阅读:
    新手入门:python的pip安装(二)
    新手入门:python的安装(一)
    python解释器和环境安装
    Python基础入门总结
    Python环境搭建教程(windows10)
    漏洞重温之sql注入(三)
    漏洞重温之sql注入(二)
    漏洞重温之sql注入(一)
    漏洞重温之文件上传(FUZZ)
    漏洞重温之文件上传(总结)
  • 原文地址:https://www.cnblogs.com/llguanli/p/8422706.html
Copyright © 2011-2022 走看看