git format-patch生成的补丁才真正适合Git项目间传递;它含作者、时间、提交信息等元数据,可被git am还原为完整提交,而git diff仅输出纯文本差异,无元数据,适用于临时备份或跨非Git环境。

直接用 git diff 或 git format-patch 就能导出补丁,但选哪个、怎么用、为什么有时打不上——关键看你的变更状态和是否要保留提交元信息。
git diff > patch 是最简方式,但只适合未提交修改
它把工作区(working directory)和暂存区(index)的差异写成统一 diff 格式,不带作者、时间、提交信息:
- 适用场景:临时备份当前改了哪些行,或快速同步到另一台没 Git 的机器
- 命令就是
git diff > my-fix.patch,如果只想导出某几个文件,加路径:git diff src/main.c utils/log.h > partial.patch - 常见错误:运行后 patch 文件为空 → 检查是否真有未提交改动,
git status看一眼;或者文件是新建未git add的,git diff默认不包含它们 - 注意:
git diff --cached才导出已add但未commit的内容;git diff HEAD导出工作区 vs 最近一次提交的全部差异
git format-patch 生成带元数据的补丁,用于协作或邮件提交
它输出的是 RFC 2822 邮件格式补丁,含作者、日期、Subject、Signed-off-by,git am 能原样还原为 commit:
- 导出最近 1 个提交:
git format-patch -1 HEAD→ 生成类似0001-Fix-null-pointer-deref.patch - 导出从某分支起所有新提交:
git format-patch origin/main..HEAD - 必须加
-s参数才插入Signed-off-by行,否则合入时原始作者可能被覆盖为应用者 - 坑点:如果目标分支没有该 patch 中引用的父 commit,
git am会失败;此时先git am --3way或手动git apply+git commit
新增文件没进 patch?那是没暂存
git diff 默认只比较已追踪文件,新建文件(untracked)不会出现在输出里。想一并打包,必须先 git add:
OpenClaw 技能 — 给定一个 GitHub 仓库 URL,自动解析出 owner/repo 名称,发现其中的 YAML/properties 配置文件及其配对的中文字段说明;在 `workspace/{repo}/` 目录下按同步日期(格式为 `YYYY-MM-DD`)创建时间戳子目录;写入 `.openclaw-config-state.json` 状态文件。每次用户提问前,先比对远程仓库当前 ref(如 `main` 或 `master`)的最新提交 SHA 与本地状态文件中记录的 SHA:
- 正确流程:
git add .→git diff --cached > full.patch - 或者一步到位:
git add . && git diff --cached > full.patch && git reset(避免误提交) - 别用
git diff --no-index对新建文件硬凑 —— 它不兼容 Git 补丁标准,git apply会报错 “unable to find”
打补丁前务必检查兼容性
补丁不是万能胶,尤其当代码结构已变,盲目 git apply 可能静默失败或错位修改:
- 先验证:
git apply --check my.patch,无输出才表示可安全应用 - 有冲突时加
--reject,成功部分自动打上,冲突块写入.rej文件,得人工处理 - 如果补丁来自
format-patch,优先用git am my.patch,它会尝试三路合并(--3way),比apply更鲁棒 - 路径不一致?补丁里写的
a/src/main.c/b/src/main.c前缀可能和你当前仓库结构对不上,用-p1或-p2调整 strip 层数
真正容易被忽略的是上下文行数:默认 3 行,但如果目标代码被大量重排过,-U5 或 --unified=5 能显著提升匹配成功率,尤其在 CI 自动打补丁场景里。










