如何从不同历史点的多个提交中创建git补丁?

5
我试图从我分支中的多个提交创建一个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分支上。
我已经搜索过了,但我只能找到在范围内创建补丁的方法。是否有一种方法可以为多个提交创建补丁,其中可能在它们之间的文件中进行更改?

3
你尝试过使用“挑选樱桃”吗? - neshkeev
1个回答

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

在这里挑选需要的提交。

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

从这里创建一个补丁。
git format-patch master --stdout > nameOfPatch.patch

现在,您想将develop分支中的1、3、5号提交移动到master分支。您可以按照上述说明进行操作,一直执行到最后的cherry-pick,然后:
git rebase -i HEAD~3

现在,选择第一个提交并压缩其他两个。现在,您只有一个独立的提交包含其他三个提交。现在,只需将此提交挑选出来,称为 squashedCommitSHA 并合并到主分支。
git checkout master
git cherry-pick squashedCommitSHA

最后一行将输出以 mbox 格式写入名为 .patch 的文件中,这会让人感到困惑。 - Sven Marnach
此外,我对原帖问题的理解是他们可能想直接将选定的提交合并到 master 分支中,并且只是询问创建“补丁”的方式,因为他们认为这可能是必要的。 - Sven Marnach
哦,我刚刚明白了。谢谢! - gran_profaci
更新了一种方法,只需将东西移动到主分支即可。 - gran_profaci
这在 gitk 中非常容易实现。只需检出要修改的分支,然后右键单击 -> 摘取您想要的每个提交。(当然,按您想要的顺序。) - Peter Cordes

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接