【转】SVN中的Branches分支以及Tags标签详解与应用举例

SVN中的Branches分支以及Tags标签详解与应用举例2010年07月07日 星期三 15:18 1.关于SVN

SVN 是Subversion的简称,在软件开发中,我们经常用于版本控制和源代码管理。

我们经常使用的几个SVN工具包括:

VisualSVN,这是一个Visual Studio的插件,可以便于开发者在VS中方便的执行迁入迁出的工作,这个工具是需要付费的,具体可以去http://www.visualsvn.com/visualsvn/download/下载试用版。


VisualSVN Servers,这是一个搭建SVN服务器端的工具,使用这个工具还可以很轻松的创建用户和用户组并进行权限控制管理,包括了Windows验证和用户验证的机制,还可以记录日志等,不过免费版并不包括完整的功能,但作为常用的版本控制工具是完全可以满足的,具体可以去http://www.visualsvn.com/server/download/下载。也可以不通过这个工具搭建服务器端,具体可以参看之前我的一篇日志:Subversion + VisualStudio 2008实战(一)。

TortoiseSVN,这是一个可以集成到Windows资源管理器中的Shell程序,可以方便的帮助我们执行各种命令,这是一个免费的工具,在VisualSVN失效的时候,我们依然可以针对项目的文件夹和文件执行签入迁出等各种工作,下载地址:http://www.visualsvn.com/visualsvn/download/tortoisesvn/ 。

2.关于SVN中的Branches与Tags

在版本控制的系统中,我们经常需要对开发周期中的单独生命线作单独的修改,这条单独的开发生命线就可以称为Branches即分支。分支经常用于添加新的功能以及产品发布后的bug修复等,这样可以不影响主要的产品开发线以及避免编译错误等。当我们添加的新功能完成后可以将其合并到主干中。
而Tags即标签主要用于项目开发中的里程碑,比如开发到一定阶段可以单独一个版本作为发布等,它往往代表一个可以固定的完整的版本,这根VSS中的Tag大致相同。
SVN中的Branches以及Tags经常容易混淆,因为在TortoiseSVN中创建方法是一致的,而且它们都是通过存储类似Linux中的lunch快捷方式一样,只是创建了指向某个版本的链接,而不会真正将此版本的内容复制到分支或者标签中,这样既可以节省空间,也可以很快速的创建。
为了便于创建分支和标签,我们习惯于将Repository版本库的结构布置为:/branches,/tags,/trunk。分别代表分支,标签以及主干。
还有一点值得注意的是,SVN不推荐在创建的Tag基础上Revision,这种情况应用Branches,因为Tag一般保持不变不作任何修改。

3.创建Branch分支或者Tag标签

当按照推荐的结构创建的版本库,创建分支以及Tag是很容易的。
在我的SVN服务器上创建了一个版本库Test,结构如下:

在我的本地签出checkout,添加一个文件test.txt,然后提交。

加入这个时候我们需要发布一个版本的文件,同时有可能其他人会修改,但我们不能影响当前的文件,只能在其修改好后再合并,这种情况下我们创建一个分支。

这个时候我们可以发现本地的trunk文件夹的SVN属性的URL已经被Switch到创建的版本的地址了:

执行SVN更新命令,可以查看到,本地branches文件夹下新增文件夹v1.0以及文件夹里面的文件v1.0。

4.修改分支和使用合并Merge功能

修改branches/v1.0下面的文件test.txt,添加一行modified in branch v1.0.然后签入到SVN服务器中:

由于刚才我们已经将trunk的SVN版本库URL转换到对应的版本,所以这个时候更新trunk文件夹可以看到更新的test.txt文件。
为了作测试,我们将trunk文件夹switch至对应的trunk地址:

当switch成功后,我们可以看到trunk下test.txt文件的内容并没有任何的更改,这正体现了刚才我们所说的在分支中的修改不会影响到主干。
下面修改trunk文件夹下的test.txt,添加一行modified in trunk.然后签入到SVN服务器中:

最好我们将实现一个重要的功能,就是Merge合并功能,将分支合并到主干中,这也是在团队软件开发中我们经常要使用的功能。
在TortoiseSVN的Revision Graph中可以查看trunk的版本变化图,如下:

从上图可以得出,在版本10的时候我们创建了分支版本/branches/v1.0,且SVN版本为11,在版本11基础上我们对分支进行了修改于是有了版本12,我们再对trunk下的文件进行修改于是有了版本13,整个SVN目前的版本就为13,这与我们刚才做的修改是相吻合的。
下面将分支v1.0合并到主干中。
按照我们目前的情况,选择第二种:

选择v1.0:

然后,如下:

在我们的这次合并中肯定会产生问题,因为我们对test.txt文件进行了两次修改,因而会产生冲突Conflict,但这在实践中是不应出现这种情况的,因为建立的分支目的就是修改那些在主干中不会被修改的文件,以便修改完成后合并到主干中。不过没关系,我们这里仅是演示而已,所以只需处理下冲突,手动的将其合并(这在实际中不应该这样否则失去了分支的用途了):

这个时候可以看到我们的test.txt文件已经按照我刚才手动处理冲突实现了:

然后将trunk签入到版本库中:

如果我们再去查看branches\v1.0下的test.txt文件它的内容依然是最初在trunk中编辑的内容。
另外再次强调一点:在实际操作中我们不会对一个分支文件在主干中再次进行修改,否则会造成一些冲突,这样就失去了分支的便利性了;Tag的创建与分支是类s似的,只不过Tag往往仅用于标识特定版本,而不会用于bug修复,增加新特性等情形。

转载于:https://www.cnblogs.com/servant/archive/2013/01/10/2854014.html

【转】SVN中的Branches分支以及Tags标签详解与应用举例相关推荐

  1. SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤

    一:使用场景: 假如你的项目(这里指的是手机客户端项目)的某个版本(例如1.0版本)已经完成开发.测试并已经上线了,接下来接到新的需求,新需求的开发需要修改多个文件中的代码,当需求已经开始开发一段时间 ...

  2. 【转】SVN trunk(主线) branch(分支) tag(标记) 用法详解和详细操作步骤

    转自:https://monday.blog.csdn.net/article/details/51122637 一:使用场景: 假如你的项目(这里指的是手机客户端项目)的某个版本(例如1.0版本)已 ...

  3. python中exec是什么意思_Python中的进程分支fork和exec详解

    在python中,任务并发一种方式是通过进程分支来实现的.在linux系统在,通过fork()方法来实现进程分支. 1.fork()调用后会创建一个新的子进程,这个子进程是原父进程的副本.子进程可以独 ...

  4. git 主干修改合并到分支_idea+git合并分支解决冲突及详解步骤

    Git分支详解参考: 分支管理组成 1.1.master主干 在版本管理中,代码库应该仅有一个主干.此主干是和当前生产保持一致的,是可用的.稳定的可直接发布的版本,不能再主干上进行任何开发操作.git ...

  5. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  6. R语言中如何计算C-Statistics?几种计算方法详解

    R语言中如何计算C-Statistics?几种计算方法详解 目录 R语言中如何计算C-Statistics? #包导入 #数据加载编码

  7. python中的class怎么用_对python 中class与变量的使用方法详解

    python中的变量定义是很灵活的,很容易搞混淆,特别是对于class的变量的定义,如何定义使用类里的变量是我们维护代码和保证代码稳定性的关键. #!/usr/bin/python #encoding ...

  8. java中sleep()、wait()相同与不同详解

    java中sleep().wait()相同与不同详解 相同 java中Thread#sleep和Object#wait方法都是暂停当前线程,当前线程让出CPU占用.并不存在调用sleep后还占用CPU ...

  9. python爬取图片-Python爬取网页中的图片(搜狗图片)详解

    前言 最近几天,研究了一下一直很好奇的爬虫算法.这里写一下最近几天的点点心得.下面进入正文: 你可能需要的工作环境: Python 3.6官网下载 本地下载 我们这里以sogou作为爬取的对象. 首先 ...

  10. object类中的equals与自定义equals方法详解

    object类中的equals与自定义equal方法详解 1.this怎么理解?this == obj表示什么? this就是当前你new出来的对象,这里指谁调用equal方法this指的就是谁,ob ...

最新文章

  1. sql实现random sample_web验证码的简单实现
  2. Smooth Delivery:如何减少网络拥塞?
  3. 走近中医 感受神奇
  4. 全球首发!惯性导航导论(剑桥大学)第六部分
  5. FreeRTOS内核实现04:空闲任务与阻塞延时
  6. 告别后端!阿里云小程序 Serverless 教你如何 30 分钟开发小程序!
  7. CN DBMove 过程中一些最常见最需要注意的问题
  8. ubuntu18.04 server配置静态ip
  9. C++11之 Move semantics(移动语义)(转)
  10. Android基于串口通讯笔记(USB,485协议,232协议)
  11. RGB,CMY(K),YUV,YIQ,YCbCr颜色的转换算法(java实现)
  12. 用VS新建多层架构时引用第三方dll 时清理解决方案时,放bin文件夹下的bll被清空问题
  13. 共享单车系统的软件测试报告,共享单车APP实验报告模板.docx
  14. tms570ls1224用ecap模式测het产生的pwm
  15. 详解ELF可执行文件格式:读取头部信息和程序表头
  16. consul服务注册中心
  17. 教务系统自动评教_新版正方教务管理系统自动评教脚本
  18. Electron桌面应用打包流程详情
  19. reverse()和reverse_copy()用法
  20. (附源码)电影选座订票app 毕业设计 011439

热门文章

  1. presto自定义UDF函数
  2. 招聘网站数百万条敏感数据泄露,简历、×××扫描件统统曝光
  3. cocos2d-x自制工具02:AnimatePacker v1.1beta发布!!~!
  4. android通过Canvas和Paint截取无锯齿圆形图片
  5. Keil/MDK(2):STM32堆栈使用情况分析
  6. 《移动平台开发实践》第2周作业
  7. 关于计算机的内存的一点常识
  8. [转载][翻译]Go的50坑:新Golang开发者要注意的陷阱、技巧和常见错误[1]
  9. 斗战神 拳猴刷图加点
  10. HTTP协议学习,post于get;用Fiddler测试请求