菜鸟科技网

svn回滚命令怎么用?

回滚本地工作副本的修改(未提交)

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

svn回滚命令怎么用?-图1
(图片来源网络,侵删)

撤销单个文件的修改

如果你想放弃对某个文件的修改,恢复到它上次 update 的状态。

命令:

svn revert <文件路径>

示例:

# 撤销对 src/main.c 文件的修改
svn revert src/main.c

提示:

svn回滚命令怎么用?-图2
(图片来源网络,侵删)
  • svn revert 是一个本地操作,不会与服务器通信。
  • 它会永久性删除你对工作副本所做的所有未提交的修改,无法通过 svn status 恢复,所以请谨慎使用。

撤销整个目录的修改

如果你想放弃整个目录下所有文件的未提交修改。

命令:

svn revert <目录路径>

示例:

# 撤销整个 'project/trunk' 目录下的所有未提交修改
svn revert project/trunk

查看即将被 revert 的修改(安全起见)

在执行 revert 之前,你可以先用 svn diff 查看具体的修改内容,确保回滚的是正确的修改。

svn回滚命令怎么用?-图3
(图片来源网络,侵删)

命令:

svn diff <文件或目录路径>

撤销已提交的修改(最常见的需求)

这是 SVN 回滚中最常见也最关键的场景,你已经将错误的修改 commit 到了服务器,现在需要撤销这次提交。

SVN 没有一个直接“删除”历史提交的命令,因为它会破坏版本历史,正确的做法是创建一个新的“反向提交”(反向补丁)来抵消之前的错误提交。

svn merge + svn commit (推荐方法)

这是最标准、最安全的方法,因为它不会破坏历史记录,只是在历史中增加了一个新的、正确的提交。

步骤:

  1. 确定要回滚的版本号 假设你的错误提交是版本 1234,你需要知道这个版本的修订号。

  2. 更新到最新版本 确保你的工作副本是最新的,避免与其他人的修改冲突。

    svn update
  3. 执行反向合并 使用 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 的修改。
  4. 检查和确认 执行完 merge 后,SVN 会将冲突标记和修改后的文件标记出来,你需要检查这些文件是否确实是你想要的状态。

    svn status
    svn diff
  5. 提交回滚 确认无误后,提交这次回滚操作,提交信息要清晰明了,说明这次提交是为了撤销哪一次错误的提交。

    svn commit -m "Revert r1234: 该提交包含了错误的配置修改,现已回滚"

    你的版本库历史中就有了一个新的版本(1235),它抵消了版本 1234 的错误。

svn copy (创建“反向分支”)

这种方法适用于你想完全“抛弃”那个错误的版本,而不是在它上面打一个“补丁”。

步骤:

  1. 确定要回滚到的“良好”版本号 假设版本 1233 是最后一次正确的提交,版本 1234 是错误的提交。

  2. 将“良好”版本复制到当前 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
    • 这个命令会提示你输入提交信息,因为它会创建一个新的版本(12351233 相同,但历史指针跳过了 1234
  3. 处理潜在的冲突 如果在 1233 之后,除了你的 1234 之外,还有其他人提交了修改,直接执行 copy 可能会失败或覆盖别人的修改。svn merge 方法通常是更安全的选择


回滚特定文件的修改(已提交)

如果你想撤销某个文件在某个特定版本中的修改,但保留该文件其他版本的所有修改。

步骤:

  1. 更新工作副本

    svn update
  2. 使用 svn merge 撤销单个文件的修改 和方法一类似,但指定文件路径。

    # 假设文件 'docs/readme.txt' 在版本 1234 中被错误修改
    svn merge -r 1234:1233 docs/readme.txt
  3. 检查并提交

    svn status
    svn commit -m "Revert incorrect changes to docs/readme.txt from r1234"

回滚整个目录到某个历史版本

如果你想将整个项目目录恢复到某一个历史状态(发布一个旧版本的补丁)。

步骤:

  1. 更新到最新版本

    svn update
  2. 使用 svn merge 将整个目录回滚到目标版本 这会将你的工作副本变成目标版本的精确副本。

    # 假设你想将整个项目回滚到版本 1200 的状态
    svn merge -r HEAD:1200 https://svn.example.com/project/trunk
    • -r HEAD:1200:表示从当前最新版本(HEAD)反向合并到版本 1200,这会让你的工作副本与版本 1200 完全一致。
  3. 检查并提交

    # 此时你的工作副本就是版本 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:在执行任何回滚操作前,确保你的工作副本已经更新到最新版本,以避免不必要的冲突。
  • diffmerge:在执行 svn merge 后,一定要用 svn diffsvn status 检查结果,确保回滚操作符合预期。
  • 写好提交信息:回滚操作的提交信息至关重要,要清晰地说明回滚的原因和被回滚的版本号,方便团队其他成员理解历史变更。
分享:
扫描分享到社交APP
上一篇
下一篇