SVN分支与合并

合并的分类

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 而已,但直接修改太危险了,所以弄了这样一个所谓合并来规范操作。

进行分支开发的最佳实践

· 做分支上做开发的时候,必须定期使分支与主干同步,避免开发完成后合并(merge)回主干时出现严重冲突(confict)。

· 进行合并前,处理掉工作副本上的所有本地修改,方便合并失败时进行回滚(revert)。

· 进行合并时,特别注意 新增/删除 操作,因为很多冲突都是这类操作引起的。

· 完成一个分支的功能并合并回主干后,抛弃该分支,后续其它功能的开发使用新建的分支。当然,也有办法继续使用该分支。

你可能感兴趣的:(SVN分支与合并)