9

我需要为最后 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
(推送)
git apply diff2
(推送)
git apply diff3

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

4

3 回答 3

15

这可以分别使用git format-patchgit am来完成。从您的示例中,尝试:

git format-patch HEAD~3

这将生成文件0001-commit-foo.patch, 0002-commit-bar.patch, 0003-commit-baz.patch. 然后您可以将它们复制到另一个存储库并用于git am应用它们:

git am *.patch

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

于 2017-05-06T00:52:01.057 回答
1

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

于 2016-10-30T11:35:20.137 回答
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您可以为命令编写类似的循环。

于 2016-10-30T11:53:43.360 回答