跳到主要内容

Git Patch 导出与应用指南

在开发机上改完代码,想把改动同步到构建机验证,却不想为这堆临时改动开分支、发提交——patch 就是为这种场景准备的。

核心结论只有一句:

只要代码还在工作区、还没 git add,直接 git diff 生成的 patch 就能被 git apply 直接应用。

前置条件​

  • 已安装 Git
  • 开发机上有一份包含改动的仓库
  • 目标机器上有同一份代码(或至少目录结构一致)

当前状态与生成命令的对应关系​

不同暂存状态下,需要用的命令不一样。对照下表选择:

当前状态生成 patch 命令能否被 git apply 应用
改了文件,没 addgit diff✅ 可以
已 git add,没 commitgit diff --cached✅ 可以
混合(部分 add + 部分没 add)git diff HEAD✅ 最保险
已 commitgit 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。