patch是diff的反向操作,原始文件加diff补丁文件经patch处理后精准还原目标文件;核心用法为patch选项

Linux 运维中,diff 用于发现文件或目录的差异,patch 用于把差异安全、精准地应用到目标环境。两者配合,是轻量同步配置、回滚变更、分发小范围修复的核心组合,不依赖 Git 也能完成版本控制级操作。
生成标准补丁文件(diff)
运维最常用的是统一格式(-u)补丁,可读性强、兼容性好,支持单文件和整个目录树:
- 单文件对比(如修改前后的 nginx.conf):
diff -u nginx.conf nginx.conf.new > nginx-fix.patch - 整目录对比(如旧版配置目录 vs 新版):
diff -urN /etc/myapp/conf/ /etc/myapp/conf-new/ > myapp-conf-update.patch
其中-r表示递归,-N确保新增/删除文件也被记录 - 对比两个 Git 工作区(未提交变更):
git diff > local-changes.patch
打补丁前检查与预演(patch)
切忌直接打补丁。先用 --dry-run 或 --check 验证是否能成功应用:
- 检查补丁是否可打(无冲突、路径匹配):
patch -p1 --dry-run <br>无输出表示通过;若有报错(如 “Hunk #1 FAILED”),说明上下文不匹配,需人工确认 - 查看补丁影响范围(不实际修改):
patch -p1 --stat <br>会列出所有将被修改、新增或删除的文件及行数
安全应用补丁(patch)
打补丁的关键是路径匹配和备份保护:
- 指定剥离层级(
-pN):
补丁里路径如--- a/etc/myapp/conf/app.ini,你当前在/etc/myapp/conf/目录下,则用-p2去掉a/和etc/两层;若在/etc/下则用-p1;若不确定,加-v查看 patch 实际尝试读取的文件名 - 自动备份原文件(强烈建议):
patch -p1 -b --suffix=.pre-patch <br>执行后,每个被修改的文件都会生成一个 <code>app.ini.pre-patch备份 - 打补丁后验证:
用diff -u对比当前文件与预期目标,或运行服务健康检查(如nginx -t)
撤销补丁与多补丁批量处理
补丁不是单向操作,运维必须掌握回退能力:
- 反向打补丁(还原):
patch -p1 -R <br><code>-R让 patch 把+当删除、-当新增,实现“倒放” - 批量打多个 .patch 文件:
for p in /opt/patches/*.patch; do patch -p1 -b <br>建议配合 <code>set -e,任一失败即终止 - 拒绝文件(.rej)处理:
若某 hunk 失败,patch 会生成.rej文件,需手动编辑原文件并重试,或用patch --merge插入冲突标记供人工处理











