Git 补丁(Patch)是一种用于记录和传输代码变更的文件格式,支持以文本形式存储代码变更,便于代码审查和共享。以下是详细的参数和操作说明:

参数细节

  • (<mbox>|<Maildir>)...:要从中读取补丁的邮箱文件列表。如果没有提供此参数,命令将从标准输入读取。如果提供目录,将被视为 Maildirs。
  • -s, --signoff:在提交信息中添加 Signed-off-by: 行,使用你自己的提交者身份。
  • -q, --quiet:安静模式。仅打印错误信息。
  • -u, --utf8:将 -u 标志传递给 git mailinfo。从邮件中提取的提议提交日志信息将重新编码为 UTF-8 编码(可以使用配置变量 i18n.commitencoding 指定项目首选编码,如果它不是 UTF-8)。可以使用 --no-utf8 覆盖此选项。
  • --no-utf8:将 -n 标志传递给 git mailinfo。
  • -3, --3way:当补丁无法干净地应用时,如果补丁记录了它应该应用到的 blob 的身份,并且我们本地有这些 blob,则回退到 3 方合并。
  • --ignore-date, --ignore-space-change, --ignore-whitespace, --whitespace=<option>, -C<n>, -p<n>, --directory=<dir>, --exclude=<path>, --include=<path>, --reject:这些标志将传递给应用补丁的 git apply 程序。
  • --patch-format:默认情况下,命令会尝试自动检测补丁格式。此选项允许用户绕过自动检测并指定补丁(们)应被视为的补丁格式。有效的格式包括 mbox、stgit、stgit-series 和 hg。
  • -i, --interactive:交互模式。
  • --committer-date-is-author-date:默认情况下,命令将邮件消息中的日期记录为提交作者日期,并使用提交创建时间为提交者日期。这允许用户通过使用与作者日期相同的值来“撒谎”关于提交者日期。
  • --ignore-date:默认情况下,命令将邮件消息中的日期记录为提交作者日期,并使用提交创建时间为提交者日期。这允许用户通过使用与作者日期相同的值来“撒谎”关于提交者日期。
  • --skip:跳过当前补丁。这仅在重新启动中断的补丁时才有意义。
  • -S[<keyid>], --gpg-sign[=<keyid>]:使用 GPG 对提交进行签名。
  • --continue, -r, --resolved:在补丁失败(例如尝试应用冲突补丁)后,用户已手动应用它,并且索引文件存储了应用的结果。使用从邮件消息中提取的作者身份和提交日志以及当前索引文件创建提交,并继续。
  • --resolvemsg=<msg>:当补丁失败时, 将在退出前显示在屏幕上。这覆盖了标准消息,告知你使用 --continue 或 --skip 来处理失败。这仅用于 git rebase 和 git am 之间的内部使用。
  • --abort:恢复原始分支并中止补丁操作。

47.1 创建补丁

创建补丁分为两个步骤:

更改并提交:对代码进行更改并提交。

运行 git format-patch:将自 <commit-reference> 以来的所有提交(不包括它)转换为补丁文件。 例如,如果需要从最新的两个提交生成补丁:

git format-patch HEAD~~

这将创建两个文件,每个文件对应自 HEAD~~ 以来的一个提交,文件名类似于:

0001-hello_world.patch
0002-beginning.patch

47.2 应用补丁

可以使用 git apply some.patch 将 .patch 文件中的更改应用到当前工作目录。这些更改将不会被暂存,需要手动提交。 要将补丁作为提交(带有其提交信息)应用,使用:

git am some.patch

要将所有补丁文件应用到树中,使用:

git am *.patch