如何使用git 生成patch

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用git 生成patch相关的知识,希望对你有一定的参考价值。

1,下载代码
git clone git://git.kernel.org/pub/scm/linux/kernel/git/padovan/bluetooth-next-2.6.git
cd bluetooth-next-2.6
2,修改代码
vi drivers/bluetooth/btusb.c
3,把代码添加到git管理仓库
git add drivers/bluetooth/btusb.c
4,提交修改
git commit -m "Added atheros3012 Chip Firmware download support"
5,查看日志
git log <== to git the previous commit hash code.
6,生成patch
git format-patch -s 1bbe3c8c197a35f79bfddaba099270a2e54ea9c7
please replace the hash code with your repo previous commit.
then you can find the patch under repo directory.
then mail your patch to configuration admin.
或者使用
git format-patch HEAD^ <==最近的1次commit的patch
git format-patch HEAD^^ <==最近的2次commit的patch
git format-patch HEAD^ <==最近的3次commit的patch
git format-patch HEAD^ <==最近的4次commit的patch
git format-patch HEAD^^^^^ <==不支持!!!!error!!!

7,退回去
git reset --hard 1bbe3c8c197a35f79bfddaba099270a2e54ea9c7

8.将补丁打上去。
patch -p1 < 0001-Added-liuxingde-test.patch
注: 0001-Added-liuxingde-test.patch为想要打的补丁的名字。运行该命令需在git项目的要目录下。
参考技术A git diff -p hash1 hash2,可以生成两个hash之间的patch了

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

【中文标题】如何应用使用 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 生成patch的主要内容,如果未能解决你的问题,请参考以下文章

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

如何使用git 生成patch

git如何在自动生成补丁时指定补丁名的起始编号

Git基础-生成Patch和使用Patch

git如何生成单个文件的补丁

如何在 git add --patch 中使用 --color-words?