如何从历史上不同时间点的多个提交制作 git 补丁?

How do I make a git patch from multiple commits at different points in history?

我正在尝试从我的分支中的多个提交创建一个 git 补丁。但是,我需要从任意提交创建它(它们不一定在一个范围内)。在我想创建补丁的提交之间,一些提交更改了补丁中的一些文件可能也已更改。

这是我的用例(假设更大的数字 = 较晚的提交日期):

develop HEAD
Commit 5 - Changed a.txt
Commit 4 - Changed a.txt, b.txt, c.txt
Commit 3 - Changed b.txt, c.txt
Commit 2 - Changed a.txt
Commit 1 - Changed a.txt, b.txt, c.txt, d.txt
master HEAD

现在我希望能够从 develop 分支为提交 1、3 和 5 创建补丁并将它们应用到 master 分支。

我环顾四周,我所能找到的就是在一个范围内创建补丁的能力。有没有办法为多个提交创建补丁,并在它们之间的文件中进行潜在更改?

master

中从 HEAD 创建一个新分支
git checkout master
git checkout -b newBranch

Cherry 在此处选择提交。

git cherry-pick commit1SHA
git cherry-pick commit3SHA
git cherry-pick commit5SHA

由此创建补丁。

git format-patch master --stdout > nameOfPatch.patch

现在,您想要将提交 1、3、5 从 develop 移动到 master。您可以简单地按照上述语句执行此操作,直到最后一次选择,然后:

git rebase -i HEAD~3

现在,选择第一个提交并压缩其他两个。您现在有一个单独的提交,它封装了所有其他三个提交。现在,只需挑选这个提交,对 master 说 squashedCommitSHA

git checkout master
git cherry-pick squashedCommitSHA