【问题标题】:Using `git show` to create and apply patches spanning multiple commits使用 `git show` 创建和应用跨越多个提交的补丁
【发布时间】:2012-10-12 22:47:44
【问题描述】:

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

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

git 中有什么东西可以应用所有这些信息吗?只传递一个标志要比将补丁分成三个文件,分别应用它们并创建新提交要简单得多。

【问题讨论】:

    标签: git diff patch git-show


    【解决方案1】:

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

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

    当然,如果您想保存提交以供以后参考,为什么不直接标记它们呢?然后,您可以使用 git cherry-pick 重新应用他们的提交。

    【讨论】:

    • 看起来这会起作用,尽管我必须去重新做我已经使用git show 制作的补丁。我可能会从现在开始使用 format-patch 以使事情变得更容易。我不只是使用git cherry-pick 的原因是我正在移动到一个新的开发服务器,并且目前基本上对 git 具有只读访问权限。而不是 scp 我所有的代码目录,我只是制作补丁来复制。
    【解决方案2】:

    在 Linux 中,您可以通过管道传输您的 delta-generator --- git-showgit-diff,例如 --- 使用 git-apply 命令。

    (使用-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

    &gt; git diff abcdef 123456 foo.h | git apply -3

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2019-03-23
        • 2020-08-13
        • 2012-09-05
        • 2014-11-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多