SVN 版本回退

SVN 版本回退(Revert / Rollback)最全实战指南

(2025 年最新、分类清晰、绝对不会丢数据)

1. 三种回退场景 → 用三种完全不同的命令(很多人一辈子只搞错这一步)

场景命令(推荐写法)是否产生新版本号是否可逆适用人群
A. 只想撤销本地修改(还没 commit)svn revert -R .svn revert 文件名完全可逆所有人(最常用)
B. 已经 commit 上去了,想撤销上一次/最近几次提交(推荐)svn merge -c -REV . → 再 commit是(产生新版本)完全可逆所有人(最安全、最推荐)
C. 彻底删除历史某个错误提交(历史被改写,慎用!)svnadmin dump + loadsvndumpfilter不可逆只有管理员、大规模误提交时使用

2. 场景 A:只回退本地修改(还没提交)

# 回退单个文件
svn revert src/bug.cpp

# 回退整个项目(最常用)
svn revert -R .

# 连新增的文件也一起删掉
svn revert --depth=infinity .

3. 场景 B:已经提交上去了,想撤销某一次提交(最常用、最安全)

步骤(3 分钟搞定):

# 1. 找到要撤销的版本号(比如第 158 版是个坏提交)
svn log --limit 10
# 或更直观:
svn log -r HEAD:1 --stop-on-copy | less

# 2. 执行反向合并(-c -158 表示“把 158 版改动反向打回去”)
svn update                     # 先更新到最新
svn merge -c -158 .            # 关键命令!把 158 的改动全部撤销
svn diff                       # 检查一下是不是真的回到 157 的状态
svn commit -m "revert: 撤销第158次错误提交(原因:xxx)"
# 完成后仓库变成 159 版,但内容等同于 157 版,完全可追溯

连续撤销多次提交(比如 160~163 都错了)

svn merge -r 163:159 .         # 把 163→159 的改动反向打回去
svn commit -m "revert: 回滚 160-163 次错误提交"

4. 场景 C:彻底删除某个历史版本(历史被改写,慎重!)

只在以下极端情况使用:

  • 误提交了密码、私钥、1GB 的安装包
  • 必须从历史中彻底抹除
# 假设误提交的是第 158 版,包含密码文件
# 1. 备份整个仓库(必须!)
svnadmin dump /svn/repos/myproject > myproject-full-backup.dump

# 2. 过滤掉第158版
svndumpfilter exclude 158 < myproject-full-backup.dump > cleaned.dump

# 3. 创建新仓库并导入
svnadmin create /svn/repos/myproject-new
svnadmin load /svn/repos/myproject-new < cleaned.dump

5. 一键回退脚本(推荐保存为 svn-rollback)

#!/bin/bash
# 用法:svn-rollback 158   (撤销第158次提交)
if [ -z "$1" ]; then
  echo "用法: svn-rollback <要撤销的版本号>"
  exit 1
fi

REV=$1
svn update
svn merge -c -$REV .
svn diff | less
read -p "以上是你撤销后的差异,确认提交?(y/N)" ok
if [ "$ok" = "y" ]; then
  svn commit -m "revert: 撤销第${REV}次提交"
  echo "回退完成,当前版本已回到 r$(svn info | grep Revision | awk '{print $2}')"
fi

6. TortoiseSVN 图形化回退(Windows 最快)

  • 右键项目 → TortoiseSVN → Show log
  • 找到要撤销的那一版 → 右键 → “Revert changes from this revision”
  • 点 Commit 即可(自动生成反向合并)

7. 终极总结表(看这一眼就够了)

需求一句命令是否产生新版本是否可追溯
撤销本地没提交的改动svn revert -R .
撤销已经提交的某次改动(推荐)svn merge -c -158 . && svn ci -m "revert"
撤销最近几次提交svn merge -r 165:159 . && svn ci
彻底从历史上删除某个版本(管理员)svndumpfilter + load

现在你彻底掌握 SVN 回退了!
把你 svn log -l 5 的输出贴出来,我直接给你最精确的一条回退命令。

文章已创建 2637

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部