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

时间:2012-10-12 22:47:45

标签: git diff patch git-show

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

我发现git show -3将显示最后三次提交以及相同的额外信息。但是,git apply会将其全部压缩到工作目录中作为非分段更改,并丢失所有提交信息。

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

3 个答案:

答案 0 :(得分:7)

您可以使用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重新应用来自它们的提交。

答案 1 :(得分:3)

在Linux中,您可以使用- @phases.order(:position).each do |phase| %tr ... 命令管道 delta-generator --- git-showgit-diff,例如---。 p>

(始终启用与git-apply选项的3向合并也可能更安全)

-3

示例:

  • abcdef 中的特定文件应用编辑:
> git show <sha1> [<path>] | git apply -3
> git diff <sha1-a> <sha1-b> [<path>] | git apply -3
  • 对两个不同提交 abcdef 123456
  • 的文件应用差异

> git show abcdef dir/file.c | git apply -3

另请参阅:https://stackoverflow.com/a/12320940/1329340

答案 2 :(得分:1)

尝试git bundle发送历史记录的特定部分。