`
quanminchaoren
  • 浏览: 926818 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

SVN 分支及合并的介绍和实践

阅读更多
  • 写在前面
  • 一些相关的概念和原理
  • 进行分支开发的最佳实践
  • 合并的分类
  • 在 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、从主干到分支

 

 

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

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

 

2、从分支到主干

 

 

Svn代码
  1. svn merge --reintegrate ^/branches/quota  
svn merge --reintegrate ^/branches/quota

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

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

 

3、仅记录的合并

 

 

Svn代码
  1. svn merge -c  25  --record-only ^/trunk  
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 的基本原理。

 

『Version Control with Subversion』

官方手册,学习 SVN 必读。

分享到:
评论

相关推荐

    svn分支合并基本操作

    【SVN 分支合并基本操作】是软件开发中配置管理工具 Subversion (SVN) 的核心功能之一,它允许开发团队协同工作,各自在独立的分支上开发,然后将改动合并回主干,以保持代码的稳定性和一致性。以下是详细的操作步骤...

    SVN分支及合并使用文档.doc

    《SVN分支及合并使用详解》 版本控制系统Subversion(SVN)是软件开发中不可或缺的工具,尤其在团队协作中,分支与合并是其核心功能。本文将深入解析SVN的分支创建、管理和合并过程,帮助开发者更好地理解和运用这...

    TortoiseSVN 分支与合并操作

    在软件开发中,分支管理和合并是至关重要的功能,能够支持团队并行开发,同时保持代码的一致性和完整性。下面我们将详细探讨TortoiseSVN中的分支与合并操作。 ### 1. 创建分支 创建分支的主要目的是为了解耦开发...

    svn分主干合并,让你分主干合并立马搞定

    本文将详细解释如何执行 SVN 分支合并,特别是如何将开发分支合并到主干分支。 首先,创建主干分支是合并过程的起点。在提供的示例中,开发人员使用 `svn cp` 命令从主干创建了一个新的分支。这一步骤确保了开发...

    svn版本之间的合并问题

    4. **使用更高级的合并工具**:虽然SVN内置的合并工具已经相当强大,但在处理复杂的树冲突时,使用如TortoiseSVN或VisualSVN等图形界面工具可能会更加直观和高效。 5. **重置操作**:在某些情况下,完全清除目标...

    用SVN分支管理多版本

    ### SVN分支管理多版本知识点详解 #### 一、引言 在软件开发过程中,随着项目的迭代更新,如何高效地管理不同版本之间的代码成为了项目管理中的一个重要环节。Subversion(简称SVN)作为一款广泛使用的版本控制...

    SVN分支合并经验总结

    ### SVN分支合并经验总结 在软件开发过程中,版本控制系统如Subversion(SVN)是团队协作不可或缺的工具。其中,分支管理和合并策略是确保代码质量和维护项目稳定性的重要环节。本文将深入探讨在SVN中进行分支合并...

    SVN主干和分支操作

    - 可以选择从主干合并到分支、从分支合并到主干等不同操作。 - 根据需求选择合并选项,点击“OK”后会显示差异列表供用户确认。 #### 四、实践总结 通过上述步骤,我们可以有效地利用 SVN 进行项目的版本管理和...

    SVN合并操作说明

    本文档将详细介绍如何在SVN中执行合并操作以及解决可能出现的合并冲突。 首先,合并操作需要确定合并的方向,即是从分支(branch)合并到主干(trunk),还是从主干合并到分支。确定方向后,需要获取合并对象的版本...

    svn 合并、冲突及常用功能详解

    `svn merge`是Subversion(简称svn)中的关键命令,用于将一个分支或标记的修改合并到另一个分支。在版本控制系统中,合并是协同开发的核心操作,它允许团队成员同步各自的工作,避免代码冲突。以下是一些关于`svn ...

    SVN如何建立版本分支

    #### 三、SVN分支管理的最佳实践 1. **明确命名规则**:为每个分支和标签指定清晰且有意义的名称,有助于提高团队成员之间的沟通效率。 2. **定期同步**:定期将主分支(`trunk`)的最新更改合并到功能分支(`branch`)...

    svn创建分支的做法.rar

    为了避免大量冲突,建议频繁地从主分支合并,而不是等到开发结束时一次性合并。 2. **明确的分支策略** 设计清晰的分支策略,比如为每个功能或修复创建单独的分支,便于管理和跟踪。 3. **测试合并** 在合并前...

    SVN经验之谈【最佳实践】.doc

    SVN(Subversion)是一种广泛使用的版本控制系统,用于管理和跟踪源代码和其他文件的变更。...以上就是SVN使用的一些最佳实践和关键知识点,遵循这些原则,可以有效管理团队的代码版本并提高协作效率。

    SVN安装和深入理解分支和模拟实践

    目录如下: 一、下载和安装 二、配置和使用方法【服务器端】 ...四、测试主干和分支合并 1、测试号1 2、测试号2 3、测试号3 4、测试号4 五、发布稳定版本到tags 六、实际开发和发布约定 七、友情提示 八、参考

    ant相关-svn-分支

    当开发者从不同的分支进行开发时,这个任务会确保本地代码与选定的SVN分支同步。同样,如果需要合并分支,可以使用`svn-checkout`任务切换到目标分支。 在自动集成环境中,我们还可能需要设置自动测试和构建的逻辑...

    svn 版本管理,分支/标记配置,创建

    通过《SVN 分支与合并.doc》和《用SVN分支管理多版本.pdf》文档,您可以更深入地了解分支和标记的实战操作,包括更复杂的合并策略和团队协作的最佳实践。 总之,svn的分支和标记机制为软件开发提供了灵活的版本控制...

Global site tag (gtag.js) - Google Analytics