文章目录

  • 1. 命令概述
  • 2. 命令格式
  • 3.基本用法
    • 3.1 检查补丁是否能成功应用
    • 3.2 应用补丁到工作区
    • 3.3 应用补丁并直接暂存
  • 4. 高级用法
    • 4.1 应用不精确匹配的补丁
    • 4.2 统计应用信息
    • 4.3 反向应用补丁(撤销更改)
    • 4.4 从标准输入读取补丁
  • 5. 注意事项
  • 6. 补充信息

1. 命令概述

git apply 命令的主要功能是将一个补丁(patch)应用到你的工作目录和/或暂存区。它读取一个补丁文件(通常由 git diffdiff -u 命令生成),并根据补丁内容修改你本地仓库中的文件。

它与 git am(应用邮箱格式的补丁序列)的主要区别在于:

  • git apply:直接应用补丁到工作区/暂存区,不会创建新的提交。你需要手动 git addgit commit
  • git am:专为处理 git format-patch 生成的补丁序列设计,它会自动创建新的提交,包括作者、日期和提交信息。

2. 命令格式

git apply [选项] <补丁文件>
  • <补丁文件>: 补丁文件的路径。如果未提供,则从标准输入(stdin)读取。

3.基本用法

3.1 检查补丁是否能成功应用

在真正应用补丁之前,强烈建议先检查补丁是否会产生冲突或错误。这就像一次“演习”。

git apply --check <补丁文件>

如果命令没有输出,则表示补丁可以干净地应用。如果存在冲突,它会显示错误信息,例如:

error: patch failed: path/to/file.txt:13

3.2 应用补丁到工作区

这是最直接的用法,它将修改直接应用到你的工作目录的文件中,但不会将这些修改添加到暂存区。

git apply <补丁文件>

应用后,你可以使用 git diff 查看工作区的变化,然后手动 git addgit commit

3.3 应用补丁并直接暂存

如果你希望应用补丁的同时,将更改的内容直接放入暂存区(就像你已经执行了 git add),可以使用 --cached--index 选项。

git apply --cached <补丁文件>
# 或者
git apply --index <补丁文件>

应用后,工作区的文件被修改,并且这些修改已经被添加到了暂存区,你只需要执行 git commit 即可。

注意:如果补丁中包含新文件的创建,--cached 需要与 -3(三方合并)选项一起使用才能正确暂存新文件。

4. 高级用法

4.1 应用不精确匹配的补丁

当补丁的上下文行(补丁中 @@ -x,y +a,b @@ 周围的行)与当前文件不完全匹配时,默认 git apply 会报错。以下选项可以处理这种情况:

  • --reject非常有用的选项。它会应用所有能成功应用的“块”(hunk),而对于那些有冲突的块,它会将冲突部分写入原文件对应的 .rej 文件(例如 file.txt.rej)中,并继续处理补丁的其他部分。你需要手动解决 .rej 文件中的冲突。
  • -3 / --3way推荐使用。当补丁不能精确匹配时,Git 会尝试进行一个三方合并。它使用补丁中的更改、当前文件的内容(你的版本)和该文件的基版本(通过补丁上下文推断或Blob ID查找)来自动解决冲突。这比 --reject 更智能,成功率更高。
git apply -3 <补丁文件>    

4.2 统计应用信息

使用 --stat 选项,它不会真正应用补丁,而是像 git diff --stat 一样,显示一个摘要,告诉你哪些文件会被修改以及每个文件有多少处增删。

git apply --stat <补丁文件>

输出示例:

path/to/file.txt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-)

4.3 反向应用补丁(撤销更改)

-R--reverse 选项可以尝试撤销补丁所引入的更改。这在需要回滚某个特定补丁时非常方便。

git apply -R <补丁文件>

注意:反向应用同样可能因为代码变化而产生冲突。

4.4 从标准输入读取补丁

当补丁是通过管道传递过来时,这个功能非常有用。

# 例如,从一个URL获取补丁并应用
curl -s http://example.com/patch.patch | git apply
# 或者,从另一个git命令获取
git diff some-commit | git apply

5. 注意事项

  1. 不会创建提交:这是 git apply 最核心的特点。它只修改工作区和/或暂存区,你需要手动完成提交。这给了你审查和修改的机会。
  2. 先检查,后应用:养成使用 git apply --check 的好习惯,可以避免弄乱工作区。
  3. 理解 .rej 文件:如果使用 --reject 选项,请务必检查并处理所有生成的 .rej 文件。解决完所有冲突后,记得删除这些 .rej 文件。
  4. 三方合并是首选:在处理不匹配的补丁时,优先尝试 -3(三方合并)选项,它比简单的 --reject 更强大。
  5. 补丁格式:确保补丁文件是统一的 diff 格式(unified diff),这是 git diff 的默认格式,也是 git apply 期望的格式。

6. 补充信息

典型工作流示例
假设你收到了一个名为 feature.patch 的补丁文件,你可以按照以下步骤安全地应用它:
1。 检查补丁

git apply --check feature.patch    

(如果无错误输出,继续下一步)
2。试应用并查看统计(可选):

git apply --stat feature.patch    

3。应用补丁(选择以下一种):

  • 应用到工作区
git apply feature.patch        
git add -u        
git commit -m "Apply the feature.patch"        
  • 应用并暂存
git apply --cached feature.patch        
git commit -m "Apply the feature.patch"        
  • 如果补丁不匹配,使用三方合并
git apply -3 feature.patch        
# 如果有冲突,解决冲突,然后 add & commit        
git add -u        
git commit -m "Apply the feature.patch with 3-way merge"       
Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐