DNF/YUM history 回滚仅撤销指定事务而非时间点,需先用dnf history list等定位ID,再dnf history undo --assumeno预览后执行,注意依赖和事务顺序;失败时可选快照或手动降级。

在 Linux 运维中,yum/dnf 的 history 功能是回滚误升级或故障变更最常用、最轻量的手段。它不依赖外部快照或备份,直接基于包管理器自身的事务日志操作,但需注意:它撤销的是“某次事务”,不是“某个时间点”——所以定位准确的事务 ID 是关键。
查看历史操作记录
所有操作需 root 权限(加 sudo):
-
dnf history或yum history:列出全部事务,含 ID、命令行、时间、操作类型(Install/Update/Erase)、变更包数量 -
dnf history list --reverse:倒序显示,最新事务排第一,适合快速定位最近几次变更 -
dnf history list | grep "2026-09-15":按日期过滤(例如查昨天的操作) -
dnf history info 87:查看事务 ID 为 87 的详细内容,包括具体安装/升级了哪些包、版本变化、起止时间 -
dnf history packages list --installed | tail -10:快速看最近安装或更新的包名和版本
安全回滚指定事务
回滚不是一键还原,而是反向执行该事务中的操作(如卸载新装包、降级已升级包、重装被删包)。务必先预览再执行:
-
dnf history undo --assumeno 87:模拟执行事务 87 的回滚,只显示将要做什么,不实际更改系统 - 确认无关键服务组件(如 kernel、systemd、openssl)被意外移除或降级后,再运行:
dnf history undo 87 - 若需撤销多个连续事务(如 87→86→85),从编号最大的开始 undo(即先 undo 87),避免状态错乱
- 每次 undo 后建议检查依赖完整性:
dnf repoquery --unsatisfied;如有破损,可用dnf distro-sync尝试修复
补充实用技巧
- 用
dnf history redo 87可重做已撤销的事务(比如误 undo 后恢复) -
dnf history undo last直接回滚最近一次操作,适合快速补救 - 事务 ID 不代表时间顺序编号,一次
dnf update可能只生成一个事务,但涵盖几十个包;而手动装三个包也只记为一次事务 - 回滚能否成功,取决于旧版本包是否仍在本地缓存或远程仓库中;若仓库已下架旧版,
undo会失败
替代方案与注意事项
当 history undo 不适用时(如事务已被清理、依赖已严重偏离、或需跨多日整体还原):
- 桌面或 Btrfs 文件系统用户可优先用
snapper rollback或Timeshift恢复系统快照 - 单包精确降级可用:
dnf downgrade package-name(要求旧版仍在仓库) - 不要依赖
dnf clean all后再 history undo——清理缓存不影响事务日志,但可能让旧包下载失败 - 生产环境建议在重大更新前执行
dnf history new新建历史起点,便于后续隔离追踪


















