回滚本地工作副本的修改(未提交)
如果你在工作副本上做了一些修改,但还没有 commit,想要撤销这些修改,回到上次 update 后的状态。

撤销单个文件的修改
如果你想放弃对某个文件的修改,恢复到它上次 update 的状态。
命令:
svn revert <文件路径>
示例:
# 撤销对 src/main.c 文件的修改 svn revert src/main.c
提示:

svn revert是一个本地操作,不会与服务器通信。- 它会永久性删除你对工作副本所做的所有未提交的修改,无法通过
svn status恢复,所以请谨慎使用。
撤销整个目录的修改
如果你想放弃整个目录下所有文件的未提交修改。
命令:
svn revert <目录路径>
示例:
# 撤销整个 'project/trunk' 目录下的所有未提交修改 svn revert project/trunk
查看即将被 revert 的修改(安全起见)
在执行 revert 之前,你可以先用 svn diff 查看具体的修改内容,确保回滚的是正确的修改。

命令:
svn diff <文件或目录路径>
撤销已提交的修改(最常见的需求)
这是 SVN 回滚中最常见也最关键的场景,你已经将错误的修改 commit 到了服务器,现在需要撤销这次提交。
SVN 没有一个直接“删除”历史提交的命令,因为它会破坏版本历史,正确的做法是创建一个新的“反向提交”(反向补丁)来抵消之前的错误提交。
svn merge + svn commit (推荐方法)
这是最标准、最安全的方法,因为它不会破坏历史记录,只是在历史中增加了一个新的、正确的提交。
步骤:
-
确定要回滚的版本号 假设你的错误提交是版本
1234,你需要知道这个版本的修订号。 -
更新到最新版本 确保你的工作副本是最新的,避免与其他人的修改冲突。
svn update
-
执行反向合并 使用
svn merge将版本1234的修改反向应用到你的工作副本上,这会生成一个与原修改相反的“补丁”。# 语法:svn merge -r <结束版本>:<起始版本> <URL或路径> # 回滚版本 1234 的修改,相当于合并 1233 到 1234 的反向变化 svn merge -r 1234:1233 https://svn.example.com/project/trunk
-r 1234:1233:这里的顺序很重要,它告诉 SVN:“给我从版本 1233 到 1234 之间的所有修改,然后反向应用它们”,这会撤销版本 1234 的修改。
-
检查和确认 执行完
merge后,SVN 会将冲突标记和修改后的文件标记出来,你需要检查这些文件是否确实是你想要的状态。svn status svn diff
-
提交回滚 确认无误后,提交这次回滚操作,提交信息要清晰明了,说明这次提交是为了撤销哪一次错误的提交。
svn commit -m "Revert r1234: 该提交包含了错误的配置修改,现已回滚"
你的版本库历史中就有了一个新的版本(
1235),它抵消了版本1234的错误。
svn copy (创建“反向分支”)
这种方法适用于你想完全“抛弃”那个错误的版本,而不是在它上面打一个“补丁”。
步骤:
-
确定要回滚到的“良好”版本号 假设版本
1233是最后一次正确的提交,版本1234是错误的提交。 -
将“良好”版本复制到当前 HEAD 这相当于在版本历史中创建一个新的分支,这个分支从版本
1233开始,直接跳过了版本1234。# 语法:svn copy -r <良好版本号> <URL@<良好版本号>> <目标URL> svn copy -r 1233 https://svn.example.com/project/trunk@1233 https://svn.example.com/project/trunk
- 这个命令会提示你输入提交信息,因为它会创建一个新的版本(
1235与1233相同,但历史指针跳过了1234。
- 这个命令会提示你输入提交信息,因为它会创建一个新的版本(
-
处理潜在的冲突 如果在
1233之后,除了你的1234之外,还有其他人提交了修改,直接执行copy可能会失败或覆盖别人的修改。svn merge方法通常是更安全的选择。
回滚特定文件的修改(已提交)
如果你想撤销某个文件在某个特定版本中的修改,但保留该文件其他版本的所有修改。
步骤:
-
更新工作副本
svn update
-
使用
svn merge撤销单个文件的修改 和方法一类似,但指定文件路径。# 假设文件 'docs/readme.txt' 在版本 1234 中被错误修改 svn merge -r 1234:1233 docs/readme.txt
-
检查并提交
svn status svn commit -m "Revert incorrect changes to docs/readme.txt from r1234"
回滚整个目录到某个历史版本
如果你想将整个项目目录恢复到某一个历史状态(发布一个旧版本的补丁)。
步骤:
-
更新到最新版本
svn update
-
使用
svn merge将整个目录回滚到目标版本 这会将你的工作副本变成目标版本的精确副本。# 假设你想将整个项目回滚到版本 1200 的状态 svn merge -r HEAD:1200 https://svn.example.com/project/trunk
-r HEAD:1200:表示从当前最新版本(HEAD)反向合并到版本 1200,这会让你的工作副本与版本 1200 完全一致。
-
检查并提交
# 此时你的工作副本就是版本 1200 的内容 svn status svn commit -m "Rollback project to state as of r1200 for hotfix"
这次提交会创建一个新版本,其内容与 1200 相同,但历史记录是从 HEAD 合并过来的。
总结与最佳实践
| 场景 | 推荐命令 | 关键点 |
|---|---|---|
| 撤销未提交的修改 | svn revert <文件/目录> |
本地操作,永久删除,无法恢复。 |
| 撤销已提交的修改 | svn merge -r <错误版本>:<前一个版本> svn commit |
标准方法,不破坏历史,增加一个新提交来抵消错误。 |
| 回滚特定文件 | svn merge -r <错误版本>:<前一个版本> <文件路径> |
精确控制,只回滚单个文件。 |
| 回滚整个目录到历史版本 | svn merge -r <当前版本>:<目标版本> <目录路径> |
将工作副本变成目标版本的精确副本。 |
重要提示:
- 始终先
update:在执行任何回滚操作前,确保你的工作副本已经更新到最新版本,以避免不必要的冲突。 - 先
diff后merge:在执行svn merge后,一定要用svn diff或svn status检查结果,确保回滚操作符合预期。 - 写好提交信息:回滚操作的提交信息至关重要,要清晰地说明回滚的原因和被回滚的版本号,方便团队其他成员理解历史变更。
