补丁 patch

该技能用于将Git暂存变更分割成微型补丁文件,确保每个补丁具有最小影响范围、至少一个验证信号,便于代码审查和合并,包含关键词:Git补丁、微型补丁、代码审查、验证信号、版本控制、DevOps。

DevOps 0 次安装 0 次浏览 更新于 3/8/2026

名称: 补丁 描述: 从暂存的git变更中创建微型补丁(最小化切口),每个补丁至少有一个验证信号。当要求将工作分割成小的.patch文件、导出/共享差异或生成补丁而不是提交时使用。

补丁

意图

将变更雕刻成外科手术式的git补丁文件:一个连贯的变更、最小化的影响半径,并在导出前至少有一个反馈信号。

此技能将补丁视为传输工件(上下文敏感的差异),而不是神奇的交换性"合并原子"。目标是使补丁 小巧、可审查,并最大可能地干净应用。

心智模型(为什么这比看起来更难)

  • 一个git补丁文件是基于一个基底的程序:它通常不具有交换性、结合性或幂等性。
  • 基于补丁的版本控制系统(如Darcs/Pijul)努力使补丁应用顺序无关;git风格的补丁不保证这一点。
  • 因此:始终明确目标基底(通常是HEAD),保持补丁微小,并针对干净基底进行验证。

何时使用

  • “将此分割成微型补丁。”
  • “仅暂存最小变更并生成补丁文件。”
  • “保持补丁小巧,保持检查通过。”

输出格式(有意选择)

  • 默认:来自索引的git apply风格补丁。
    • 当您想要"这是暂存的变更",并且消费者将使用git apply应用时使用。
  • 可选:git am/邮件风格补丁(需要提交)。
    • 当消费者需要提交消息/作者元数据,并将使用git am应用时使用。
    • 此技能偏好非提交路径,除非用户明确要求format-patch

工作流程(外科医生原则)

1) 界定切口范围

  • 识别可以独立存在的最小变更。
  • 隔离不相关的编辑;避免无关的重构/格式化,除非对正确性必需。

2) 外科手术式暂存(非交互优先)

检查:

  • git status -sb
  • git diff

暂存您打算的内容(在非交互环境中偏好文件级暂存):

  • git add <路径...>
  • git restore --staged <路径...>

验证:

  • git diff --cached 匹配预期的切口。

如果您确实需要块级暂存但环境无法进行交互式暂存,请要求用户在本地暂存块或提供可以应用的补丁。

3) 验证微范围

  • 可选助手:scripts/micro_scope.py(暂存与非暂存的大小)。
  • 如果暂存差异涉及多个关注点,请在运行检查前分割它。

减少下游冲突的启发式方法:

  • 偏好"每个补丁一个文件或一个概念区域"。
  • 避免增加差异歧义性的相邻编辑(例如,彼此附近的不相关编辑)。
  • 避免仅格式化的噪音,除非必需;它会增加补丁上下文的脆弱性。

4) 闭合循环(必需)

  • 选择最紧密的可用信号并运行它。
  • 如果仓库的测试/检查命令不可发现,请询问首选命令。
  • 参考:references/loop-detection.md

5) 导出补丁

  • 选择输出路径,例如patches/0001-<slug>.patch

  • 导出前,理智检查是否有秘密(令牌、凭证、私钥)。如果可能,停止并询问。

  • 将暂存储更作为二进制安全补丁导出(确定性差异输出):

    • git diff --cached --binary --no-ext-diff --no-textconv --no-color > <补丁路径>
  • 验证补丁非空:

    • test -s <补丁路径>
  • 验证补丁正确性(两个级别):

    • 快速本地一致性检查(即使变更已存在于工作树中也有效):
      • git apply --check --reverse --binary <补丁路径>
    • 强检查针对干净基底(推荐在外部共享时):
      • git worktree add --detach <临时目录> HEAD
      • <临时目录>中:git apply --check --binary <补丁路径>
      • git worktree remove <临时目录>
  • 除非用户要求取消暂存或重置,否则保持暂存储更完整。

6) 重复

重复直到工作树干净或剩余变更被有意推迟。

护栏

  • 未经询问不要扩大范围。
  • 偏好最小化检查,能有效验证变更即可。
  • 没有通过信号和至少一个补丁验证步骤(反向检查或干净基底检查),不要声称完成。
  • 不要导出或共享秘密;如有疑问,在写入补丁文件前询问。
  • 除非用户要求,否则不要覆盖现有补丁文件。

关于补丁身份的注释(可选)

  • 补丁身份对于去重很重要(“我们已经应用了这个逻辑变更了吗?”)。
  • 在git生态系统中,您可以在本地使用git patch-id --stable近似这个(尽力而为,非加密)。
  • 补丁身份是基于补丁合并可能优于diff3风格合并的主要原因;参见references/patch-theory.md

资源

  • scripts/micro_scope.py
  • references/loop-detection.md
  • references/patch-theory.md