问题 使用`git show`创建和应用跨多个提交的补丁


最近我一直在使用 git show <hash> 创建差异供以后参考,因为它比键入更容易 git diff <hash>~ <hash> 它显示了提交信息(时间戳,用户,哈希,评论)。然后你可以使用 git apply <filename> 应用补丁。

我发现了 git show -3 将显示最后三个提交以及相同的额外信息。然而, git apply 将它作为非分段更改压缩到工作目录中,并丢失所有提交信息。

git中是否有适用所有信息的内容?传递一个标志比将补丁分成三个文件,分别应用它们并创建新的提交要简单得多。


1213
2017-10-12 22:47


起源



答案:


您可以使用 git format-patch 生成表示提交的MIME电子邮件,包括其元数据(消息,作者等)。然后,您可以重新应用这些 git am

所以 git format-patch HEAD~3 将为最后3次提交生成3个补丁,然后您可以将这些补丁全部导入 git am。如果你想变得更简单, git format-patch --stdout HEAD~3 将在stdout上发送MIME消息,因此您可以将它们管道传送到您想要的位置,而不是处理3个单独的文件。

当然,如果你试图保存提交以便稍后引用,为什么不只是标记它们呢?然后,您可以使用它们重新应用它们的提交 git cherry-pick


6
2017-10-12 22:56



看起来这会起作用,虽然我不得不重新做一些我已经使用过的补丁 git show。从现在开始,我可能会开始使用format-patch来简化操作。我不只是使用的原因 git cherry-pick 我正在转移到新的开发服务器,并且目前在git上基本上具有只读访问权限。而不是scp所有我的代码目录,我只是制作补丁来复制。 - redbmk


答案:


您可以使用 git format-patch 生成表示提交的MIME电子邮件,包括其元数据(消息,作者等)。然后,您可以重新应用这些 git am

所以 git format-patch HEAD~3 将为最后3次提交生成3个补丁,然后您可以将这些补丁全部导入 git am。如果你想变得更简单, git format-patch --stdout HEAD~3 将在stdout上发送MIME消息,因此您可以将它们管道传送到您想要的位置,而不是处理3个单独的文件。

当然,如果你试图保存提交以便稍后引用,为什么不只是标记它们呢?然后,您可以使用它们重新应用它们的提交 git cherry-pick


6
2017-10-12 22:56



看起来这会起作用,虽然我不得不重新做一些我已经使用过的补丁 git show。从现在开始,我可能会开始使用format-patch来简化操作。我不只是使用的原因 git cherry-pick 我正在转移到新的开发服务器,并且目前在git上基本上具有只读访问权限。而不是scp所有我的代码目录,我只是制作补丁来复制。 - redbmk


在Linux中你可以管你的 Δ-发电机 --- git-show 要么 git-diff,例如---与 git-apply 命令。

(总是启用3向合并也可能更安全 -3 选项)

> git show <sha1> [<path>] | git apply -3
> git diff <sha1-a> <sha1-b> [<path>] | git apply -3

例子:

  • 对特定文件应用编辑 ABCDEF
> git show abcdef dir/file.c | git apply -3
  • 对两个不同提交的文件应用差异 ABCDEF 和 123456

> git diff abcdef 123456 foo.h | git apply -3

也可以看看: https://stackoverflow.com/a/12320940/1329340


3
2017-07-20 09:58





尝试 git bundle 用于发送历史的特定部分。


1
2017-10-13 03:26