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

19
最近我一直在使用git show <hash>来创建差异,以便以后参考,因为它比git diff <hash>~ <hash>更容易打字,并显示提交信息(时间戳,用户,哈希值,注释)。然后,您可以使用git apply <filename>来应用补丁。
我发现git show -3将显示最后三个提交及其相同的额外信息。 但是,git apply将把所有内容压缩到工作目录中作为未暂存更改,并且丢失所有提交信息。
在git中是否有会应用所有这些信息的方法?简单地传递一个标志要比将补丁分成三个文件,分别应用它们并创建新的提交要简单得多。
3个回答

12
您可以使用git format-patch生成代表提交的MIME电子邮件,包括它们的元数据(消息、作者等)。然后您可以使用git am重新应用这些补丁。
因此,git format-patch HEAD~3将为最后三个提交生成3个补丁,然后您可以将所有这些内容都导入到git am中。如果您想更简单一些,git format-patch --stdout HEAD~3将在标准输出上发送MIME消息,因此您可以将它们导入到任何您想要处理的地方,而无需处理3个单独的文件。
当然,如果您想保存提交以供稍后参考,为什么不直接对它们进行标记?然后您就可以使用git cherry-pick从中重新应用提交。

看起来这个方法可行,尽管我得重新使用 git show 命令来制作补丁。不过从现在开始,我可能会开始使用 format-patch 命令来简化操作。我之所以没有直接使用 git cherry-pick 命令,是因为我正在切换到一个新的开发服务器,目前基本上只有 git 的只读权限。所以我决定制作补丁来复制代码目录,而不是通过 scp 命令复制。 - redbmk

7
在Linux中,您可以使用git-apply命令将您的delta-generator(例如git-showgit-diff)与之管道连接。
(始终启用-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
  • 将两个不同提交的文件abcdef123456的差异应用于一个文件

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

另请参阅:https://dev59.com/c2ct5IYBdhLWcg3wIqHW#12320940


2

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接