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

380

我有两个本地Git代码库,都指向同一个远程代码库。

如果我在其中一个Git代码库中运行git format-patch 1命令,如何将该补丁应用到另一个代码库中呢?

7个回答

575
注意:您可以先预览您的补丁将会做什么:
首先是统计信息:
git apply --stat a_file.patch

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

git apply --check a_file.patch

最后,您可以使用git am将您的补丁作为提交应用。这还允许您签署已应用的补丁。
这对于以后的参考可能会很有用。

git am --keep-cr --signoff < a_file.patch 

正如riverofwind评论中所指出的:

如果你在 Windows 下仅进行开发,且 autocrlf=false,则需要传递 --keep-cram 命令以保留那些 CRLF。

参考这篇文章中的示例

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

示例


25
备忘录:第200个优秀回答金徽章。 - VonC
7
为什么在执行git am < somepatch.patch时会出现“fatal: empty ident name (for <>) not allowed”错误? - birgersp
1
@gromit190 这意味着补丁中存在错误的“作者”头,和/或者您没有设置git config user.{name,email} - ulidtko
1
好的;git apply --check 显示 patch does not apply,而 git apply -3 则显示 repository lacks the necessary blob to fall back on 3-way merge. 在 git 中,重新定位提交非常容易;但是人们如何在更新的代码上重新定位他们的补丁呢? - ulidtko
1
@ulidtko 或许可以使用 https://dev59.com/3G445IYBdhLWcg3wnrrM#15375869 ? - VonC
显示剩余3条评论

306
git apply name-of-file.patch

56
这可能没有回答原来的详细问题,但是它回答了标题中的问题,这就是我访问这个页面的原因。谢谢! - Rock Lee
20
我理解这是一个老问题和答案...但我认为对于一些人来说,了解git apply和git am之间的区别可能会有所帮助。 - mgarey
1
git apply "[...文件完整路径...]/文件名.patch" - Anton Lyhin

69

或者,如果你更喜欢老派的方式:

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

9
提醒您:这样做不会创建提交,因此将丢失提交信息和作者信息。 - Caesar
2
我遇到过一些情况,在 git apply 无法工作时,这种方法可以解决,不确定原因是什么。 - Sean Breckenridge
1
无疑,在试图在没有安装 git 的机器(例如 docker 镜像)上应用由 git 生成的补丁时非常有用。 - Louis Caron
谢谢您!当“git apply”无法起作用时,这对我很有帮助。 - liberborn
1
@Amir 确定。使用管道符。如果需要在其中更改目录等,请考虑使用 有名管道 - Dominic Cooney
显示剩余2条评论

44

首先你应该注意一下 git am 和 git apply 的区别

当你使用 git am 时,通常希望应用多个补丁。因此,应该使用:

git am *.patch

或者只需:

git am

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

更新
在这里,您可以找到如何生成此类补丁的方法


1
这个区别的解释帮助我使用了 git apply .. 还有 --reverse :-) - Jordan Gee
你知道“am”代表什么吗?也许是“apply en masse”(大规模应用)的缩写? ;) - fitojb

33
如果您想将其作为提交应用,请使用git am。可以在此处查看git am的详细说明。

1
你通常是如何获取mbox文件的? - Ciro Santilli OurBigBook.com
只需使用 git apply - Sebi2020
1
@Sebi2020:git apply将更改应用为补丁,而不是提交,而git am则假定电子邮件的文本是提交消息(有一些例外情况),并应用更改创建提交(它可以尝试使用git am --3way进行三方合并解决冲突)。 - Jakub Narębski
我无法让 git am 正常工作。它在应用更改的过程中停止了,生成的提交不完整。 - KansaiRobot
@KansaiRobot:应用更改时可能会发生内容冲突,但您的评论中没有足够的信息,请发表问题并提供尽可能详细的信息。 - Jakub Narębski

26
如果你正在使用JetBrains IDE(如IntelliJ IDEA,Android Studio,PyCharm),你可以将补丁文件拖放到IDE中,并在弹出的对话框中查看补丁内容。现在你所要做的就是点击“应用补丁”,这样一个提交就会被创建。

1
@LasithaBenaragama - 有点像。SO 的目的不仅是帮助 OP,还要帮助所有关注该问题的人。这个答案(虽然有用)并没有提供一般解决方案。这会成为一个很好的小博客文章,但不是一个“SO 好”的答案。这就解释了为什么会被踩。 - OldTinfoil

0

另一种方法是将本地存储库之一添加为另一个存储库的远程存储库。

$ cd repo1
$ git remote add repo2 file:///path/to/repo2/.git

这样你就可以从一个本地仓库获取分支、将本地分支变基或者把提交的更改从一个本地仓库cherry-pick到另一个仓库中。

$ git remote update repo2
$ git fetch repo2 branch:branch-from-repo2
$ git log branch-from-repo2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接