如何从一个以上的提交git补丁到一个文件?

时间:2017-05-05 15:00:17

标签: git linux-kernel

我正在尝试按照https://kernelnewbies.org/FirstKernelPatch

制作补丁

我的补丁需要在我的最后两次提交中进行,而不仅仅是最后一次提交。

当我git format-patch HEAD^^时,结果为:

0001-added-pca9570-driver.patch
0002-removed-whitespace.patch

我只想要一个包含所有这些更改的补丁。手册页只是说:

DESCRIPTION
       Prepare each commit with its patch in one file per commit...

如何从两次提交中制作一个补丁?

3 个答案:

答案 0 :(得分:2)

取决于你需要什么(有时,为什么)。

ElpieKay的答案将为您提供单个文件中两个提交的补丁,但这不一定与单个补丁相同。

黑客在评论中建议的并没有错,但出于所有实际目的,它并不完整。使用历史重写来压缩提交是一种有效的方法来设置自己,以便format-patch创建一个真正的包含所有更改的补丁;但是有几种方法可以解决这个问题,特别是如果你不能(或者不想)用新的单一提交永久地替换你的两个提交。

鉴于

X --- A --- B <--(master)

并希望修补程序包含AB的更改,您可以

git checkout HEAD^^

让你处于分离头状态,然后

git merge --squash master
git commit

创建包含所有更改的临时提交

X --- A --- B <--(master)
 \
  AB <--()
         ^HEAD

现在

git format-patch HEAD^

将生成补丁,

git checkout master

会让一切恢复正常。这可能的缺点是电子邮件标题中的元数据(例如,创建补丁的SHA1 ID)将不符合您的真实历史记录。

我认为,既然你正在查看format-patch,那么你需要电子邮件包装吗?我的意思是,如果不是,git diff HEAD^^或类似的东西可能要简单得多......

答案 1 :(得分:2)

这是Mark Adelsberger的另一个变体,其中我展示了如何(ab)使用交互式变基git rebase -i

因此,您需要签出一个主题分支,将两个提交压缩成一个提交,然后制作一个补丁。

1。查看主题分支

这就是为什么我们有一个沙箱乱七八糟。

$ git checkout -b squashing_commits

2。压制两个提交

我们将告诉git重新定义分支的当前尖端(即HEAD)。为此,git需要一个新的HEAD。我们可以要求新的HEAD是&#34;当前减去两次提交&#34;。像这样:

$ git rebase -i HEAD~2

此时,您会看到类似的内容:

pick 21760270369e Your first commit
pick 2bf13c197901 Your second commit
# Rebase 9f7b54945e64..2bf13c197901 onto 9f7b54945e64 (2 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit

你想要将第二个压在第一个上面,所以你需要s命令:

pick 21760270369e Your first commit
s 2bf13c197901 Your second commit
# Rebase 9f7b54945e64..2bf13c197901 onto 9f7b54945e64 (2 commands)
#
# Commands:
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit

将其保存在编辑器中并退出(vim中的:wq)。现在,您可以检查结果,在这里您将看到两个提交日志堆叠的压缩提交。

$ git show HEAD

3。创建补丁

$ git format-patch -1

利润!

答案 2 :(得分:1)

git format-patch -2 --stdout > last2.patch

当您通过last2.patch申请git am时,将进行两次提交。

cat 0001-added-pca9570-driver.patch 0002-removed-whitespace.patch > last2.patch也可以。

更新

在阅读了@Mark Adelsberger的回答后,我意识到我可能误解了你的需要。

如果您只需要提交提示信息的差异补丁,git diff HEAD^^ > last2.patch就足够了。该补丁可以通过git apply last2.patch来应用。

如果您还需要提交信息,Mark的回答提供了一个解决方案。还有其他几种类似的方法。

git checkout -b patch
git reset HEAD^^ --soft
git commit
git format-patch -1
git checkout -
git branch -D patch

包含两个提交的补丁&#39;更改已创建。您可以通过自动提交的git am来应用它。

首先应用2个提交然后将它们压缩成一个也可以。