Git Patch 导出与应用指南
在开发机上改完代码,想把改动同步到构建机验证,却不想为这堆临时改动开分支、发提交——patch 就是为这种场景准备的。
核心结论只有一句:
只要代码还在工作区、还没
git add,直接git diff生成的 patch 就能被git apply直接应用。
前置条件
- 已安装 Git
- 开发机上有一份包含改动的仓库
- 目标机器上有同一份代码(或至少目录结构一致)
当前状态与生成命令的对应关系
不同暂存状态下,需要用的命令不一样。对照下表选择:
| 当前状态 | 生成 patch 命令 | 能否被 git apply 应用 |
|---|---|---|
改了文件,没 add | git diff | ✅ 可以 |
已 git add,没 commit | git diff --cached | ✅ 可以 |
| 混合(部分 add + 部分没 add) | git diff HEAD | ✅ 最保险 |
已 commit | git format-patch / git diff commit1 commit2 | ✅ 但会带 commit 信息 |
最稳妥的一行命令
如果懒得判断当前处于哪种状态,直接用这条:
git diff HEAD > my.patch
原因:
- 不管你有没有
add - 不管你中间有没有临时
commit - 都能把当前所有改动完整打出来
在构建机上验证与应用
拿到 my.patch 后,先检查再应用:
git apply --check my.patch # 先检查能不能 apply
git apply my.patch # 真正应用
--check 只做模拟,不落盘。这一步能提前拦住绝大部分失败,避免应用到一半报错、工作区被改花。
几个容易踩的小坑
路径问题
patch 里记录的是相对路径,一定要在 git repo 根目录执行 apply。在子目录里执行会直接报找不到文件。
换行符 / 权限
Windows ↔ Linux 之间传输偶尔会出问题。加 --ignore-space-change 可救急:
git apply --ignore-space-change my.patch
二进制文件
git diff 默认不包含二进制文件内容,需要显式加 --binary:
git diff HEAD --binary > my.patch
完整流程速查
# 开发机:导出全部改动
git diff HEAD > my.patch
# 传输到构建机(scp / U 盘 / 制品库均可)
scp my.patch build@host:/path/to/repo/
# 构建机:在仓库根目录校验并应用
cd /path/to/repo
git apply --check my.patch
git apply my.patch
常见错误与排查
| 报错 | 原因 | 处理 |
|---|---|---|
error: No such file or directory | 不在仓库根目录执行 | 切到根目录重试 |
patch does not apply | 目标代码与生成 patch 时的基线不一致 | 确认两边代码版本,或用 --3way 尝试三方合并 |
| 空白/换行冲突 | 跨平台换行符差异 | 加 --ignore-space-change |
| 二进制文件缺失 | 未加 --binary | 重新生成 patch |
一句话总结
开发机上 git diff HEAD 生成的 patch,就是给 git apply 用的,不需要 commit。