1. 生成单个提交的 patch
# 生成最近1个提交的patch
git format-patch -1
# 生成指定提交的patch(使用commit hash)
git format-patch -1 abc1234
# 输出示例:
0001-Add-new-feature.patch
- 特点:生成
.patch
文件,包含提交信息和变更内容 - 适用场景:发送单个功能修改给他人审查
2. 生成多个提交的 patch 序列
# 生成最近3个提交的patch(按时间倒序)
git format-patch -3
# 生成两个提交之间的patch
git format-patch abc1234..def5678
输出示例:
0001-Fix-bug-1.patch
0002-Refactor-code.patch
0003-Update-docs.patch
- 编号规则:前缀数字表示提交顺序
- 注意事项:提交范围是左开右闭区间
3. 生成未提交的改动为 patch
# 生成工作区改动的patch
git diff > my_changes.patch
# 生成暂存区改动的patch
git diff --cached > staged.patch
# 生成工作区+暂存区全部改动
git diff HEAD > all_changes.patch
- 特点:生成普通diff格式,不含提交信息
- 适用场景:快速分享未提交的临时修改
4. 生成二进制文件改动
git format-patch -1 --binary
- 作用:在patch中包含二进制文件变化(如图片、压缩包等)
5. 自定义 patch 输出
# 指定输出目录
git format-patch -1 -o ~/patches/
# 添加cover letter(用于patch系列说明)
git format-patch -3 --cover-letter
# 修改patch前缀命名
git format-patch -2 --numbered-files
输出文件名变为:0001
, 0002
代替默认的提交信息命名
6. 应用 patch 文件
# 检查patch是否能应用(试运行)
git apply --check my.patch
# 应用patch(不创建提交)
git apply my.patch
# 应用并自动创建提交(推荐)
git am 0001-Add-feature.patch
- 区别:
git apply
只修改文件git am
会保留原提交信息
7. 高级用法
生成RPM风格的patch:
git diff --no-prefix > no_prefix.patch
生成指定文件的patch:
git format-patch -1 -- include/header.h src/main.c
生成合并提交的patch:
git format-patch -1 --stdout <merge_commit> > merge.patch
常见问题解决
-
patch应用冲突:
git am --reject 0001-fix.patch # 生成.rej文件手动解决
-
修改patch元信息:
git filter-repo --mailmap my_mailmap.txt # 批量修改作者信息
-
压缩patch大小:
git format-patch -1 --no-stat -U1 # 减少上下文行数
工作流程建议
- 代码审查:使用
git format-patch
生成patch邮件发送给维护者 - 持续集成:将patch作为CI测试的输入
- 版本维护:用patch队列管理稳定版的后移植(backport)修改
通过合理使用patch机制,可以实现:
✅ 离线代码交换
✅ 精确控制修改范围
✅ 保留完整提交历史
✅ 跨仓库代码迁移