我需要为最后的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
有没有更短的方法可以做到这一点?
答案 0 :(得分:7)
这可以分别使用git format-patch和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和时间戳。
答案 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
命令编写类似的循环。