SVN分支与合并浏览器
1、 分支与合并的概念服务器
2、 SVN分支的意义svn
3、 如何建立分支与合并分支工具
1、分支与合并的概念:测试
分支:版本控制系统的一个特性是可以把各类修改分离出来放在开发品的一个分割线上。这条线被称为分支。分支常常被用来试验新的特性,而不会对开发有编译错误的干扰。当新的特性足够稳定以后,开发品的分支就能够混合回主分支里(主干线)。字体
合并:分支用来维护独立的开发支线,在一些阶段,你可能须要将分支上的修改合并到最新版本,或者将最新版本的修改合并到分支。url
2、 SVN分支的意义:spa
简单说,分支就是用于区分开发版本与当前发布版本的。3d
一、 主干负责新功能的开发版本控制
2.、分支负责修正当前发布版本的bug(对于能够放入下个发布版本的改进性bug能够直接在主干上开发)
3.、分支上修改的bug,常常性merge到主干上,尽可能及时merge(避免大面积红色区域)。
4.、只能分支往主干靠拢(merge),不能反向!
5.、直到下个新版本发布,该分支中止修改
3、 如何建立分支与合并分支:
一、首先要在你的版本库存里建立主干目录,经过版本库浏览器,如图1所示:
(图 1)
二、输入版本库URL地址,如图2所示:
(图 2)
三、进入版本库浏览器主目录,如图3所示:
(图 3)
四、建立主干目录,如图4所示:
(图4)
(图 5)
六、把你要加入版本控制的文件加入主干,如图6-8所示:
(图 6)
(图 7)
(图 8)
七、从主干里检出文件到你的本地工做副本上,如图9-10所示:
(图 9)
(图 10)
八、选择你要建立分支的工做副本,如图11所示:
(图 11)
九、在“至URL”里填写版本库中要存放分支的目录,如图12-13所示:
(图 12)
(图 13)
注意:这时候工做副本对应版本库的路径仍为原来对应的主干的目录。
十、再从分支里检出内容到本地目录上,如图14-15所示:
(图 14)
(图 15)
十一、打开刚从分支里检出的工做副本目录,修改里面的test.txt文档并提交,如图16-17所示:
(图 16)
(图 17)
注意:这时提交的修改只会提交到分支上,并不会更改主干上的内容。
(图 18)
1三、选择合并类型(合并类型在文档的最后有专门的介绍),若是19所示:
(图 19)
1四、选择合并选项(合并选项在文档最后有专门的介绍),如图20所示:
(图 20)
1五、在合并以前,能够先进行测试合并,如图21所示:
(图 21)
1六、测试合并成功后,点击“合并”按钮进行合并,如图22所示:
(图 22)
1七、合并完成后,打开test.txt文件,这时候能够看见文件的内容跟分支里的内容同样,而且文件上有红色叹号标记(说明已经修改过),如图23所示:
(图 23)
1八、在主干上提交修改就完成了合并,若是24所示:
(图 24)
对svn分支合并类型和深度的理解:
合并的工做是把主干或者分支上合并范围内的全部改动列出,并对比当前工做副本的内容,由合并者手工修改冲突,而后提交到服务器的相应目录里。若是当前工做副本是主干,则合并的范围是分支上的改动,若是工做副本是分支的,则合并范围是主干上的改动,而且必定要注意,合并的起始位置URL必定要和当前的工做副本的URL是相同的。
1、合并一个范围的版本
此类型应用最为普遍,主要是把分支中的修改合并到主干上来。在主干上点击右键选择合并,而后选择合并类型:合并一个范围的版本。合并的源URL填写的是要合并的分支的URL,待合并的版本范围若是为空,则指的是合并分支上全部的版本,即自从分支建立以来到分支当前最新版本的全部演变。若是只是选择其中一个版本,或者几个版本,那么就表示只是将制定的n个版本的变化合并到主干上。若是只是选择其中一个版本,那么表示只是选择那个版本的修改,以前或以后的修改将不被采纳。
2、复兴合并
复兴合并能够理解为是第一种合并类型的一种特例,在复兴合并中,主干能够理解为是自从开创分支以后没有任何修改,而分支是通过修改的,并且合并中分支是没有版本选择的。通过复兴合并,分支中全部的修改都会合并到主干中,合并的结果将使得分支和主干如出一辙,从而能够删除分支。
3、合并两个不一样的树
此类型与前两种类型不一样,第一种类型能够选择分支合并的版本,主干不能选择版本;第二种类型是主干和分支都不能选择合并的版本;而这种类型则是不管是主干仍是分支均可以选择合并的版本,便可以选择过去的一个主干版本与分支的某个版本进行合并。合并的时候以选择的分支版本为主,若是选择的主干版本与分支版本有不一样的地方,合并时主干部分将被放弃。
起始URL:选择主干目录的URL(应当和当前工做副本的URL一致,这个是所谓的合并点)
结束URL:选择要合并的分支的URL。
起始和结束的版本:通常起始版本应当找到最后一次同步时的版本,若是从没有同步过(第一次合并),则选择建立分支时的版本,结束版本通常是最新版本,若是你不想将某些内容合并进主干的话,也能够选择一个合并点。
实例:
主干A在95版本的时候建立分支B,此时两棵树都是95版本
一、 我在分支B上增长文件test.txt,提交。此时版本库升级到了96版本;
二、 我在A上选择合并类型1,合并分支最新版本,结果是把test.txt加入A;
三、 我在A上选择合并类型2,合并分支最新版本,结果同上;
四、 我在A上选择合并类型3,合并分支最新版本,结果同上;
五、 我在A上增长文件test2.txt,提交,此时版本库升级到了97版本;
六、 我在A上选择合并类型1,合并分支最新版本,结果是把test.txt加入A;
七、 我在A上选择合并类型2,合并分支最新版本,结果是把test.txt加入A;
八、 我在A上选择合并类型3,主干选择当前97版本,合并分支最新版本,结果是把test.txt加入A,把test2.txt从A删除;
九、 我在A上选择合并类型3,主干97之前的版本,合并分支最新版本,结果是把test.txt加入A,而A中保留着test2.txt。
将分支合并到主干上,首先须要在主干的工做副本下进行,合并的范围是从主干的上次合并的版本开始到分支上最新的版本结束,若是是第一次合并,则从主干建立分支的版本开始,因此每次合并要作好说明,在日志中体现,否则忘记了下次再合并就有点麻烦。其实,应当尽可能避免一个分支合并屡次,分支的做用通常为了解决bug,一旦bug对应结束了,分支的使命就结束了,之后再出现其余的问题,应当从新创建分支,这样就不会出现屡次合并的问题了。
分支的合并深度
合并深度:
1、工做副本:即你当前的工做目录,通常默认为这个选项;
2、全递归:即你选择的目录的版本库,包括了其下面的子文件,子文件夹,包括子文件夹里面的内容;
3、直接子节点,包括文件夹:即你选择的目录下面的文件,文件夹,可是不包括文件夹里面的子文件,子文件夹;
4、仅文件子节点:即你选择的目录下面的文件,但不包括文件夹,固然不包括的文件夹下面的全部内容也都不归入合并范围;
5、仅此项:没有任何合并内容。
实例:
一、主干test文件夹下面有text.txt文件,把test文件夹建立分支test2
二、在test2文件夹下面增长test21文件夹,在test21文件夹下面增长文件夹test211,在test211文件夹下面增长文件test211.txt;修改test2文件夹下面的文件test.txt,增长文件test2.txt。提交
三、右键test文件夹合并test2文件夹,选择工做副本。则test文件夹中原先的test.txt文件则显示修改状态,test2.txt文件显示新增状态,文件夹test21和test211以及里面的test211.txt文件都显示为新增状态。选择将test文件夹svn还原,则新增状态下的文件夹或者文件显示为无版本控制状态,原先的test.txt还原为常规常态。
四、右键test文件夹合并test2文件夹,选择全递归,结果和3同样。可是咱们以前的test文件夹和仓库上的test的内容是一致的,若是不一致,那么选全递归,是已仓库版本为标准。选工做副本,顾名思义,则以你本地的工做副本文件为主,分支上有而工做副本中没有的文件夹或文件则不进行比较合并。
五、右键test文件夹合并test2文件夹,选择直接子节点,包含文件夹。则test文件夹中原先的test.txt文件显示为修改状态,test2.txt文件显示为新增状态,test21文件夹显示为新增状态,可是其里面内容则为空,那么就证实了分支中test21文件夹如下的内容并无合并到主干test中来,合并行为只是选取了当前目录。选择将test文件夹svn还原,则新增状态下的文件夹或者文件显示为无版本控制状态,原先的test.txt还原为常规状态。
六、右键test文件夹合并test2文件夹,选择仅文件子节点。则test文件夹中原先的test.txt文件显示为修改状态,test2.txt文件显示为新增状态,分支test2中的test21文件夹没有合并到test中来。选择将test文件夹svn还原,则新增状态下的文件显示为无版本控制状态,原先的test.txt还原为常规状态。
七、右键test文件夹合并test2文件夹,选择仅此项。则test文件夹显示为修改状态,可是内容没有任何改动。将test文件夹svn还原,则该文件夹显示为常规状态。
只记录合并(阻止这些版本未来被合并)
选择此项意味着并无实际的合并动做,只是在未来的合并过程当中,svn将过滤掉此版本的修改动做。例如,我在合并的过程当中,选择对分支的23版本只记录合并(阻止这个版本未来被合并),那么23版本并不会合并到主干中。在之后的合并中,若是选择合并分支的22到24版本,那么23版本将被忽略,咱们也能够看到,在选择版本的对话框上,23版本的字体是灰色的。因此要慎重使用这个选项,一旦使用了,那么表示这个版本在之后的合并中就不能再使用了。
忽略祖先:若是在分支上有一个文件曾经被删除过,后来又加了一个同文件名的文件,那么在merge的时候svn会识别到这两个文件不是同一个祖先而直接覆盖旧文件增长新文件。而实际上我是要对这两个不一样祖先的文件进行合并的,这个时候就须要使用svn merge --ignore-ancestry 忽略祖先来进行合并才能保证正确。
实例:
一、 将主干test建立分支test1;
二、 将test1文件夹下的test.txt文件删除,提交;
三、 在test1下建立文件test.txt,提交;
四、 将test1合并到主干test,若是默认选择,则提示将test1中的test.txt文件替换test文件夹中的test.txt文件;若是选择了忽略祖先,那么系统将把两个test.txt做比较,必要时提示冲突。
carriage return是一个符号(指回车符号CR),而通常在代码文件或文体文件里(WINDOWS下)里换行是CR和LF(即\r\n或十六进制码0D 0A),而你行中只有CR,因此将要加一个LF(即OA)。说得很明确了,其实LF就是line feed的简写。whitespace包括line feeds, tabs, spaces, and carriage returns。
================================================
有人问SVN合并时间遇到冲突怎么办?实际假若把beyond compare配置为了svn的合并工具以后就会发现冲突合并比较简单。(配置方法应该是在TortoiseSVN的帮助里面有)