三、SVN版本管理-代码回滚
之前讲过根据需求号把代码合并到其他的分支,比如把需求A-1对应的代码更改从开发分支DEV合并到测试分支DAT。这篇文件将会讲解如何把A-1需求对应的代码从DAT分支剔除掉,也就是常说的代码回滚。
代码回滚和代码合并的本质区别在于,合并是两个分支之间的事,而回滚只是一个分支自己的事。然而对于SVN来说,无论是做什么操作,版本一直都是再增长,不会回退,那么该如何实现版本增长的同时,代码回退呢?其实很简单,一条反向merge命令便搞定了:
svn merge -r 5:2 localDir svnUrl --username *** --password *** --non-interactive --no-auth-cache
localDir是svn分支的本地工作副本,svnUrl是svn分支的远程地址,合并的版本号区间是-r 5:2 是指把svn分支从4版本号对应的代码回退到2版本号对应的代码。
下面来详细讲解回滚的全过程:
首先看一张图:
image.png
从这张图可以看出,假设我们现在DAT分支有一个需求A-1需要做代码回滚,那么首先是要根据A-1这个需求号拿到对应的版本号区间(跟代码合并一样,都是根据commit log拿到需求号对应的版本号区间),然后对版本号区间做一个倒序排序,假如我们拿到的版本号排序之后是4、3、2三个版本号,那么回滚的命令中的版本号区间就是
svn merge -r 5:2
如果A-1对应的版本号区间是4、2、1三个版本号,那么回滚命令便是如下格式
svn merge -r 5:4 -r 3:1
版本号区间组装完毕之后,就要开始做真正的回滚了吗?跟合并一样,都要先做一次预回滚,也就是再回滚命令中加上参数:
--dry-run
需要注意的是,--dry-run参数在一些复杂场景下结果是不准确的。但是这种不准确只会把没有冲突的代码认为是冲突而误报出来,是绝对不会把有冲突的代码认为没有冲突的。所以这个参数使用与否,自己衡量利弊。
预回滚之后,如果没有冲突,便可以做真正的回滚了。执行merge命令回滚完之后,只是在本地工作副本生效了,所以还需要做一次commit操作。
总结
至此,一个完整的根据需求号做代码回滚的操作便完成了。
前面写过两篇帖子,讲如何根据需求号做代码合并。今天又写了代码的回滚。形成了一个版本管理的闭环。这些文章可能对于手动做合并和回滚的朋友没有太大帮助,但是现在什么都讲求自动化,有了这些东西,相信无论用什么语言,写一个自动化的版本管理工具都是轻而易举的。