patch 命令详解
更新时间:2026-08-28。本文是「一个命令一个文档」系列,属于文本处理命令族(见文本处理命令族)。它是 diff(见diff)的下游——把补丁真正打上。
patch 读取 diff -u 生成的补丁文件,把其中的增删改应用到原文件。源码分发、手工打补丁都靠它(在 git 普及前是标准流程)。
一、基本用法
bash
patch < fix.patch # 按补丁里的文件名应用到当前目录对应文件
patch old.txt < fix.patch # 显式指定要打补丁的目标文件补丁里记录了目标文件名,默认就地修改原文件。打之前建议备份,或先
--dry-run。
二、路径前缀:-p1
bash
patch -p1 < fix.patch # 去掉补丁路径里第一层目录前缀补丁常带
a/src/foo.c这样的路径,-p1去掉最前面a/一层,让它能正确落到src/foo.c。git diff生成的补丁通常要-p1。层数不对 patch 会找不到文件报错。
三、预览与撤销
bash
patch --dry-run < fix.patch # 只模拟,不真改(先验证能否应用)
patch -R < fix.patch # -R 反向:撤销已打的补丁
--dry-run上线前必做,确认不会失败或错改。-R(reverse)把补丁反过来执行,等于"卸载"这次修改——前提是原补丁还在。
四、与 git apply 区别
bash
git apply fix.patch # git 仓库内用,更严格、能感知 git 状态
patch -p1 < fix.patch # 通用,不限 git 仓库在 git 仓库里优先
git apply(它会校验上下文、与 git 索引一致);patch是更通用的独立工具,非 git 项目、或离线打补丁时用。两者补丁格式兼容。
一句话总结
patch = 应用 diff 补丁(见diff):patch < x.patch 就地改;-p1 去掉补丁路径首层前缀(git diff 常用);--dry-run 先模拟验证、-R 反向撤销;git 仓库内优先 git apply(更严格),非 git 项目用 patch。