名称: 补丁 描述: 从暂存的git变更中创建微型补丁(最小化切口),每个补丁至少有一个验证信号。当要求将工作分割成小的.patch文件、导出/共享差异或生成补丁而不是提交时使用。
补丁
意图
将变更雕刻成外科手术式的git补丁文件:一个连贯的变更、最小化的影响半径,并在导出前至少有一个反馈信号。
此技能将补丁视为传输工件(上下文敏感的差异),而不是神奇的交换性"合并原子"。目标是使补丁 小巧、可审查,并最大可能地干净应用。
心智模型(为什么这比看起来更难)
- 一个git补丁文件是基于一个基底的程序:它通常不具有交换性、结合性或幂等性。
- 基于补丁的版本控制系统(如Darcs/Pijul)努力使补丁应用顺序无关;git风格的补丁不保证这一点。
- 因此:始终明确目标基底(通常是
HEAD),保持补丁微小,并针对干净基底进行验证。
何时使用
- “将此分割成微型补丁。”
- “仅暂存最小变更并生成补丁文件。”
- “保持补丁小巧,保持检查通过。”
输出格式(有意选择)
- 默认:来自索引的
git apply风格补丁。- 当您想要"这是暂存的变更",并且消费者将使用
git apply应用时使用。
- 当您想要"这是暂存的变更",并且消费者将使用
- 可选:
git am/邮件风格补丁(需要提交)。- 当消费者需要提交消息/作者元数据,并将使用
git am应用时使用。 - 此技能偏好非提交路径,除非用户明确要求
format-patch。
- 当消费者需要提交消息/作者元数据,并将使用
工作流程(外科医生原则)
1) 界定切口范围
- 识别可以独立存在的最小变更。
- 隔离不相关的编辑;避免无关的重构/格式化,除非对正确性必需。
2) 外科手术式暂存(非交互优先)
检查:
git status -sbgit 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.pyreferences/loop-detection.mdreferences/patch-theory.md