git format-patch 、git diff 与 git apply

在 Git 中,生成和应用补丁(patch)是常见的协作方式,尤其适用于未直接推送到远程仓库的代码更改。以下是完整的操作指南:


一、生成 Patch(补丁文件)

1. 生成最近一次提交的补丁

bash 复制代码
git format-patch -1

这会生成一个 .patch 文件,命名格式为 0001-<提交信息>.patch。

2. 生成最近 N 次提交的补丁

bash 复制代码
git format-patch -3

生成最近 3 次提交的补丁文件。

3. 生成两个 commit 之间的补丁

bash 复制代码
git format-patch <起始commit>..<结束commit>

例如:

bash 复制代码
git format-patch a1b2c3d..e4f5g6h

4. 生成所有未推送到远程的提交补丁

bash 复制代码
git format-patch origin/main

将当前分支相对于 origin/main 的所有提交生成补丁。

5. 生成单个文件的补丁(不基于提交)

bash 复制代码
git diff > my_changes.patch

生成当前工作区与暂存区的差异补丁(未提交的更改)。

6. 生成暂存区与上次提交的补丁

bash 复制代码
git diff --staged > staged_changes.patch

二、应用 Patch(打补丁)

1. 使用 git apply(适用于所有 patch 格式)

bash 复制代码
git apply <patch文件>

特点:

  • 不会自动创建提交
  • 静默应用,无额外信息
  • 适用于 git diff 生成的补丁

检查补丁是否可应用:

bash 复制代码
git apply --check <patch文件>

2. 使用 git am(适用于 format-patch 生成的补丁)

bash 复制代码
git am <patch文件>

特点:

  • 自动创建提交
  • 保留作者、日期、提交信息
  • 更适合邮件协作场景

处理冲突:

bash 复制代码
# 解决冲突后
git add <解决的文件>
git am --continue

# 跳过当前补丁
git am --skip

# 终止应用
git am --abort

3. 应用多个补丁文件

bash 复制代码
git am *.patch

按文件名顺序依次应用所有 .patch 文件。


三、常用参数对比

命令 生成方式 应用方式 是否自动提交
git diff > patch git diff git apply 否
git format-patch 基于提交 git am 是

四、实际工作流程示例

场景:本地提交待分享

bash 复制代码
# 1. 提交更改
git add .
git commit -m "修复登录页面样式问题"

# 2. 生成补丁
git format-patch -1
# 生成: 0001-修复登录页面样式问题.patch

# 3. 发送补丁给同事(邮件/即时通讯)

场景:接收补丁并应用

bash 复制代码
# 1. 保存补丁文件到项目目录
# 2. 检查补丁
git apply --check 0001-修复登录页面样式问题.patch

# 3. 应用并提交
git am 0001-修复登录页面样式问题.patch

五、高级用法

1. 带统计信息的补丁

bash 复制代码
git format-patch -1 --stat

2. 添加签名

bash 复制代码
git format-patch -1 --signoff

3. 输出到指定目录

bash 复制代码
git format-patch -1 -o patches/

4. 应用补丁时添加签名

bash 复制代码
git am --signoff <patch文件>

六、注意事项

编码问题:补丁文件使用 UTF-8 编码,跨平台时注意换行符。

空行问题 :git am 对格式要求严格,确保补丁来自 git format-patch。

冲突处理:遇到冲突优先手动解决,不要强制应用。

文件路径:补丁中的路径相对于项目根目录,应用时需在正确位置。

相关推荐
挖掘狂人2 天前
Git 从 0 到 1:用一个小项目走完 add / commit / reset / merge / rebase / push
git·后端·github
codigger2 天前
Git 三区域模型:把 add、commit、reset、merge 一次讲透
git·github·编程·编程语言
水饺编程2 天前
第1章:开发环境搭建,在 Windows 中安装 Git
linux·c语言·汇编·git·ubuntu
idanzk2 天前
Git 推送 GitHub 报 SSL_READ /src refspec main 不匹配 完整踩坑记录
git·github·ssl
星恒随风2 天前
Linux开发工具详解(二):Git版本控制、GitHub协作与GDB调试实战
linux·笔记·git·学习·github
寺中人2 天前
Xshell 完全入门指南:从安装到实战,远程连接+文件传输+会话管理全拆解
git·ssh·github·php·远程连接·xshell·运维工具
酬谢神明则必安2 天前
git学习记录01
linux·git·学习
lingchen19062 天前
版本控制 Git源代码项目管理
git
虫无涯2 天前
Coverity 如何结合 GJB8114-2013使用?
git·单元测试·嵌入式测试·coverity·静态扫描
喵本喵叁肆3 天前
Git 深度解读:从对象模型到分支指针,把版本控制的内核讲透
git