🔥作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生,研究方向无线联邦学习 🎬擅长领域:驱动开发,嵌入式软件开发,BSP开发 ❄️作者主页:一个平凡而乐于分享的小比特的个人主页 ✨收录专栏:Linux,本专栏目的在于,记录学习Linux操作系统的总结 欢迎大家点赞 👍 收藏 ⭐ 加关注哦!💖💖

Linux中的patch和diff命令完全指南
目录
什么是diff和patch?
diff和patch是一对相辅相成的工具,用于比较文件差异和应用补丁。简单来说:
- diff:比较两个文件/目录的差异,生成补丁文件
- patch:将diff生成的补丁应用到原文件上
#mermaid-svg-pMOPq7eOUisGzcJv{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-pMOPq7eOUisGzcJv .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-pMOPq7eOUisGzcJv .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-pMOPq7eOUisGzcJv .error-icon{fill:#552222;}#mermaid-svg-pMOPq7eOUisGzcJv .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-pMOPq7eOUisGzcJv .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-pMOPq7eOUisGzcJv .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-pMOPq7eOUisGzcJv .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-pMOPq7eOUisGzcJv .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-pMOPq7eOUisGzcJv .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-pMOPq7eOUisGzcJv .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-pMOPq7eOUisGzcJv .marker{fill:#333333;stroke:#333333;}#mermaid-svg-pMOPq7eOUisGzcJv .marker.cross{stroke:#333333;}#mermaid-svg-pMOPq7eOUisGzcJv svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-pMOPq7eOUisGzcJv p{margin:0;}#mermaid-svg-pMOPq7eOUisGzcJv .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-pMOPq7eOUisGzcJv .cluster-label text{fill:#333;}#mermaid-svg-pMOPq7eOUisGzcJv .cluster-label span{color:#333;}#mermaid-svg-pMOPq7eOUisGzcJv .cluster-label span p{background-color:transparent;}#mermaid-svg-pMOPq7eOUisGzcJv .label text,#mermaid-svg-pMOPq7eOUisGzcJv span{fill:#333;color:#333;}#mermaid-svg-pMOPq7eOUisGzcJv .node rect,#mermaid-svg-pMOPq7eOUisGzcJv .node circle,#mermaid-svg-pMOPq7eOUisGzcJv .node ellipse,#mermaid-svg-pMOPq7eOUisGzcJv .node polygon,#mermaid-svg-pMOPq7eOUisGzcJv .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-pMOPq7eOUisGzcJv .rough-node .label text,#mermaid-svg-pMOPq7eOUisGzcJv .node .label text,#mermaid-svg-pMOPq7eOUisGzcJv .image-shape .label,#mermaid-svg-pMOPq7eOUisGzcJv .icon-shape .label{text-anchor:middle;}#mermaid-svg-pMOPq7eOUisGzcJv .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-pMOPq7eOUisGzcJv .rough-node .label,#mermaid-svg-pMOPq7eOUisGzcJv .node .label,#mermaid-svg-pMOPq7eOUisGzcJv .image-shape .label,#mermaid-svg-pMOPq7eOUisGzcJv .icon-shape .label{text-align:center;}#mermaid-svg-pMOPq7eOUisGzcJv .node.clickable{cursor:pointer;}#mermaid-svg-pMOPq7eOUisGzcJv .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-pMOPq7eOUisGzcJv .arrowheadPath{fill:#333333;}#mermaid-svg-pMOPq7eOUisGzcJv .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-pMOPq7eOUisGzcJv .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-pMOPq7eOUisGzcJv .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pMOPq7eOUisGzcJv .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-pMOPq7eOUisGzcJv .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pMOPq7eOUisGzcJv .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-pMOPq7eOUisGzcJv .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-pMOPq7eOUisGzcJv .cluster text{fill:#333;}#mermaid-svg-pMOPq7eOUisGzcJv .cluster span{color:#333;}#mermaid-svg-pMOPq7eOUisGzcJv div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-pMOPq7eOUisGzcJv .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-pMOPq7eOUisGzcJv rect.text{fill:none;stroke-width:0;}#mermaid-svg-pMOPq7eOUisGzcJv .icon-shape,#mermaid-svg-pMOPq7eOUisGzcJv .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-pMOPq7eOUisGzcJv .icon-shape p,#mermaid-svg-pMOPq7eOUisGzcJv .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-pMOPq7eOUisGzcJv .icon-shape rect,#mermaid-svg-pMOPq7eOUisGzcJv .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-pMOPq7eOUisGzcJv .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-pMOPq7eOUisGzcJv .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-pMOPq7eOUisGzcJv :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
原文件 old.txt
diff命令
新文件 new.txt
补丁文件 patch.diff
patch命令
更新后的文件
diff命令详解
基本语法
diff [选项] 原文件 新文件
输出格式对比
| 正常格式 | diff (默认) | 最基础的格式,显示需要修改的行 | 简单文件比较 |
| 上下文格式 | diff -c | 显示修改前后的上下文内容 | 代码审查,需要了解上下文 |
| 统一格式 | diff -u | 紧凑显示,包含上下文,最常用 | 生成补丁文件,版本控制 |
实战示例
假设我们有两个版本的配置文件:
config-v1.txt
# 服务器配置
port=8080
host=localhost
debug=false
max_connections=100
config-v2.txt
# 服务器配置
port=9090
host=0.0.0.0
debug=true
max_connections=200
timeout=30
1. 正常格式输出
$ diff config-v1.txt config-v2.txt
2,4c2,5
< port=8080
< host=localhost
< debug=false
< max_connections=100
—
> port=9090
> host=0.0.0.0
> debug=true
> max_connections=200
> timeout=30
#mermaid-svg-jcXthqCqas8yS9yX{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-jcXthqCqas8yS9yX .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-jcXthqCqas8yS9yX .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-jcXthqCqas8yS9yX .error-icon{fill:#552222;}#mermaid-svg-jcXthqCqas8yS9yX .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-jcXthqCqas8yS9yX .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-jcXthqCqas8yS9yX .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-jcXthqCqas8yS9yX .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-jcXthqCqas8yS9yX .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-jcXthqCqas8yS9yX .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-jcXthqCqas8yS9yX .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-jcXthqCqas8yS9yX .marker{fill:#333333;stroke:#333333;}#mermaid-svg-jcXthqCqas8yS9yX .marker.cross{stroke:#333333;}#mermaid-svg-jcXthqCqas8yS9yX svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-jcXthqCqas8yS9yX p{margin:0;}#mermaid-svg-jcXthqCqas8yS9yX .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-jcXthqCqas8yS9yX .cluster-label text{fill:#333;}#mermaid-svg-jcXthqCqas8yS9yX .cluster-label span{color:#333;}#mermaid-svg-jcXthqCqas8yS9yX .cluster-label span p{background-color:transparent;}#mermaid-svg-jcXthqCqas8yS9yX .label text,#mermaid-svg-jcXthqCqas8yS9yX span{fill:#333;color:#333;}#mermaid-svg-jcXthqCqas8yS9yX .node rect,#mermaid-svg-jcXthqCqas8yS9yX .node circle,#mermaid-svg-jcXthqCqas8yS9yX .node ellipse,#mermaid-svg-jcXthqCqas8yS9yX .node polygon,#mermaid-svg-jcXthqCqas8yS9yX .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-jcXthqCqas8yS9yX .rough-node .label text,#mermaid-svg-jcXthqCqas8yS9yX .node .label text,#mermaid-svg-jcXthqCqas8yS9yX .image-shape .label,#mermaid-svg-jcXthqCqas8yS9yX .icon-shape .label{text-anchor:middle;}#mermaid-svg-jcXthqCqas8yS9yX .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-jcXthqCqas8yS9yX .rough-node .label,#mermaid-svg-jcXthqCqas8yS9yX .node .label,#mermaid-svg-jcXthqCqas8yS9yX .image-shape .label,#mermaid-svg-jcXthqCqas8yS9yX .icon-shape .label{text-align:center;}#mermaid-svg-jcXthqCqas8yS9yX .node.clickable{cursor:pointer;}#mermaid-svg-jcXthqCqas8yS9yX .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-jcXthqCqas8yS9yX .arrowheadPath{fill:#333333;}#mermaid-svg-jcXthqCqas8yS9yX .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-jcXthqCqas8yS9yX .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-jcXthqCqas8yS9yX .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jcXthqCqas8yS9yX .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-jcXthqCqas8yS9yX .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jcXthqCqas8yS9yX .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-jcXthqCqas8yS9yX .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-jcXthqCqas8yS9yX .cluster text{fill:#333;}#mermaid-svg-jcXthqCqas8yS9yX .cluster span{color:#333;}#mermaid-svg-jcXthqCqas8yS9yX div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-jcXthqCqas8yS9yX .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-jcXthqCqas8yS9yX rect.text{fill:none;stroke-width:0;}#mermaid-svg-jcXthqCqas8yS9yX .icon-shape,#mermaid-svg-jcXthqCqas8yS9yX .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-jcXthqCqas8yS9yX .icon-shape p,#mermaid-svg-jcXthqCqas8yS9yX .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-jcXthqCqas8yS9yX .icon-shape rect,#mermaid-svg-jcXthqCqas8yS9yX .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-jcXthqCqas8yS9yX .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-jcXthqCqas8yS9yX .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-jcXthqCqas8yS9yX :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
输出格式说明
2,4c2,5
c表示修改(changed)
2,4表示原文件2-4行
2,5表示新文件2-5行
2. 上下文格式输出
$ diff -c config-v1.txt config-v2.txt
*** config-v1.txt2024-01-01 10:00:00
— config-v2.txt2024-01-01 11:00:00
***************
*** 1,6 ****
# 服务器配置
! port=8080
! host=localhost
! debug=false
! max_connections=100
— 1,7 —-
# 服务器配置
! port=9090
! host=0.0.0.0
! debug=true
! max_connections=200
+ timeout=30
3. 统一格式输出(最常用)
$ diff -u config-v1.txt config-v2.txt
— config-v1.txt2024-01-01 10:00:00
+++ config-v2.txt2024-01-01 11:00:00
@@ -1,6 +1,7 @@
# 服务器配置
-port=8080
-host=localhost
-debug=false
-max_connections=100
+port=9090
+host=0.0.0.0
+debug=true
+max_connections=200
+timeout=30
diff常用选项
| -u | 统一格式输出 | diff -u file1 file2 |
| -c | 上下文格式输出 | diff -c file1 file2 |
| -r | 递归比较目录 | diff -r dir1 dir2 |
| -N | 将缺失文件视为空文件 | diff -N old/ new/ |
| -b | 忽略空格差异 | diff -b file1 file2 |
| -w | 忽略所有空白 | diff -w file1 file2 |
| -B | 忽略空行差异 | diff -B file1 file2 |
| -i | 忽略大小写 | diff -i file1 file2 |
patch命令详解
基本语法
patch [选项] [原始文件] [补丁文件]
patch工作流程
#mermaid-svg-4txpoBRGJMpFwF4y{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-4txpoBRGJMpFwF4y .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-4txpoBRGJMpFwF4y .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-4txpoBRGJMpFwF4y .error-icon{fill:#552222;}#mermaid-svg-4txpoBRGJMpFwF4y .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-4txpoBRGJMpFwF4y .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-4txpoBRGJMpFwF4y .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-4txpoBRGJMpFwF4y .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-4txpoBRGJMpFwF4y .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-4txpoBRGJMpFwF4y .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-4txpoBRGJMpFwF4y .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-4txpoBRGJMpFwF4y .marker{fill:#333333;stroke:#333333;}#mermaid-svg-4txpoBRGJMpFwF4y .marker.cross{stroke:#333333;}#mermaid-svg-4txpoBRGJMpFwF4y svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-4txpoBRGJMpFwF4y p{margin:0;}#mermaid-svg-4txpoBRGJMpFwF4y .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-4txpoBRGJMpFwF4y .cluster-label text{fill:#333;}#mermaid-svg-4txpoBRGJMpFwF4y .cluster-label span{color:#333;}#mermaid-svg-4txpoBRGJMpFwF4y .cluster-label span p{background-color:transparent;}#mermaid-svg-4txpoBRGJMpFwF4y .label text,#mermaid-svg-4txpoBRGJMpFwF4y span{fill:#333;color:#333;}#mermaid-svg-4txpoBRGJMpFwF4y .node rect,#mermaid-svg-4txpoBRGJMpFwF4y .node circle,#mermaid-svg-4txpoBRGJMpFwF4y .node ellipse,#mermaid-svg-4txpoBRGJMpFwF4y .node polygon,#mermaid-svg-4txpoBRGJMpFwF4y .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-4txpoBRGJMpFwF4y .rough-node .label text,#mermaid-svg-4txpoBRGJMpFwF4y .node .label text,#mermaid-svg-4txpoBRGJMpFwF4y .image-shape .label,#mermaid-svg-4txpoBRGJMpFwF4y .icon-shape .label{text-anchor:middle;}#mermaid-svg-4txpoBRGJMpFwF4y .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-4txpoBRGJMpFwF4y .rough-node .label,#mermaid-svg-4txpoBRGJMpFwF4y .node .label,#mermaid-svg-4txpoBRGJMpFwF4y .image-shape .label,#mermaid-svg-4txpoBRGJMpFwF4y .icon-shape .label{text-align:center;}#mermaid-svg-4txpoBRGJMpFwF4y .node.clickable{cursor:pointer;}#mermaid-svg-4txpoBRGJMpFwF4y .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-4txpoBRGJMpFwF4y .arrowheadPath{fill:#333333;}#mermaid-svg-4txpoBRGJMpFwF4y .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-4txpoBRGJMpFwF4y .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-4txpoBRGJMpFwF4y .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4txpoBRGJMpFwF4y .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-4txpoBRGJMpFwF4y .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4txpoBRGJMpFwF4y .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-4txpoBRGJMpFwF4y .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-4txpoBRGJMpFwF4y .cluster text{fill:#333;}#mermaid-svg-4txpoBRGJMpFwF4y .cluster span{color:#333;}#mermaid-svg-4txpoBRGJMpFwF4y div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-4txpoBRGJMpFwF4y .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-4txpoBRGJMpFwF4y rect.text{fill:none;stroke-width:0;}#mermaid-svg-4txpoBRGJMpFwF4y .icon-shape,#mermaid-svg-4txpoBRGJMpFwF4y .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-4txpoBRGJMpFwF4y .icon-shape p,#mermaid-svg-4txpoBRGJMpFwF4y .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-4txpoBRGJMpFwF4y .icon-shape rect,#mermaid-svg-4txpoBRGJMpFwF4y .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-4txpoBRGJMpFwF4y .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-4txpoBRGJMpFwF4y .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-4txpoBRGJMpFwF4y :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
patch应用流程
是
否
是
否
原始文件
检查补丁
补丁文件
计算文件指纹
文件匹配?
应用补丁
尝试偏移匹配
找到匹配?
失败并保存.rej文件
生成新文件
创建备份.orig
实战示例
场景1:应用简单补丁
# 生成补丁
$ diff -u config-v1.txt config-v2.txt > config.patch
# 应用补丁
$ patch config-v1.txt < config.patch
patching file config-v1.txt
# 验证结果
$ cat config-v1.txt
# 服务器配置
port=9090
host=0.0.0.0
debug=true
max_connections=200
timeout=30
场景2:带备份的应用
# 应用补丁并创建备份
$ patch -b config-v1.txt < config.patch
# 查看备份文件
$ ls config-v1.txt*
config-v1.txt config-v1.txt.orig
场景3:回退补丁
# 使用 -R 回退补丁
$ patch -R config-v1.txt < config.patch
patch常用选项
| -p数字 | 剥离路径层级 | patch -p1 < patch.diff |
| -b | 创建备份文件 | patch -b file < patch |
| -B | 指定备份前缀 | patch -B backup- file < patch |
| -R | 反向应用补丁 | patch -R file < patch |
| -d | 切换目录 | patch -d /src < patch |
| –dry-run | 模拟运行 | patch –dry-run < patch |
| -f | 强制应用 | patch -f < patch |
实战场景应用
场景1:软件源码补丁管理
#mermaid-svg-C9d585SboyCrFpAr{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-C9d585SboyCrFpAr .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-C9d585SboyCrFpAr .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-C9d585SboyCrFpAr .error-icon{fill:#552222;}#mermaid-svg-C9d585SboyCrFpAr .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-C9d585SboyCrFpAr .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-C9d585SboyCrFpAr .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-C9d585SboyCrFpAr .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-C9d585SboyCrFpAr .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-C9d585SboyCrFpAr .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-C9d585SboyCrFpAr .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-C9d585SboyCrFpAr .marker{fill:#333333;stroke:#333333;}#mermaid-svg-C9d585SboyCrFpAr .marker.cross{stroke:#333333;}#mermaid-svg-C9d585SboyCrFpAr svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-C9d585SboyCrFpAr p{margin:0;}#mermaid-svg-C9d585SboyCrFpAr .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-C9d585SboyCrFpAr .cluster-label text{fill:#333;}#mermaid-svg-C9d585SboyCrFpAr .cluster-label span{color:#333;}#mermaid-svg-C9d585SboyCrFpAr .cluster-label span p{background-color:transparent;}#mermaid-svg-C9d585SboyCrFpAr .label text,#mermaid-svg-C9d585SboyCrFpAr span{fill:#333;color:#333;}#mermaid-svg-C9d585SboyCrFpAr .node rect,#mermaid-svg-C9d585SboyCrFpAr .node circle,#mermaid-svg-C9d585SboyCrFpAr .node ellipse,#mermaid-svg-C9d585SboyCrFpAr .node polygon,#mermaid-svg-C9d585SboyCrFpAr .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-C9d585SboyCrFpAr .rough-node .label text,#mermaid-svg-C9d585SboyCrFpAr .node .label text,#mermaid-svg-C9d585SboyCrFpAr .image-shape .label,#mermaid-svg-C9d585SboyCrFpAr .icon-shape .label{text-anchor:middle;}#mermaid-svg-C9d585SboyCrFpAr .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-C9d585SboyCrFpAr .rough-node .label,#mermaid-svg-C9d585SboyCrFpAr .node .label,#mermaid-svg-C9d585SboyCrFpAr .image-shape .label,#mermaid-svg-C9d585SboyCrFpAr .icon-shape .label{text-align:center;}#mermaid-svg-C9d585SboyCrFpAr .node.clickable{cursor:pointer;}#mermaid-svg-C9d585SboyCrFpAr .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-C9d585SboyCrFpAr .arrowheadPath{fill:#333333;}#mermaid-svg-C9d585SboyCrFpAr .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-C9d585SboyCrFpAr .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-C9d585SboyCrFpAr .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-C9d585SboyCrFpAr .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-C9d585SboyCrFpAr .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-C9d585SboyCrFpAr .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-C9d585SboyCrFpAr .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-C9d585SboyCrFpAr .cluster text{fill:#333;}#mermaid-svg-C9d585SboyCrFpAr .cluster span{color:#333;}#mermaid-svg-C9d585SboyCrFpAr div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-C9d585SboyCrFpAr .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-C9d585SboyCrFpAr rect.text{fill:none;stroke-width:0;}#mermaid-svg-C9d585SboyCrFpAr .icon-shape,#mermaid-svg-C9d585SboyCrFpAr .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-C9d585SboyCrFpAr .icon-shape p,#mermaid-svg-C9d585SboyCrFpAr .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-C9d585SboyCrFpAr .icon-shape rect,#mermaid-svg-C9d585SboyCrFpAr .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-C9d585SboyCrFpAr .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-C9d585SboyCrFpAr .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-C9d585SboyCrFpAr :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
开源软件打补丁流程
是
否
下载源码
应用补丁
社区补丁
patch -p1
修改源码
编译测试
通过?
提交反馈
调试
# 下载nginx源码
$ wget http://nginx.org/download/nginx-1.20.0.tar.gz
$ tar xzf nginx-1.20.0.tar.gz
$ cd nginx-1.20.0
# 应用官方补丁
$ wget http://nginx.org/patches/patch.1.diff
$ patch -p1 < patch.1.diff
场景2:配置文件版本管理
# 假设我们有多环境配置
config/
├── dev/
│ └── app.conf
├── prod/
│ └── app.conf
└── patches/
└── database.patch
database.patch
— config/dev/app.conf
+++ config/prod/app.conf
@@ -1,5 +1,5 @@
database {
– host=localhost
– port=3306
+ host=prod-db.example.com
+ port=3307
user=app_user
– password=dev_pass
+ password=${DB_PASSWORD}
}
场景3:代码审查与协作
开发者B
代码仓库
开发者A
开发者B
代码仓库
开发者A
#mermaid-svg-NTnbSX1TgYpNRukf{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-NTnbSX1TgYpNRukf .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-NTnbSX1TgYpNRukf .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-NTnbSX1TgYpNRukf .error-icon{fill:#552222;}#mermaid-svg-NTnbSX1TgYpNRukf .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-NTnbSX1TgYpNRukf .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-NTnbSX1TgYpNRukf .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-NTnbSX1TgYpNRukf .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-NTnbSX1TgYpNRukf .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-NTnbSX1TgYpNRukf .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-NTnbSX1TgYpNRukf .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-NTnbSX1TgYpNRukf .marker{fill:#333333;stroke:#333333;}#mermaid-svg-NTnbSX1TgYpNRukf .marker.cross{stroke:#333333;}#mermaid-svg-NTnbSX1TgYpNRukf svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-NTnbSX1TgYpNRukf p{margin:0;}#mermaid-svg-NTnbSX1TgYpNRukf .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-NTnbSX1TgYpNRukf text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-NTnbSX1TgYpNRukf .actor-line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-NTnbSX1TgYpNRukf .innerArc{stroke-width:1.5;stroke-dasharray:none;}#mermaid-svg-NTnbSX1TgYpNRukf .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-NTnbSX1TgYpNRukf .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-NTnbSX1TgYpNRukf #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-NTnbSX1TgYpNRukf .sequenceNumber{fill:white;}#mermaid-svg-NTnbSX1TgYpNRukf #sequencenumber{fill:#333;}#mermaid-svg-NTnbSX1TgYpNRukf #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-NTnbSX1TgYpNRukf .messageText{fill:#333;stroke:none;}#mermaid-svg-NTnbSX1TgYpNRukf .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-NTnbSX1TgYpNRukf .labelText,#mermaid-svg-NTnbSX1TgYpNRukf .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-NTnbSX1TgYpNRukf .loopText,#mermaid-svg-NTnbSX1TgYpNRukf .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-NTnbSX1TgYpNRukf .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-NTnbSX1TgYpNRukf .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-NTnbSX1TgYpNRukf .noteText,#mermaid-svg-NTnbSX1TgYpNRukf .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-NTnbSX1TgYpNRukf .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-NTnbSX1TgYpNRukf .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-NTnbSX1TgYpNRukf .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-NTnbSX1TgYpNRukf .actorPopupMenu{position:absolute;}#mermaid-svg-NTnbSX1TgYpNRukf .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-NTnbSX1TgYpNRukf .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-NTnbSX1TgYpNRukf .actor-man circle,#mermaid-svg-NTnbSX1TgYpNRukf line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-NTnbSX1TgYpNRukf :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
修改代码
git commit
获取更新
发现Bug
发送补丁
patch应用
提交修复
最佳实践与技巧
1. 创建高质量补丁
# 使用统一格式,包含更多上下文
$ diff -u5 old.py new.py > quality.patch
# 递归比较整个目录
$ diff -urN old_project/ new_project/ > project.patch
2. 路径处理技巧
# 假设补丁文件内容
— a/src/main.c
+++ b/src/main.c
# 应用时剥离a/前缀
$ patch -p1 < patch.diff
路径剥离示例:
#mermaid-svg-1UpyeWr536PHJWhF{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}@keyframes edge-animation-frame{from{stroke-dashoffset:0;}}@keyframes dash{to{stroke-dashoffset:0;}}#mermaid-svg-1UpyeWr536PHJWhF .edge-animation-slow{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 50s linear infinite;stroke-linecap:round;}#mermaid-svg-1UpyeWr536PHJWhF .edge-animation-fast{stroke-dasharray:9,5!important;stroke-dashoffset:900;animation:dash 20s linear infinite;stroke-linecap:round;}#mermaid-svg-1UpyeWr536PHJWhF .error-icon{fill:#552222;}#mermaid-svg-1UpyeWr536PHJWhF .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-1UpyeWr536PHJWhF .edge-thickness-normal{stroke-width:1px;}#mermaid-svg-1UpyeWr536PHJWhF .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-1UpyeWr536PHJWhF .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-1UpyeWr536PHJWhF .edge-thickness-invisible{stroke-width:0;fill:none;}#mermaid-svg-1UpyeWr536PHJWhF .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-1UpyeWr536PHJWhF .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-1UpyeWr536PHJWhF .marker{fill:#333333;stroke:#333333;}#mermaid-svg-1UpyeWr536PHJWhF .marker.cross{stroke:#333333;}#mermaid-svg-1UpyeWr536PHJWhF svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-1UpyeWr536PHJWhF p{margin:0;}#mermaid-svg-1UpyeWr536PHJWhF .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-1UpyeWr536PHJWhF .cluster-label text{fill:#333;}#mermaid-svg-1UpyeWr536PHJWhF .cluster-label span{color:#333;}#mermaid-svg-1UpyeWr536PHJWhF .cluster-label span p{background-color:transparent;}#mermaid-svg-1UpyeWr536PHJWhF .label text,#mermaid-svg-1UpyeWr536PHJWhF span{fill:#333;color:#333;}#mermaid-svg-1UpyeWr536PHJWhF .node rect,#mermaid-svg-1UpyeWr536PHJWhF .node circle,#mermaid-svg-1UpyeWr536PHJWhF .node ellipse,#mermaid-svg-1UpyeWr536PHJWhF .node polygon,#mermaid-svg-1UpyeWr536PHJWhF .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-1UpyeWr536PHJWhF .rough-node .label text,#mermaid-svg-1UpyeWr536PHJWhF .node .label text,#mermaid-svg-1UpyeWr536PHJWhF .image-shape .label,#mermaid-svg-1UpyeWr536PHJWhF .icon-shape .label{text-anchor:middle;}#mermaid-svg-1UpyeWr536PHJWhF .node .katex path{fill:#000;stroke:#000;stroke-width:1px;}#mermaid-svg-1UpyeWr536PHJWhF .rough-node .label,#mermaid-svg-1UpyeWr536PHJWhF .node .label,#mermaid-svg-1UpyeWr536PHJWhF .image-shape .label,#mermaid-svg-1UpyeWr536PHJWhF .icon-shape .label{text-align:center;}#mermaid-svg-1UpyeWr536PHJWhF .node.clickable{cursor:pointer;}#mermaid-svg-1UpyeWr536PHJWhF .root .anchor path{fill:#333333!important;stroke-width:0;stroke:#333333;}#mermaid-svg-1UpyeWr536PHJWhF .arrowheadPath{fill:#333333;}#mermaid-svg-1UpyeWr536PHJWhF .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-1UpyeWr536PHJWhF .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-1UpyeWr536PHJWhF .edgeLabel{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1UpyeWr536PHJWhF .edgeLabel p{background-color:rgba(232,232,232, 0.8);}#mermaid-svg-1UpyeWr536PHJWhF .edgeLabel rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1UpyeWr536PHJWhF .labelBkg{background-color:rgba(232, 232, 232, 0.5);}#mermaid-svg-1UpyeWr536PHJWhF .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-1UpyeWr536PHJWhF .cluster text{fill:#333;}#mermaid-svg-1UpyeWr536PHJWhF .cluster span{color:#333;}#mermaid-svg-1UpyeWr536PHJWhF div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-1UpyeWr536PHJWhF .flowchartTitleText{text-anchor:middle;font-size:18px;fill:#333;}#mermaid-svg-1UpyeWr536PHJWhF rect.text{fill:none;stroke-width:0;}#mermaid-svg-1UpyeWr536PHJWhF .icon-shape,#mermaid-svg-1UpyeWr536PHJWhF .image-shape{background-color:rgba(232,232,232, 0.8);text-align:center;}#mermaid-svg-1UpyeWr536PHJWhF .icon-shape p,#mermaid-svg-1UpyeWr536PHJWhF .image-shape p{background-color:rgba(232,232,232, 0.8);padding:2px;}#mermaid-svg-1UpyeWr536PHJWhF .icon-shape rect,#mermaid-svg-1UpyeWr536PHJWhF .image-shape rect{opacity:0.5;background-color:rgba(232,232,232, 0.8);fill:rgba(232,232,232, 0.8);}#mermaid-svg-1UpyeWr536PHJWhF .label-icon{display:inline-block;height:1em;overflow:visible;vertical-align:-0.125em;}#mermaid-svg-1UpyeWr536PHJWhF .node .label-icon path{fill:currentColor;stroke:revert;stroke-width:revert;}#mermaid-svg-1UpyeWr536PHJWhF :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}
patch -p选项效果
a/src/main.c
-p0: a/src/main.c
-p1: src/main.c
-p2: main.c
3. 补丁管理策略
| 应用单个补丁 | patch -b < patch | 自动备份,安全可靠 |
| 批量应用 | for p in *.patch; do patch -p1 < $p; done | 自动化处理 |
| 模拟测试 | patch –dry-run < patch | 提前检查冲突 |
| 回退补丁 | patch -R < patch | 快速撤销修改 |
4. 常见问题解决
问题1:补丁应用失败
$ patch < patch.diff
1 out of 1 hunk FAILED — saving rejects to file.rej
# 解决方案:检查rej文件手动合并
$ cat file.rej
$ vim file # 手动修复
问题2:文件名不匹配
# 使用 -p 选项调整路径
$ patch -p2 < patch.diff
5. 实用脚本示例
批量应用补丁脚本:
#!/bin/bash
# apply-patches.sh
PATCH_DIR="patches"
BACKUP_DIR="backups"
mkdir -p $BACKUP_DIR
for patch in $PATCH_DIR/*.patch; do
echo "Applying $patch…"
# 创建时间戳备份
cp -r src $BACKUP_DIR/src-$(date +%Y%m%d-%H%M%S)
# 尝试应用补丁
if patch -p1 -d src < $patch; then
echo "✓ $patch applied successfully"
else
echo "✗ $patch failed, check $patch.rej"
# 回滚更改
cp -r $BACKUP_DIR/src-* src
fi
done
总结
diff和patch是Linux系统中强大的文本处理工具,它们:
- diff:精确比较文件差异,生成可读性强的补丁
- patch:智能应用补丁,支持备份和回滚
- 配合使用:实现高效的代码分发和版本管理
掌握这些工具,你将能够:
记住:diff找差异,patch解差异,这对黄金搭档是Linux文本处理中不可或缺的工具!

