svn中的revert和update
今天有人问到revert和update的问题。刚开始还真被问住了。因为感觉revert和update都可以将本地的copy更新到以前的一个版本,会有什么不同呢?
查了些资料,并做了个试验,终于发现了它们的不同。
假设当前的最新版本是6,但是,最新的一次提交不是你想要的,也就是想把版本为6的修改干掉,下面来看看如何分辨用revert和update来实现。
一、使用revert
保证本地copy为最新版本,即版本6.
将本地copy revert到版本5.
将本地copy commit。
二、使用update
将本地copy update到版本5.这个时候是没办法直接提交的,因为你的修改不是在最新的版本上进行的。需要把版本5做个备份,然后check out版本6.通过文件比较工具将版本6的本地copy修改为与版本5的本地copy一致。然后将版本6的本地copy提交。
三、本质区别
可见,revert与update的本质区别是,revert是在本地copy原来版本的基础上进行的修改,若原来本地copy的版本为最新,可以直接commit;update只是将本地copy更新到一个指定的版本,若更新到的不是最新版本,不能进行commit。
可见revert就是回退修改,但版本保持不变;update是将本地copy更新到一个指定的版本。
看看帮助文档中的说明。
`[revert]
revert: Restore pristine working copy file (undo most local edits).
usage: revert PATH...
Note: this subcommand does not require network access, and resolves
any conflicted states. However, it does not restore removed directories.
[update]
update (up): Bring changes from the repository into the working copy.
usage: update [PATH...]
If no revision is given, bring working copy up-to-date with HEAD rev.
Else synchronize working copy to revision given by -r.
For each updated item a line will start with a character reporting the
action taken. These characters have the following meaning:
A Added
D Deleted
U Updated
C Conflict
G Merged
E Existed
A character in the first column signifies an update to the actual file,
while updates to the file's properties are shown in the second column.
A 'B' in the third column signifies that the lock for the file has
been broken or stolen.
If --force is used, unversioned obstructing paths in the working
copy do not automatically cause a failure if the update attempts to
add the same path. If the obstructing path is the same type (file
or directory) as the corresponding path in the repository it becomes
versioned but its contents are left 'as-is' in the working copy.
This means that an obstructing directory's unversioned children may
also obstruct and become versioned. For files, any content differences
between the obstruction and the repository are treated like a local
modification to the working copy. All properties from the repository
are applied to the obstructing path. Obstructing paths are reported
in the first column with code 'E'.
Use the --set-depth option to set a new working copy depth on the
targets of this operation.`
四、Revert to this revision和Revert changes from this revision
譬如有个文件,有十个版本,假定版本号是1,2,3,4,5,6,7,8,9,10。
Revert to this revision: 如果是在版本6这里点击“Revert to this revision”,表示7~10的修改全部作废,历史倒退到了版本6那个年代。
Revert changes from this revision:如果是在版本6这里点击“Revert changes from this revision”,表示版本6这个历史事件被抹杀了,只剩下除版本6外的9个历史事件了。
如果俺是同时选择了6,7,8三个历史时期并点击“Revert changes from this revision”,表示抹杀6~8这仨历史时期。
同理,如果同时选择7~10,然后点击“Revert changes from this revision”,则效果跟在版本6这里点击“Revert to this revision”是一样的。
五:Revert to this revision和Update Item to revision
update的意思是更新,revert的意思是撤销。
更新至某一个版本的意思是获取版本库中的某一个特定的版本到工作拷贝里。需要注意的是,如果你在上面做修改的话,那么你是在基于旧版本的基础上做修改,当你提交的时候SVN会提示你您当前工作拷贝版本已经过期(即不是基于版本库最新版本来做修改的),这个时候你必须先update到最新版本。
这个功能一般是用于获取一份只读拷贝用,例如你有一个工程用到了某个版本的dll,有一天有人把dll修改了并且提交了,然后你update到最新版本时发现编译不通过了,这个时候如果你想暂时先使用旧版本的话,那么你可以使用update to this revision的功能。
revert的功能主要用来进行版本库回滚用的,当你发现某个版本的文件不是很好想恢复到某个特定版本,这时你就可以使用这个功能。
选择Revert to this revision,这个时候,会将你工作拷贝里面该文件回滚到这个版本(相当于你在最新版本上面不断的ctrl-z撤销,而版本号还是最新的版本号,然后你所做的修改还是相当于基于最新版本所做的修改),然后你就可以在这个版本上面进行修改,然后再提交了。或者直接提交也可以。注意:回滚只是将工作拷贝的回滚到某个版本,而不是更新版本库,只有当你回滚之后再次提交版本库才会更新,别人再次update的时候才能得到你回滚的版本。