Skip to content

git-apply

将补丁应用于文件和/或索引

概要

bash
git apply [--stat] [--numstat] [--summary] [--check]
	  [--index | --intent-to-add] [--3way] [--ours | --theirs | --union]
	  [--apply] [--no-add] [--build-fake-ancestor=<file>] [-R | --reverse]
	  [--allow-binary-replacement | --binary] [--reject] [-z]
	  [-p<n>] [-C<n>] [--inaccurate-eof] [--recount] [--cached]
	  [--ignore-space-change | --ignore-whitespace]
	  [--whitespace=(nowarn|warn|fix|error|error-all)]
	  [--exclude=<path>] [--include=<path>] [--directory=<root>]
	  [--verbose | --quiet] [--unsafe-paths] [--allow-empty] [<patch>...]

描述

读取提供的差异输出(即"补丁")并将其应用于文件。从存储库中的子目录运行时,目录之外的已修补路径将被忽略。使用 --index 选项时,补丁也应用于索引;使用 --cached 选项时,补丁仅应用于索引。没有这些选项时,命令仅将补丁应用于文件,并且不需要它们在 Git 存储库中。

此命令应用补丁但不创建提交。使用 git-am(1)git-format-patch(1) 生成的补丁和/或通过电子邮件接收的补丁创建提交。

选项

<patch>...

要读取补丁的文件。可以使用 - 从标准输入读取。

--stat

不应用补丁,而是输出输入的 diffstat。关闭"apply"。

--numstat

类似于 --stat,但以十进制表示法显示添加和删除的行数,并且路径名不缩写,使其更加机器友好。对于二进制文件,输出两个 - 而不是 0 0。关闭"apply"。

--summary

不应用补丁,而是输出从 git diff 扩展头(如创建、重命名和模式更改)获得的信息的简明摘要。关闭"apply"。

--check

不应用补丁,而是检查补丁是否可应用于当前工作树和/或索引文件并检测错误。关闭"apply"。

--index

将补丁应用于索引和工作树(如果 --check 生效,则仅检查是否可以干净地应用于两者)。请注意,--index 要求相关路径的索引条目和工作树副本相同(它们的内容和元数据(如文件模式)必须匹配),即使补丁可以单独干净地应用于索引和工作树,如果它们不匹配也会引发错误。

--cached

将补丁仅应用于索引,不接触工作树。如果 --check 生效,则仅检查是否可以干净地应用于索引条目。

-N, --intent-to-add

当仅将补丁应用于工作树时,标记新文件稍后将添加到索引(参见 git-add(1) 中的 --intent-to-add 选项)。如果使用 --index--cached,则忽略此选项,并且在 Git 存储库之外无效。请注意,--index 可能被其他选项(如 --3way)隐含。

-3, --3way

如果补丁记录了它应该应用的 blob 的身份并且我们在本地有这些 blob 可用,则尝试三方合并,可能会在工作树中的文件中留下冲突标记供用户解决。此选项隐含 --index 选项(除非使用 --cached 选项),并且与 --reject 选项不兼容。与 --cached 选项一起使用时,任何冲突都留在缓存的更高阶段。

--ours, --theirs, --union

不是在文件中留下冲突,而是解决有利于我们(或他们或两者)一方的冲突。需要 --3way。

--build-fake-ancestor=<file>

较新的 'git diff' 输出为每个 blob 嵌入了 'index information' 以帮助标识补丁应用的原始版本。当给出此标志且 blob 的原始版本在本地可用时,构建包含这些 blob 的临时索引。 当遇到纯模式更改(没有索引信息)时,改为从当前索引读取信息。

-R, --reverse

反向应用补丁。

--reject

为了原子性,'git apply' 默认在某些块无法应用时使整个补丁失败并且不接触工作树。此选项使其应用补丁的可应用部分,并将被拒绝的块留在相应的 *.rej 文件中。

-z

当已给出 --numstat 时,不修改路径名,而是使用 NUL 终止的机器可读格式。 没有此选项时,具有"异常"字符的路径名将按配置变量 core.quotePath 中说明的方式引用(参见 git-config(1))。

-p<n>

从传统差异路径中删除 <n> 个前导路径组件(由斜杠分隔)。例如,使用 -p2,针对 a/dir/file 的补丁将直接应用于 file。默认值为 1。

-C<n>

确保每个更改之前和之后至少有 <n> 行周围上下文匹配。当存在的周围上下文行较少时,它们都必须匹配。默认情况下永远不会忽略上下文。

--unidiff-zero

默认情况下,'git apply' 期望正在应用的补丁是至少有一行上下文的统一差异。这提供了良好的安全措施,但在应用使用 --unified=0 生成的差异时会失效。要绕过这些检查,请使用 --unidiff-zero。 请注意,由于上述原因,不鼓励使用无上下文补丁。

--apply

如果你使用上面标记为"关闭 'apply'"的任何选项,'git apply' 会读取并输出请求的信息而不实际应用补丁。在这些标志之后给出此标志也可应用补丁。

--no-add

应用补丁时,忽略补丁所做的添加。这可用于通过首先对两个文件运行 'diff' 并使用此选项应用结果来提取两个文件之间的公共部分,这将应用删除部分但不应用添加部分。

--allow-binary-replacement, --binary

历史上,我们不允许在没有用户明确许可的情况下应用二进制补丁,此标志是这样做的方式。目前,我们始终允许二进制补丁应用,因此这是一个空操作。

--exclude=<path-pattern>

不要将更改应用于与给定路径模式匹配的文件。当导入补丁集时,如果你想排除某些文件或目录,这很有用。

--include=<path-pattern>

将更改应用于与给定路径模式匹配的文件。当导入补丁集时,如果你想包含某些文件或目录,这很有用。 当使用 --exclude--include 模式时,它们按命令行上出现的顺序进行检查,第一个匹配项决定是否使用每个路径的补丁。如果不匹配任何包含/排除模式的路径的补丁在命令行上没有包含模式时默认使用,如果有任何包含模式则被忽略。

--ignore-space-change, --ignore-whitespace

应用补丁时,如果需要,忽略上下文行中的空白更改。上下文行将保留其空白,并且无论 --whitespace 选项的值如何,它们都不会进行空白修复。但是,新行仍将被修复。

--whitespace=<action>

应用补丁时,检测具有空白错误的新行或修改行。什么是空白错误由 core.whitespace 配置控制。默认情况下,尾随空白(包括仅由空白组成的行)和行初始缩进中紧跟制表符的空格字符被视为空白错误。 默认情况下,命令输出警告消息但应用补丁。当 git-apply 用于统计而不是应用补丁时,它默认为 nowarn。 你可以使用不同的 <action> 值来控制此行为:

  • nowarn 关闭尾随空白警告。
  • warn 为此类错误输出警告,但按原样应用补丁(默认)。
  • fix 为此类错误输出警告,并在修复后应用补丁(strip 是同义词)。
  • error 为此类错误输出警告,并拒绝应用补丁。
  • error-all 类似于 error 但显示所有错误。

--inaccurate-eof

在某些情况下,某些版本的 'diff' 无法正确检测文件末尾缺少的换行符。因此,此类 'diff' 程序创建的补丁无法正确记录不完整的行。此选项通过解决此错误添加了对此类补丁应用的支持。

-v, --verbose

向 stderr 报告进度。默认情况下,仅打印有关当前正在应用的补丁的消息。此选项将导致报告额外信息。

-q, --quiet

抑制 stderr 输出。不会打印有关补丁状态和进度的消息。

--recount

不信任块头中的行数,而是通过检查补丁来推断它们(例如在编辑补丁后未适当地调整块头)。

--directory=<root>

将 <root> 添加到所有文件名前面。如果还传递了 "-p" 参数,则在添加新根之前应用它。 例如,一个关于将 a/git-gui.sh 更新为 b/git-gui.sh 的补丁可以通过运行 git apply --directory=modules/git-gui 应用于工作树中的文件 modules/git-gui/git-gui.sh

--unsafe-paths

默认情况下,影响工作区域之外(Git 控制的工作树,或使用 "git apply" 作为 GNU patch 替代品时的当前工作目录)的补丁会被作为错误(或恶意行为)拒绝。 当 git apply 用作"更好的 GNU patch"时,用户可以传递 --unsafe-paths 选项来覆盖此安全检查。当使用 --index--cached 时,此选项无效。

--allow-empty

对于不包含差异的补丁不返回错误。这包括空补丁和仅包含提交文本的补丁。

配置

apply.ignoreWhitespace

当设置为 'change' 时,告诉 'git apply' 忽略空白更改,与 --ignore-space-change 选项相同。当设置为:no、none、never、false 之一时,告诉 'git apply' 尊重所有空白差异。参见 git-apply(1)

apply.whitespace

告诉 'git apply' 如何处理空白,与 --whitespace 选项相同。参见 git-apply(1)

子模块

如果补丁包含对子模块的任何更改,则 'git apply' 按如下方式处理这些更改。

如果指定了 --index(显式或隐式),则子模块提交必须与索引完全匹配才能应用补丁。如果任何子模块已检出,则这些检出被完全忽略,即它们不需要是最新的或干净的,并且不会被更新。

如果未指定 --index,则补丁中的子模块提交将被忽略,并且仅检查(如果可能更新)相应子目录的存在或不存在。

另请参阅

git-am(1)

Git

git(1) 套件的一部分

基于 CC BY-NC-SA 3.0 许可发布