• 写在前面
  • 一些相关的概念和原理
  • 进行分支开发的最佳实践
  • 合并的分类
  • 在 Eclipse 中进行合并操作
  • 相关资源

写在前面

本文是由演讲整理而来的,介绍了 SVN 分支与合并的概念、流程和一些实际操作方法,适合对版本控制有基本认识然后想了解 SVN 分支与合并的使用方法的读者。

对应 SVN 版本最低为 1.5,因为分支、合并的很多功能都是 1.5(release notes ) 才加进来的。

一些相关的概念和原理

  • 分支(branch)和标记(tag)对于 SVN 来说就只是副本(copy),没有任何其它意义。分支和标记的意义是我们人为给予的。
  • SVN 的副本是通过"cheap copies "来实现的,建立一个副本就类似 Unix 中创建一个硬链接(hard link),空间和时间的消耗都是固定并且很小的,因此不必太过担心副本太多而导致性能问题。
  • SVN 的文件储存 是通过差异(diff)来实现的,底层储存方法有两种:1、Berkeley DB,完整保存一个文件的最新版本(revision),旧版本通过反向差异(reverse diffs)来获取。2、FSFS,跟 BDB 相反,完整保存一个文件的初始版本,后续版本通过正向差异来获取。当然,为了避免版本太多而造成性能下降,SVN 还使用了"skip-deltas "来减少需要追溯的版本数。
  • SVN 属性(property )可以附带在文件、目录和版本(revision)上。文件和目录的属性类似文件内容,会被记录进版本库中的,例如每次提交时的注释,其实就是该版本的一个属性 svn:log。以"svn:"开头的属性是系统预留的,用户不应该自定义这样的属性。

进行分支开发的最佳实践

  • 做分支上做开发的时候,必须定期使分支与主干同步,避免开发完成后合并(merge)回主干时出现严重冲突(confict)。
  • 进行合并前,处理掉工作副本上的所有本地修改,方便合并失败时进行回滚(revert)。
  • 进行合并时,特别注意 新增/删除 操作,因为很多冲突都是这类操作引起的。
  • 完成一个分支的功能并合并回主干后,抛弃该分支,后续其它功能的开发使用新建的分支。当然,也有办法继续使用该分支。

合并的分类

1、从主干到分支

  1. svn merge [-r M:N] ^/trunk

假设"^/trunk"是主干的 URL,当前目录为分支的工作副本。该命令同步主干的最新修改到当前工作副本,用于使分支跟主干保持同步。SVN 会通过 svn:mergeinfo 属性来记录当前工作副本已经合并过的版本号,然后在每次合并时选择合适的(eligible)版本进行合并。当然,也可以自己手动指定合并版本M到N的修改。

2、从分支到主干

  1. svn merge --reintegrate ^/branches/quota

假设"^/branches/quota"是分支的 URL,当前目录为主干的工作副本。该命令将分支的最新版本(@HEAD)跟主干的最新版本进行比较,将差异实施到当前工作副本,用于将在分支上完成的工作合并回主干。

分支使用 --reintegrate 合并回主干后,如果继续在该分支上开发,当需要同步主干的修改到分支过来时,默认会包括之前 reintegrate 的修改,而这些修改已经在分支上做过了,所以这样往往会导致冲突。这也是前面“最佳实践”中最后一个建议的一个原因。当然,想要使这个分支继续可用也是可以的,这就需要使用下面这第三种合并。

3、仅记录的合并

  1. svn merge -c 25 --record-only ^/trunk

假设当前目录为分支的工作副本,该命令将主干的版本25标记为已合并到当前工作副本,但并不会进行实质性的合并,这样下次合并主干到分支时,该版本的修改就会被跳过,避免修改被重复实施导致的冲突。其实这种合并就是改一下 svn:mergeinfo 而已,但直接修改太危险了,所以弄了这样一个所谓合并来规范操作。

在 Eclipse 中进行合并操作

Subclipse

在 Eclipse 中有两个比较流行的 SVN 插件:Subclipse 和 Subversive,关于两者的讨论有很多,例如这里 。本文只介绍 Subclipse。

上图是 Subclipse 进行合并操作时的界面,该图所对应的操作是:将 trunk 上版本 8 至今的修改同步到工作副本 pearbranch,也就是分支 branches/quake。这里可以发现几个问题:

  • 不能进行自动合并,必须手工指定版本号。
  • 不能进行仅记录的合并
  • 不能直接进行 --reintegrate 的合并

CollabNet Merge Client

上述 Subclipse 的不足,应该是因为 Subclipse 默认的合并实现是基于 SVN 1.4 之前的,那时还没有 svn:mergeinfo、--reintegrate 和 --record-only 呢。要支持这些 1.5 的新特性,可以安装 CollabNet Merge Client。

CollabNet Merge Client 是 Subclipse 的一个可选功能,其实就是一个增强的、支持新特性的合并实现,如上图所示,它的优点有:

  • 支持合并信息自动跟踪和自动合并
  • 支持 --reintegrate 和 --record-only
  • 合并前能对工作副本进行检查

相关资源

SVN 设计思想

主要是看 Bubble-Up Method 这一节,是 revision 的基本原理。

SVN 分支及合并的介绍和实践---命令行的更多相关文章

  1. SVN分支与合并【超详细的图文教程】(转载)

    SVN分支与合并 一. 分支与合并的概念 二. SVN分支的意义 三. 如何创建分支与合并分支 一.分支与合并的概念: 分支:版本控制系统的一个特性是能够把各种修改分离出来放在开发品的一个分割线上.这 ...

  2. 详细说明svn分支与合并---命令行

    一,svn分支与合并有什么用? 作程序的,对svn在熟悉不过了,但对svn分支熟悉的,我想并不多.因为一般情况下,是用不着svn分支的,其实也没有那个必要.下面我例举几个需要用到svn分支的情况: 1 ...

  3. 详细说明svn分支与合并,以及实例

    详细说明svn分支与合并,以及实例 一,svn分支与合并有什么用? 作程序的,对svn在熟悉不过了,但对svn分支熟悉的,我想并不多.因为一般情况下,是用不着svn分支的,其实也没有那个必要.下面我例 ...

  4. 实例讲解SVN分支和合并问题(转)

    本节向大家简单描述一下SVN分支和合并方面的知识,在学习SVN的过程中SVN分支和合并时经常遇到的问题,在这里和大家分享一下,希望本文对大家有用. 关于主线同SVN分支合并的概念及如何使用的误区此问题 ...

  5. SVN 分支代码合并到主线

    SVN 分支代码合并到主线 步骤一安装TortoiseSVN 客户端,在本地 checkout主线代码 步骤二:创建branches分支 步骤三.branches修改提交代码 步骤四:分支代码合并到主 ...

  6. SVN分支的合并和同步

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

  7. (转)myeclipse插件—SVN分支与合并详解【图】

    svn作为版本控制软件被广泛用于众多公司的开发团队中,最多的场景就是一个项目上传svn后,一个组内的小伙伴在上边提交和更新代码以及解决冲突,其实这只是发挥了svn的很小的一部分功能. 先稍微介绍一下s ...

  8. myeclipse使用SVN分支与合并详解

    此博文主要内容来源地址:https://blog.csdn.net/liuyifeng1920/article/details/53118183,感谢原创博主: 先介绍一下svn的两种开发和发布的规范 ...

  9. eclipse svn分支与合并操作

    以前做项目的时候没有用过svn的分支合并操作,今天用到了,刚开始还真不会啊.最后查了下就是这么的方便.专门记录下来. 原文来自:http://blog.csdn.net/lisq037/article ...

随机推荐

  1. Matlab位运算操作

    本文为转载他人文章: bitand 按位与操作 a = 7; b = bitand(10,a); disp(dec2bin(a,8)); %ans = 00000111 disp(dec2bin(b, ...

  2. spring ioc 原理 spring aop原理

    大家一直都说spring的IOC如何如何的强大,其实我倒觉得不是IOC如何的强大,说白了IOC其实也非常的简单.我们先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对 ...

  3. 关于sql where id in 转换成数据类型 int 时失败(转)

    有执行sql条件语句where id in(@参数)的时候,如果处理不当,就会出现问题:如下面这个存储过程: alter proc Web_gettwtwgoldgameserverGoldSell@ ...

  4. 关于kafka连接不上别的机器问题Connection refused

    1.确认config里面的server.properties 正确(包括IP+端口2181记得看清,用hostname的话记得etc/hostnames下面查看全部配置上没,建议用hostname方便 ...

  5. Sublime Text3快捷方式与使用技巧

    Sublime Text 3 快捷键精华版 Ctrl+Shift+P:  打开命令面板Ctrl+P:  搜索项目中的文件Ctrl+G: 跳转到第几行Ctrl+W: 关闭当前打开文件Ctrl+Shift ...

  6. 【转】SocketRocket:iOS WebSocket客户端开源框架

    原文网址:http://blog.csdn.net/zmp1123/article/details/44015507 WebSocket: WebSocket通信协议实现的是基于浏览器的原生socke ...

  7. POI Workbook接口和HSSFWorkbook对象和XSSFWorkbook对象操作相应excel版本

    由于HSSFWorkbook只能操作excel2003一下版本,XSSFWorkbook只能操作excel2007以上版本,所以利用Workbook接口创建对应的对象操作excel来处理兼容性 @Te ...

  8. jQuery UI 对话框(Dialog) - 模态表单

    <!doctype html><html lang="en"><head> <meta charset="utf-8" ...

  9. 斐波那契数列PHP非递归数组实现

    概念: 斐波那契数列即表达式为 a(n) = a(n-1)+a(n-2) 其中 a1 =0 a2 = 1  的数列 代码实现功能: 该类实现初始化给出n,通过调用getValue函数得出a(n)的值 ...

  10. 怎么用OCR图文识别软件在MS Office中创建PDF文件

    ABBYY PDF Transformer+是一款可创建.编辑及将PDF文件转换为其他可编辑格式的OCR图文识别软件,不仅可以从纸质文档.图像文件和任何其他流行格式创建PDF文件(相关文章请参考如何从 ...