最直接生成补丁文件的方式是 git diff commit-A commit-B > diff.patch,默认输出统一格式补丁,支持 git apply 还原;若需邮件格式多提交补丁,则用 git format-patch。

git diff 生成补丁文件最直接的方式
用 git diff 直接输出两个 commit、分支或 tag 之间的差异为可读文本或补丁格式。默认输出是统一格式(unified diff),适合人工阅读;加 -p 或 --patch 参数(其实默认就带)可确保包含完整函数上下文,方便代码审查。
- 如果只是看差异,运行:
git diff commit-A commit-B > diff.patch - 想让补丁能被
git apply或patch命令还原,必须用--no-prefix或保留默认前缀(a/和b/)——多数情况下保留更安全 - 注意:如果目标 commit 不在当前分支历史中(比如已 rebase 掉),
git diff仍能工作,因为它只比对 tree 对象,不依赖提交链
git format-patch 更适合跨仓库分发
git format-patch 不是简单 diff,而是把每次提交转成带邮件头的补丁文件,天然支持多 commit 打包、作者信息保留、编码处理,也兼容 git am 还原。
- 单个差异:
git format-patch -1 commit-B --stdout > patch.mbox(注意这里是-1,不是HEAD~1) - 两个点之间所有提交:
git format-patch commit-A..commit-B→ 生成多个0001-xxx.patch文件 - 如果只想打包差异而不关心提交粒度,加
--root并配合--no-stat减少冗余信息
常见错误:diff 输出为空或路径不一致
git diff 默认只比较工作区和 index,或 index 和 HEAD —— 容易误以为它在比两个历史版本,结果输出空。
- 确保显式指定两个 tree-ish:
git diff branch1 branch2,而不是git diff branch1 - 如果用了
git diff --name-only后再手动挑文件 diff,记得加上-p,否则没内容 - Windows 上行尾符(CRLF)可能干扰补丁应用,建议提前设置
core.autocrlf=false,或用--ignore-space-at-eol(仅限查看)
输出压缩包时别漏掉元数据
单纯 zip diff.patch 往往不够。别人收到后可能不知道该打到哪个基础版本上。
- 在压缩包里加一个
README.md,写明:base commit: abc1234、target branch: dev、是否含 submodule 变更 - 若补丁涉及二进制文件,
git diff默认不输出内容,需加--binary参数,且接收方必须用git apply --binary - 大型差异建议用
git archive配合git diff --name-only先导出变更文件列表,再打包源码快照,比纯 patch 更鲁棒
补丁不是“一次生成,到处能用”,尤其跨 Git 版本或不同配置时,git apply --check 是必走一步,但很多人跳过。











