欢迎光临
我们一直在努力

Linux中的patch和diff命令完全指南

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

在这里插入图片描述

Linux中的patch和diff命令完全指南

目录

  • 什么是diff和patch?
  • diff命令详解
  • patch命令详解
  • 实战场景应用
  • 最佳实践与技巧
  • 什么是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文本处理中不可或缺的工具!

    赞(0)
    未经允许不得转载:171主机测评 » Linux中的patch和diff命令完全指南
    分享到: 更多 (0)

    评论 抢沙发

    • 昵称 (必填)
    • 邮箱 (必填)
    • 网址