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

时间:2015-07-30 20:08:10

标签: 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

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

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

1 个答案:

答案 0 :(得分:5)

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从开发移动到主控。你可以按照上面的说法直到最后一个樱桃选择然后执行此操作:

git rebase -i HEAD~3

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

git checkout master
git cherry-pick squashedCommitSHA