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

时间:2016-10-30 11:27:44

标签: git diff git-diff git-apply

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

  

git diff HEAD~3 HEAD~2> DIFF1
  git diff HEAD~2 HEAD~1> DIFF2
  git diff HEAD~1 HEAD>>的diff3

然后分别将它们应用于另一个分支:

  

git应用diff1
  (推)
  git应用diff2
  (推)
  git apply diff3

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

3 个答案:

答案 0 :(得分:7)

这可以分别使用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和时间戳。

答案 1 :(得分:1)

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

答案 2 :(得分: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命令编写类似的循环。