svn merge和branch

来源:互联网 发布:vscode提示class 编辑:程序博客网 时间:2024/06/05 15:58

http://www.byywee.com/page/M0/S765/765539.html

应用svn几年了,一向对分支和归并敬而远之,一来是因为分支的经管不该我费神,二来即使涉及到分支的经管,也不敢贸然应用归并功能,生怕归并出了题目对团队造成不良影响,最首要的原因是,本身对分支的目标和归并的办法不甚懂得,这才是硬伤。


 


比来因为适配机型的须要(本人从事手机客户端的开辟),须要经常接触分支和归并两项工作,忽然发明这玩意整不熟悉打听很难开展工作,遂这两天侧重研究了一下,有点收成,怕今后忘了,故趁着余温尚在赶紧写下来,好记性不如烂笔头嘛。下文的实践主如果参考了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)的一个拷贝,见下图:


svn merge和branch - cruelchen - 请重启您的计算........


 


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,在每次归并前最好先,然后将本地的批改先全部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的创建很简单,假设我要在D:\TortoiseSVN\TestRepository目次中创建repository,只需右键TestRepository目次,依次选择"TortoiseSVN" -> "Create repository here"便完成了repository的创建。


 


2、Check out


假设要check out到D:\TortoiseSVN\TestSVN,同样很简单,在D:\TortoiseSVN目次下创建TestSVN目次,然后在该目次上右键,选择"SVN Check out...",在弹出的窗口中的"URL of repository"中填入"file:///D:/TortoiseSVN/TestRepository",其他默认即可,最后点击ok。


 


3、trunk创建新项目MyProject


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


svn merge和branch - cruelchen - 请重启您的计算........


 


4、创建branch


在/trunk/MyProject目次上右键,依次选择"TortoiseSVN" -> "Branch/tag...",在弹出窗口的"To URL"中填入分支的地址,在这里目标revision选择HEAD revision,如下图所示,添加log后点击ok分支便建树了。这个操纵速度很是快,新建的branch在repository中其实只是一个指向trunk某个revision的软连接罢了,并没有真的复制文件。


svn merge和branch - cruelchen - 请重启您的计算........


 


5、Check out分支


右键TestSVN目次选择"TortoiseSVN Update"即可将方才建树的分支下载回本地。进入/branches/MyProject目次下你会发明其文件布局和/trunk/MyProject一模一样。


 


6、branch提交一个新文件


svn merge和branch - cruelchen - 请重启您的计算........


 


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


svn merge和branch - cruelchen - 请重启您的计算........


 


8、branch再次提交一个批改


svn merge和branch - cruelchen - 请重启您的计算........


 


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


6-8演示的是branch和trunk在自力、并行地开辟。为了防止在“错误”的路子上越走越远,如今branch意识到是时辰和trunk来一次同步了(将trunk归并到branch)。


起首,在本地trunk中先一下,有冲突的解决冲突,包管trunk和repository已经完全同步,然后在/branches/MyProject上右键,依次选择"TortoiseSVN" -> “Merge...”,在弹出的窗口中选择第一项"Merge a range of revision",这个类型的Merge已经介绍得很清楚,实用于将某个分支或主线上提交的多个revision间的变更归并到别的一个分支上。


svn merge和branch - cruelchen - 请重启您的计算........


 


点击next后,呈现如下窗口:


svn merge和branch - cruelchen - 请重启您的计算........


 


因为是要从trunk归并到branch,理所当然这里的"URL to merge "应当填trunk的路径,"Revision range to merge"很好懂得,就是你要将trunk的哪些revision所对应的变更归并到branch中,可所以某连续串的revision,比如4-7,15-HEAD,也可所以某个零丁的revision号。因为在r4中,trunk批改了Person.java中的talk()办法,所以这里的revision只需填4即可。点击next后呈现下图:


svn merge和branch - cruelchen - 请重启您的计算........


 


在这里只需保存默认设置即可。在点击Merge按钮前你可以先Test merge一把,看成功与否,以及merge的具体信息。点击Merge按钮后trunk所做的批改将同步到branch中。


 


10、提交归并后的branch


svn merge和branch - cruelchen - 请重启您的计算........


 


至此,branch已经完全和trunk同步,branch和trunk的代码相处很融洽,没有任何冲突,若是branch已经开辟停止,那是时辰将branch归并回trunk了,当然,若是branch还要持续开辟,那你将络续地反复6-10这几个步调。


 


11、将branch归并回trunk


在/trunk/MyProject上右键(重视是在主线的目次上右键),依次选择"TortoiseSVN" -> "Merge...",在弹出的窗口中,Merge type选择第二项"Reintegrate a branch",这种类型的归并合适在分支开辟停止后将所有的批改归并回主线。


svn merge和branch - cruelchen - 请重启您的计算........


 


点击next后呈现如下窗口:


svn merge和branch - cruelchen - 请重启您的计算........


 


在这里,"From URL"选择/branches/MyProject,无需选择revision号,Reintegrate会将branch上所有批改归并到trunk。后面的步调和上文第9步中的一样,不再烦琐了。如无不测,branch将成功归并到trunk,你须要做的只是将归并后的trunk赶紧commit!


 


12、提交归并后的trunk


so easy...


 


13、删除branch


若是你认为你新加的功能已经开辟完成了,你可以删除你的分支


 


 


到这里,我已经给你演示完了全部过程,我一身的汗也下来了,我想罢工了,不过最后我们还是看看所有的log信息吧,经由过程log能发明我们干的所有工作:


svn merge和branch - cruelchen - 请重启您的计算........


 


r1-r7恰是我上文在干的工作,从Message中你能发明我对trunk和branch都干了什么,别的,在Log Messages窗口的左下角勾选了"Include merged revisions"你还能看到额外的Merge information:


svn merge和branch - cruelchen - 请重启您的计算........


 


图中灰色的是和merge相干的log,共产生了两次merge,第一次是在r6,在r6中,branch归并了trunk在r4时提交的变更;第二次是在r7,在r7中,trunk归并了branch从r2到r6的所有变更。

原创粉丝点击