最近我一直在使用git show <hash>
来创建差异以供以后参考,因为它比git diff <hash>~ <hash>
更容易键入,并且它显示了提交信息(时间戳,用户,哈希,注释)。然后,您可以使用git apply <filename>
来应用修补程序。
我发现git show -3
将显示最后三个提交以及相同的额外信息。但是,git apply
会将其全部压缩到工作目录中,作为未暂存的更改,并丢失所有提交信息。
git 中是否有可以应用所有这些信息的内容?只传入一个标志比将补丁分解为三个文件、分别应用它们并创建新的提交要简单得多。
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
重新应用其中的提交。
在 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
尝试git bundle
发送历史记录的特定部分。