如何为 Git 中最近的 N 次提交准备和应用多个补丁。

10
我需要创建一个补丁文件,将最后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

有没有更简单的方法来完成这个操作?
3个回答

17

可以使用分别使用git format-patchgit am来完成此操作。尝试以下示例:

git format-patch HEAD~3

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

git am *.patch

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


如果有人在使用msysgit时遇到“fatal: could not open '*.patch' for reading: Invalid argument”错误消息,这里是原因:https://groups.google.com/forum/#!topic/msysgit/1IT785Jf4Zo - Ilya

1
尝试使用git cherry-pick将提交内容复制到另一个分支(无需创建临时补丁)。此问题回答了如何一次性复制多个提交的问题:如何一次性复制多个提交

我需要这个补丁。这两个分支在不同的项目上。 - B Faley
1
如果您将第二个存储库作为第一个存储库的远程仓库添加,您仍然可以在不同的存储库之间进行挑选。 - TomaszGuzialek

1
您在评论中提到需要补丁,因为这些分支位于不同的项目中。这不是问题。您可以为另一个项目添加远程,即使它们没有共同的历史记录,您也可以从中挑选。挑选并不涉及祖先关系,只是重放更改,就像使用补丁一样。
如果由于某些原因,挑选特定的内容对你来说真的不是一个选项(尽管我真的怀疑),你可以在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 命令。

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