概述
前几天我遇到了如何在GIT下放弃本地所做的修改的问题,并写了一篇博客来整理其中的思路,详见(玩转GIT系列之【如何放弃本地/服务器端所做的修改】)。但是今天,我在SVN下遇到了同样的问题,而且是linux系统下命令行的SVN,不是windows系统下的图形界面。所以,一切还是得靠命令来解决,具体来说要分以下几种情况来区别对待:
第一种情况:放弃本地的修改内容
也就是说,你所做的修改仍然是在本地,尚未提交到服务器端。这种情况下,使用“svn revert”命令就能取消之前的修改。用法如下:
svn revert [-R] target
其中target是你需要放弃修改(即还原成服务器版本)的目录或文件。
- 当target为单个文件时,直接“svn revert target”就行了;
- 当target为某个目录时,需要加上参数-R(Recursive,递归),否则只会针对target根目录进行处理,而不会处理它下面的子目录。
比如:想要放弃整个工程里所有的修改内容,则可以在整个工程的根目录下执行下述命令:
svn revert -R *
注意:一旦使用了这个命令,就意味着你完全放弃本地所做的修改,这些文件的内容将会被彻底还原成服务器端的版本。而这种放弃不可撤销的,是找不回来的,这一点请注意!
特别说明:此处的revert命令,只是针对之前就已经存在的那些文件。如果你本次还新增了一些文件,则revert命令并不会将你新增的文件删除或者清空,仍需你自己手动操作。经过摸索,我找到了一个命令可以完成这个任务,也就是说,可以自动删除那些你新增的、但是尚未提交的文件。亲测可用,大家如果有需要可以拿去用:
svn st | grep '^?' | awk '{print $2}' | xargs rm -rf
划重点:
总结一下就是,如果你修改了若干文件,同时还新增了一些文件,然后突然想放弃所有的操作,将所有代码恢复原样,那么则可以采取以下命令组合:
svn revert -R * # 对已经存在的文件,恢复原样
svn st | grep '^?' | awk '{print $2}' | xargs rm -rf # 对本次新增的文件,全部删除
特别说明:
以上方法,经本人反复尝试,在实际应用中存在一些未知的风险,请谨慎使用。具体的现象描述如下:
1、从SVN上克隆一个linux系统的代码仓库至本地,编译完毕,所有一切正常;
2、执行“svn revert -R *”命令,再次编译,所有一切依旧正常;
3、执行“svn revert -R *”之后接着执行“svn st | grep ‘^?’ | awk ‘{print $2}’ | xargs rm -rf”命令,再次编译,出现问题,编译生成的image文件异常(表现为内容偏大,原本是3.99M,现变为4.99M,原因未知);
上述现象可反复重现,但是原因未知,将其记录在此处,待日后若有结论再行补充。
第二种情况:放弃服务器端的修改内容
也就是说,你所做的修改已经被提交到了服务器上了。这种情况下,只能用“svn merge”命令来进行版本回滚。回滚的操作过程如下:
1、首先保证我们拿到的是最新代码
svn update
假设最新版本号是28。
2、然后找出要回滚的确切版本号
svn log [something]
假设根据svn log日志查出要回滚的版本号是25,此处的something可以是文件、目录或整个项目。如果想要更详细的了解情况,可以使用svn diff -r 28:25 [something]。
3、回滚到版本号25
svn merge -r 28:25 something
为了保险起见,再次确认回滚的结果:
svn diff [something]
确认正确无误,方可提交。
4、提交回滚之后的内容
svn commit -m "Revert revision from r28 to r25, because of ..."
提交后版本变成了29。
总之,将以上操作总结为三条如下:
- svn update,svn log,找到最新版本(latest revision);
- 找到自己想要回滚的版本号(rollbak revision);
- 用svn merge来回滚: svn merge -r : something;
收工!
最后
以上就是光亮寒风为你收集整理的玩转SVN系列之【如何放弃本地/服务器端所做的修改】的全部内容,希望文章能够帮你解决玩转SVN系列之【如何放弃本地/服务器端所做的修改】所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复