我正在尝试按照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...
如何从两次提交中制作一个补丁?
答案 0 :(得分:2)
取决于你需要什么(有时,为什么)。
ElpieKay的答案将为您提供单个文件中两个提交的补丁,但这不一定与单个补丁相同。
黑客在评论中建议的并没有错,但出于所有实际目的,它并不完整。使用历史重写来压缩提交是一种有效的方法来设置自己,以便format-patch
创建一个真正的包含所有更改的补丁;但是有几种方法可以解决这个问题,特别是如果你不能(或者不想)用新的单一提交永久地替换你的两个提交。
鉴于
X --- A --- B <--(master)
并希望修补程序包含A
和B
的更改,您可以
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
。
因此,您需要签出一个主题分支,将两个提交压缩成一个提交,然后制作一个补丁。
这就是为什么我们有一个沙箱乱七八糟。
$ git checkout -b squashing_commits
我们将告诉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
$ 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个提交然后将它们压缩成一个也可以。