如何为 git 中的最后 N 次提交准备和应用多个补丁

How to prepare and apply multiple patches for the last N commits in git

我需要为最后 N 次提交创建一个补丁文件,并将它们作为单独的提交应用到另一个分支。对于 N=3 我假设我必须这样做:

git diff HEAD~3 HEAD~2 >> diff1
git diff HEAD~2 HEAD~1 >> diff2
git diff HEAD~1 HEAD >> diff3

然后分别应用到另一个分支上:

git apply diff1
(push)
git apply diff2
(push)
git apply diff3

有没有更短的方法来做到这一点?

尝试 git cherry-pick 提交到另一个分支(无需创建临时补丁)。这个问题回答了如何一次挑选多个提交:How to cherry-pick multiple commits

您在评论中提到您需要补丁,因为分支位于不同的项目中。那不是问题。您可以为其他项目添加一个遥控器,并且可以从中挑选,即使它们没有共同的历史记录。 Cherry-picking 与祖先无关,它只是关于重播更改,就像您对补丁所做的那样。


如果出于某种原因,cherry picking 确实不适合您(虽然我真的怀疑),您可以在 Bash 中使用循环,例如:

for ((i = 3, d = 1; i > 0; i--, d++)); do ((j = i - 1)); git diff HEAD~$i HEAD~$j > diff$d; done

您可以为 git apply 命令编写类似的循环。

这可以分别用 git format-patch and git am 来完成。根据您的示例,尝试:

git format-patch HEAD~3

这将生成文件 0001-commit-foo.patch0002-commit-bar.patch0003-commit-baz.patch。然后你可以将它们复制到另一个仓库并使用 git am 来应用它们:

git am *.patch

这将保留您在之前的树中所做的提交,包括提交消息、SHA 和时间戳。