第一种情况:当代码还未提交时
这种情况下,使用 svn revert 就能取消之前的修改。
# svn revert [-R] somefile
其中somefile可以是(目录或文件的)相对路径也可以是绝对路径。
当somefile为单个文件时,直接svn revert somefile就行了;
当somefile为目录时,需要加上参数-R(Recursive,递归),否则只会将somefile这个目录改动。
在这种情况下也可以使用svn update命令来取消对之前的修改,但不建议使用。因为svn update会去连接仓库服务器,耗费时间。
注意:svn revert本身有固有的危险,因为它的目的是放弃未提交的修改。一旦你选择了恢复,Subversion没有方法找回未提交的修改。
第二种情况:改动已经被提交
这种情况下,用svn merge命令来进行回滚,回滚的操作过程如下:
1、保证我们拿到的是最新代码:
svn update
假设最新版本号是28。
2、然后找出要回滚的确切版本号:
svn log [somefile]
如果log很多,可以使用参数--limit
svn log --limit 10 [somefile]
假设根据svn log日志查出要回滚的版本号是25,此处的somefile可以是文件、目录或整个项目
如果想要更详细的了解情况,可以使用
svn diff -r 28:25 [somefile]
3、回滚到版本号25:
svn merge -r 28:25 [somefile]
为了保险起见,再次确认回滚的结果:
svn diff [somefile]
发现正确无误,提交。
4、提交回滚:
svn commit -m "Revert revision from r28 to r25,because of ..."
提交后版本变成了29。
将以上操作总结为三条如下:
1. svn update,svn log,找到最新版本(latest revision)
2. 找到自己想要回滚的版本号(rollback revision)
3. 用svn merge来回滚: svn merge -r 28:25 somefile
注意:虽然 svn up -r 25 somefile 也可以使文件回滚,但是当提交时由于不是最新版本而无法提交,还需要先更新,拷贝,再提交,所以不建议使用。
补充:
svn忽略文件或文件夹
svn propset svn:ignore '*' template_c/
三、switch的理解
switch用于在同一个版本库内不同分支之间的切换
relocate用于版本库访问地址变更时,重新定位版本库
比如,由于SVN服务器更换到另一台主机上,这是SVN服务器的地址改变了,那么各客户端就无法连接SVN服务器了,这时各客户端就需要执行relocate,将本地工作区的连接到新的服务器上去
而如果同一个版本库内,如果有多个分支,比如你现在正在trunk上开发,但需要切换到某个分支上开发,那么你可以用switch来进行这个切换操作,这时SVN会比较trunk和这个分支之间的差异,将差异部分传送到你的本地工作区,而不用将整个分支传送给你,从而避免巨量数据的传输。switch操作之后,你所进行的update、commit操作都变成了针对那个分支,当你在分支上的工作完成后,还可以再次switch回trunk。
switch还有另外一些用途,比如希望让分支中的某个文件夹保持和trunk同步,因为有人正在trunk的这个文件夹中进行开发,在分支中想用到开发的最新成果,那么就可以在分支的这个文件夹上设置swtich到trunk,这时update整个分支的话,就会把trunk上的这个文件夹取下来了。但是,当然你如果修改了这个文件夹的内容,commit后也是提交到了主干而不是提交到了分支。
本文转自shayang8851CTO博客,原文链接:http://blog.51cto.com/janephp/1300561,如需转载请自行联系原作者