如何在历史记录的不同位置从多个提交中创建一个git补丁?

And*_*rew 2 git git-rebase git-patch

我试图从我的分支中的多个提交创建一个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
Run Code Online (Sandbox Code Playgroud)

现在,我希望能够从开发分支为提交1,3和5创建补丁,并将它们应用于主分支.

我环顾四周,我能找到的是能够在一个范围内创建补丁的能力.有没有办法为多个提交创建一个补丁,它们之间的文件可能会发生变化?

gra*_*aci 5

从HEAD创建一个新分支 master

git checkout master
git checkout -b newBranch
Run Code Online (Sandbox Code Playgroud)

Cherry在这里选择提交.

git cherry-pick commit1SHA
git cherry-pick commit3SHA
git cherry-pick commit5SHA
Run Code Online (Sandbox Code Playgroud)

从中创建补丁.

git format-patch master --stdout > nameOfPatch.patch
Run Code Online (Sandbox Code Playgroud)

现在,您希望将提交1,3,5从开发移动到主控.你可以按照上面的说法直到最后一个樱桃选择然后执行此操作:

git rebase -i HEAD~3
Run Code Online (Sandbox Code Playgroud)

现在,选择第一个提交并压缩另外两个.您现在有一个单独的提交,它封装了所有其他三个提交.现在,只是樱桃 - 选择这个承诺,squashedCommitSHA对主人说.

git checkout master
git cherry-pick squashedCommitSHA
Run Code Online (Sandbox Code Playgroud)