SVN分支与合并

摘要:
分支开发的最佳实践在分支上开发时,必须定期将分支与主干同步,以避免在开发后合并回主干时发生严重冲突。SVN将通过SVN:merginfo属性记录当前工作副本的合并版本号,然后为每个合并选择合适的版本。

一些相关的概念和原理

· 分支(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、从主干到分支(如果使用小乌龟选择第一项)

clip_image002

Svn代码

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

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

2、从分支到主干(如果使用小乌龟选择第二项)

clip_image004

Svn代码

svn merge --reintegrate ^/branches/quota 

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

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

这里要注意的是:假如分支的起始版本号是1000,现在主干上是2000,我们想合并主干的修改到分支,我们必须svn merge [-r 1000:2000] ^/trunk ,不能只合并比如1500到2000,否则在合并会主干时会有很大的问题。当出现这个问题时会提示分值上一些版本丢失,这个时候我们必须在这样在分值上做一边svn merge [-r 1000:2000] ^/trunk,然后在reintegration回trunk

3、仅记录的合并

clip_image006

Svn代码

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

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

免责声明:文章转载自《SVN分支与合并》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【thinkPHP5实现文件上传】DataTable需要注意点整理下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

node获取代码的svn版本号,并打包的时候,输出指定文件到打包后的项目里面

1、需要安装generate-asset-webpack-plugin插件,npm install generate-asset-webpack-plugin --save-dev 2、配置 webpack.prod.config.js 文件,让其打包的时候输出可配置的文件 3、在我们输入 npm run build 打包之后,在根目录就会生成versio...

1、SVN之SVN服务器防火墙设置

链接来自:https://blog.csdn.net/weixin_42171170/article/details/106957543(学习用) 前言   在现在这个网络越发便捷的社会,各种网络勒索病毒层出不穷,即使是Google浏览器也是在不断的更新版本修复漏洞。很多人认为只有Windows系统才容易中病毒,若使用Linux系统就不容易中病毒,经常让自...

如何删除本地项目文件中的.svn文件

在使用svn时,有时不小心错下载了文件,或者文件出现问题,需要删除 .svn文件,如果文件夹很多,一个一个手动删除,非常麻烦,网上终于找到了一个简单的方法,现分享。 久而久之,SVN文件夹下会有许多.svn的“meta数据”。这些数据久而久之会带来不少麻烦。尤其是基于资源管理器交互的Windows系统。 今天看了Jon Galloway的一个注册表脚本,十...

git rebase简介(基本篇)

原文: http://gitbook.liuhui998.com/4_2.html 一、基本 git rebase用于把一个分支的修改合并到当前分支。 假设你现在基于远程分支"origin",创建一个叫"mywork"的分支。 $ git checkout -b mywork origin 假设远程分支"origin"已经有了2个提交,如图   现在...

Myeclipse下安装和使用SVN(一)

           最近做毕业设计花了两天的时间做的,突然发现思路错了,可以有更好的办法。没有办法我就开始删了,好不容易还原了,发现其他原来没有错的地方有错了,而且还是一个莫名其妙的错误,但是还原过去又是不可能的了。谁叫我没有安装SVN呢。于是我便决定了来学习学习SVN。            一、SVN简介           1.1、  什么是SVN...

解决SVN 被锁且Cleanup无效问题

  开发两年多,依然用svn做代码管理工具,看到隔壁java组用git,心向往之,奈何苦苦不得机会,既然用svn,那么就说一说svn碰到的问题如何解决吧。   有时候我们在提交,或者更新代码时,由于网络或其他问题导致操作中断,出现svn被锁的情况,通常提示:   Error : Working copy 'xxxxxx' locked.   Error :...