• 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"

  • 相关阅读:
    【DFS】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem D. Divisibility Game
    【二分】【三分】【计算几何】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem L. Lines and Polygon
    【线段树】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem J. Jedi Training
    【贪心】【后缀自动机】XIII Open Championship of Y.Kupala Grodno SU Grodno, Saturday, April 29, 2017 Problem E. Enter the Word
    【转载】随机生成k个范围为1-n的随机数,其中有多少个不同的随机数?
    【推导】【贪心】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem H. Path or Coloring
    【枚举】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem D. Cutting Potatoes
    【找规律】【递归】XVII Open Cup named after E.V. Pankratiev Stage 4: Grand Prix of SPb, Sunday, Octorber 9, 2016 Problem F. Doubling
    【贪心】Codeforces Round #436 (Div. 2) D. Make a Permutation!
    【计算几何】【圆反演】计蒜客17314 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 G. Finding the Radius for an Inserted Circle
  • 原文地址:https://www.cnblogs.com/llguanli/p/8422706.html
Copyright © 2020-2023  润新知