Git 补丁(Patch)是一种用于保存和共享代码修改的方式,通常用于代码审查、离线提交和跨仓库协作。本章将介绍 Git 补丁的作用、如何生成和应用补丁,以及如何撤销和合并补丁。

15.1 为什么要使用补丁?

补丁是一种保存代码修改的文本文件,可以用于以下场景:

  1. 离线传输代码变更:当无法直接使用 git push 时,可以使用补丁文件传输更改。
  2. 代码审查:开发者可以先生成补丁,再通过邮件或其他方式提交补丁供团队审查。
  3. 跨仓库协作:如果两个仓库无法直接拉取或推送代码,补丁提供了一种变通的方法。
  4. 备份代码更改:在实验性开发时,可以使用补丁临时保存未提交的更改。

15.2 生成补丁

Git 允许将提交转换为补丁文件,以便在其他环境中应用。

15.2.1 生成单个提交的补丁

  1. git format-patch -1 HEAD

该命令会在当前目录生成一个 .patch 文件,例如:

  1. 0001-修复登录 Bug.patch

15.2.2 生成多个提交的补丁

如果需要将最近 3 次提交保存为补丁,可以使用:

  1. git format-patch -3 HEAD

或者指定提交范围,例如导出 a1b2c3dHEAD 之间的所有提交:

  1. git format-patch a1b2c3d..HEAD

15.2.3 生成单个完整补丁文件

默认情况下,format-patch 会为每个提交生成一个 .patch 文件。要生成单个补丁文件,可以使用 diff 命令:

  1. git diff a1b2c3d HEAD > changes.patch

或者仅包含暂存区的更改:

  1. git diff --cached > staged.patch

15.3 邮递补丁

Git 支持通过电子邮件发送补丁,特别适用于开源社区的代码贡献。

15.3.1 发送补丁

使用 git send-email 可以直接发送补丁(需要配置邮件账户):

  1. git send-email --to="dev@example.com" 0001-修复登录-Bug.patch

如果要一次性发送多个补丁:

  1. git send-email --to="dev@example.com" *.patch

15.3.2 接收补丁并存储

接收者可以使用 git am 命令应用补丁,而不会创建新的合并提交:

  1. git am < 0001-修复登录-Bug.patch

查看已应用的补丁:

  1. git log --oneline

15.4 应用补丁

除了 git am,Git 还提供了 git apply 命令来应用补丁。

15.4.1 使用 git apply 应用补丁

如果补丁来自 git diff,可以使用:

  1. git apply changes.patch

如果希望应用补丁并同时创建提交,可以使用:

  1. git apply --index changes.patch
  2. git commit -m "应用补丁"

15.4.2 使用 git am 处理补丁邮件

如果补丁来自 git format-patch,可以使用 git am

  1. git am 0001-修复登录-Bug.patch

15.5 取消补丁

如果应用了错误的补丁,可以使用 git apply --reverse 进行撤销:

  1. git apply --reverse changes.patch

或者使用 git reset 撤销补丁的更改:

  1. git reset --hard HEAD

15.6 补丁与合并

补丁和 Git 合并(Merge)或变基(Rebase)的主要区别:

方法 用途 影响历史 适用场景
git merge 合并分支 保留所有提交历史 分支开发
git rebase 变基 修改提交历史 清理提交历史
git apply 应用补丁 不影响提交历史 代码迁移、测试
git am 应用补丁并提交 创建新的提交 邮递补丁

结论

本章介绍了 Git 补丁的使用,包括如何生成、发送、应用和撤销补丁。补丁是 Git 的一个强大功能,适用于代码审查、跨仓库协作和备份变更。