如何应用使用 git format-patch 生成的补丁?

Posted

技术标签:

【中文标题】如何应用使用 git format-patch 生成的补丁?【英文标题】:How to apply a patch generated with git format-patch? 【发布时间】:2011-01-16 00:44:13 【问题描述】:

我有两个本地 git 存储库,都指向 same 远程存储库。

在一个 git 存储库中,如果我执行git format-patch 1,我如何将该补丁应用到另一个存储库?

【问题讨论】:

【参考方案1】:

注意:你可以先预览一下你的补丁会做什么:

首先是统计数据:

git apply --stat a_file.patch

然后进行试运行以检测错误:

git apply --check a_file.patch

最后,您可以使用 git am 将补丁应用为提交。这也允许您sign off 应用的补丁。 这对以后的参考很有用。

git am --signoff < a_file.patch 

查看example in this article:

在你的 git 日志中,你会发现提交消息包含一个“Signed-off-by”标签。 Github 和其他人将读取此标签,以提供有关提交如何在代码中结束的有用信息。

【讨论】:

自我说明:第 200 个最佳答案金徽章。 git am &lt; somepatch.patch 产生“致命:不允许空标识名称(对于 )”。谁能给我解释一下为什么? @gromit190 表示补丁中有错误的 Author 标头,和/或您没有 git config user.name,email 好的; git apply --check 表示 patch does not applygit apply -3 表示 repository lacks the necessary blob to fall back on 3-way merge. 在 git 中,rebase 提交是如此轻而易举;但是人们如何在更新的代码之上重新定位他们的补丁 @ulidtko 也许是***.com/a/15375869/6309 ?【参考方案2】:
git apply name-of-file.patch

【讨论】:

这可能没有回答最初的详细问题,但它回答了标题中的问题,这就是我出现在这个页面上的原因。谢谢! 我知道这是一个古老的问题和答案......但我认为这可能有助于某些人理解difference between git apply and git am。 git apply "[...文件的完整路径...]/name-of-file.patch"【参考方案3】:

或者,如果你是老派:

cd /path/to/other/repository
patch -p1 < 0001-whatever.patch

【讨论】:

请注意:这不会创建提交,因此会丢失提交消息和作者信息。 我遇到过一些情况,git apply 不起作用,不知道为什么 如果您尝试将补丁应用到 Git 忽略的路径或文件并且您有 Git 格式的补丁,这将非常有用。【参考方案4】:

首先你应该记下git amgit apply之间的difference

当您使用git am 时,您通常想要应用许多补丁。因此应该使用:

git am *.patch

或者只是:

git am

Git 会自动查找补丁并按顺序应用它们;-)

UPDHere你可以找到如何生成这样的补丁

【讨论】:

这种对差异的解释帮助我使用git apply .. 和--reverse :-) ?【参考方案5】:

如果您想将其应用为作为提交,请使用git am。

【讨论】:

您通常如何首先获取 mbox 文件? 或者直接使用git apply @Sebi2020 : git apply 将更改应用为补丁,而不是提交,而git am 假定电子邮件的文本是提交消息(有一些例外)并应用更改创建提交(它可以尝试通过与git am --3way 进行三向合并来解决冲突。 我无法让git am 工作。它在中间停止应用更改并且生成的提交不完整 @KansaiRobot :应用更改时可能存在内容冲突,但您的评论中没有足够的信息;请将问题作为问题发布,尽可能详细。【参考方案6】:

如果您使用的是 JetBrains IDE(如 IntelliJ IDEA、android Studio、PyCharm),您可以将补丁文件拖放到 IDE 中,然后会出现一个对话框,显示补丁的内容。您现在所要做的就是点击“Apply patch”,然后就会创建一个提交。

【讨论】:

谢谢。这对每个人都非常有用。有一个公认的答案。但这也很有用。 @ambarox 但是这个答案被否决了一次,我不知道为什么 可能有人认为应用补丁的唯一方法是通过命令行。 :D 我给了你一个赞成票。干杯伙伴。 @LasithaBenaragama - 有点像。 SO 不仅是为了帮助 OP,而且是为了帮助所有跟随的人。这个答案(虽然有用)没有提供一般的解决方案。这将是一篇很棒的小博客文章,但不是一个“很好”的答案。会解释否决票!

以上是关于如何应用使用 git format-patch 生成的补丁?的主要内容,如果未能解决你的问题,请参考以下文章

“git format-patch”和“git diff”有啥区别?

git format-patch的使用

痞子衡嵌入式:第一本Git命令教程- 提交(commit/format-patch/am)

git merge --squash & git format-patch 将多个commit生成一个patch

利用 git format-patch 和 git send-email 把修改的 patch 文件发送给 ffmpeg-devel

从邮件列表应用 git 补丁