如何为 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.patch
、0002-commit-bar.patch
、0003-commit-baz.patch
。然后你可以将它们复制到另一个仓库并使用 git am
来应用它们:
git am *.patch
这将保留您在之前的树中所做的提交,包括提交消息、SHA 和时间戳。
我需要为最后 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.patch
、0002-commit-bar.patch
、0003-commit-baz.patch
。然后你可以将它们复制到另一个仓库并使用 git am
来应用它们:
git am *.patch
这将保留您在之前的树中所做的提交,包括提交消息、SHA 和时间戳。