posts - 262,  comments - 221,  trackbacks - 0
【13】撤销本地的修改
在每次提交版本之前,我们都需要先update一下本地的版本,检查本地文件是否已经版本过低(out-of-date)。这时我们通常会发现:

 A.有些本地修改和版本库的修改发生了冲突,且必须以版本库的为准
 B.有些本地修改是不必要的

面对这些问题,我们的第一想法就是把被修改的文件恢复到修改前的样子。但是如果被修改的文件修改点很分散,或者数量众多,甚至我们忘记了备份原有的文件....那么应该怎么办?有没有一种方法可以帮我们一次性地将对某个文件所做的全部修改都复原?有!这就是svn revert命令。

svn revert命令用于回滚本地尚未提交的任何操作(例如add, delete操作),文件或目录的内容,甚至属性的修改。

实际上svn revert命令是一把“双刃剑”。它有几个需要特别小心的地方:

 A.回滚是不可恢复的。由于svn revert回滚的是任何未提交的操作,内容,属性。所以意味着SVN不会为你保存任何回滚前的历史版本

 B.回滚是不止于一点而是一段时间的。只要你没有提交版本,那么不论你多久之前所做的修改都会被回滚,而不仅仅是最近一次的修改

 C.鉴于svn revert命令如此危险的特性,所以svn revert命令强制使用者必须给出一个明确的路径参数,不允许svn revert这样的命令执行。

下面我们逐个来看revert是如何进行的:

●回滚文件的内容
  
假设现在我们的ECoupon项目下有文件如下
C:\>svn list E:\Temp\ECoupon
WebRoot
/
doc
/
src
/
read
-from-repo.txt
read
-from-wc.txt

我们修改read-from-wc.txt文件,在其末尾增加一句话:Will revert by "svn revert" command。现在我们来看本地的差异比较

C:\>svn status E:\Temp\ECoupon
M      E:\Temp\ECoupon\read
-from-wc.txt

C:\
>svn diff E:\Temp\ECoupon\read-from-wc.txt
Index: E:
/Temp/ECoupon/read-from-wc.txt
=======================================================
--- E:/Temp/ECoupon/read-from-wc.txt    (revision 18)
+++ E:/Temp/ECoupon/read-from-wc.txt    (working copy)
@@ 
-0,0 +1 @@
+Will revert by "svn revert" command。
\ No newline at end of file

我们看到svn status命令显示本地的文件已经被改变(M),而且svn diff命令展示了这次改变的内容就是增加了(+)了“Will revert by "svn revert" command。”这句话(关于svn diff命令的使用会在后面讲解)。现在我们来回滚这个文件的内容

C:\>svn revert E:\Temp\ECoupon\read-from-wc.txt
Reverted 
'E:\Temp\ECoupon\read-from-wc.txt'

C:\
>svn cat E:\Temp\ECoupon\read-from-wc.txt

可以看到svn revert确实把本地修改的内容回滚了。那么它是如何知道应该回滚到那个版本的呢?答案就是靠本地工作副本每个目录下的那个.svn目录。在这个目录下存储了我们每次的本地修改,执行svn revert后SVN会从这里取得上一个版本的信息,然后回滚。

那么svn revert命令能够一次性回滚多个文件内容的修改吗?
C:\>svn status E:\Temp\ECoupon
M      E:\Temp\ECoupon\read
-from-wc.txt
M      E:\Temp\ECoupon\read
-from-repo.txt

C:\
>svn revert E:\Temp\ECoupon\read-from-wc.txt E:\Temp\ECoupon\read-from-repo.txt
Reverted 
'E:\Temp\ECoupon\read-from-wc.txt'
Reverted 
'E:\Temp\ECoupon\read-from-repo.txt'

C:\
>svn status E:\Temp\ECoupon

C:\
>

事实证明一次回滚多个文件也是可以的。那么对于整个目录呢?像上面的要求我们还有更简便的做法,请看下面
C:\>svn status E:\Temp\ECoupon
M      E:\Temp\ECoupon\read
-from-wc.txt
M      E:\Temp\ECoupon\read
-from-repo.txt

C:\
>svn revert E:\Temp\ECoupon --depth=infinity
Reverted 
'E:\Temp\ECoupon\read-from-wc.txt'
Reverted 
'E:\Temp\ECoupon\read-from-repo.txt'

C:\
>svn status E:\Temp\ECoupon

C:\
>

这次的操作有两个不同的地方:
 A.我们不是指定到具体的两个文件,而是指定到文件所在的目录
 B.我们增加了一个--depth=infinity参数

这就是svn revet命令的简便之处,如果确定要回滚的内容都在同一个目录下,我们就可以一次性地回滚。

参数--depth是svn命令的一个全局参数,用于限制命令执行的范围。可选项包括:empty,file,immediate,infinity。
 

-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要尽力打好一手烂牌。
posted on 2009-12-09 09:47 Paul Lin 阅读(733) 评论(0)  编辑  收藏 所属分类: 项目管理

只有注册用户登录后才能发表评论。


网站导航:
 
<2009年12月>
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

常用链接

留言簿(21)

随笔分类

随笔档案

BlogJava热点博客

好友博客

搜索

  •  

最新评论

阅读排行榜

评论排行榜