如何在 2 次提交之间创建一个 git diff/diff-tree/archive 与此时的文件版本(不是头)

Posted

技术标签:

【中文标题】如何在 2 次提交之间创建一个 git diff/diff-tree/archive 与此时的文件版本(不是头)【英文标题】:How to create a git diff/diff-tree/archive between 2 commits with versions of files at exactly this point (not head) 【发布时间】:2019-06-11 18:18:45 【问题描述】:

如果我想比较和导出过去的 2 个提交,我可以做一个 git diff 来列出所有修改过的文件,到目前为止一切都很好。 但是,如果我想以上次提交时的文件版本准确归档这些文件,我该如何实现呢? 假设在最后一次提交后删除了一个文件,git archive 将失败,因为 git diff 列出的文件再也找不到了。我是否必须检查我想比较的最新提交,或者有什么优雅的解决方案?

git archive --output=test.zip HEAD $(git diff --diff-filter=ACMRTUXB --name-only SHA1 SHA2) 对于仍然存在于 diff 中但不再存在于 head 中的文件失败

【问题讨论】:

“但如果我想将这些文件归档为两者中最后一次提交时的文件版本”......那么只需归档最后一次提交。如果文件被删除,它将不在存档中。提交不是一个变更集,它是一个完整的快照。 (这就是为什么您可以比较这两个快照以查看发生了什么变化。) 是的,我知道这不是变更集,但是如果我的 git 工作目录包含头修订版,并且我只想存档 2 次提交之间的增量(即变更集),它会失败的文件我的工作目录中缺少。此外,git 归档修改文件的当前版本,而不是与变更集匹配的版本。 存档也是快照。如果将存档解压缩到空目录中,则会获得快照。如果您将存档解压缩到非空目录中,您将得到……好吧,您应得的。 :-) tar 和 zip 档案都不能包含任何类型的“删除”指令。至于git archive 生成的存档,请注意git archive 采用可选的<tree-ish>。您提供的是HEAD,但您应该提供第二次提交的标识符。 为什么不直接git checkout SHA2做手术呢?如果您有未保存的工作,请先将其存储或放入 dev 分支,然后检查 sha2 并运行 git archive。 当然,但是 git diff 可能会显示存在于“变更集”中但不再存在于头中的文件路径,因此 git archive 不会再物理地“找到”它们,因此会失败 【参考方案1】:

您应该明确指定您希望存档从中保存文件的提交:

git archive --output=test.zip SHA2 -- $(git diff --diff-filter=ACMRTUXB --name-only SHA1 SHA2)

【讨论】:

以上是关于如何在 2 次提交之间创建一个 git diff/diff-tree/archive 与此时的文件版本(不是头)的主要内容,如果未能解决你的问题,请参考以下文章

Git:显示两次提交之间的总文件大小差异?

git diff 文件针对其最后一次更改

如何提交两个分支的“git diff”?

方法级别的 Git Diff

在提交之间使用 git-diff 忽略 *all* 空格更改

git 对比两个分支差异