为什么在比较两个提交失败时使用缩短的提交名称?

时间:2017-05-09 18:21:11

标签: git

我想比较两个我怀疑是相同的提交。为什么

$ git diff 9d3fd2..893f5b
fatal: ambiguous argument '9d3fd2..893f5b': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

$ git diff 9d3fd2 893f5b
fatal: ambiguous argument '9d3fd2': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

失败,而完整的提交名称不是

$ git diff 9d3fd263dd6625078cc12b358c97ca2dca51826c  893f5ba2871b13f87365620b4d02e40519f08734

$ git diff 9d3fd263dd6625078cc12b358c97ca2dca51826c..893f5ba2871b13f87365620b4d02e40519f08734

我检查了git log的输出,但未发现其他提交共享相同的缩写提交名称。

感谢。

2 个答案:

答案 0 :(得分:4)

  

我检查了git log的输出,并没有发现其他提交共享相同的缩写提交名称。

这里有两种可能性:

  • 其他提交,但你错过了它们。
  • 没有这样的提交,但还有其他Git 对象具有相同的缩短哈希值。

要扩展第一点,git log仅显示可从HEAD或您提供的任何参数访问的提交:

  • git log:显示HEAD提交,之前的提交可以从HEAD
  • 到达
  • git log master:显示master的提示,之前的提交可以从提示提交
  • git log master develop:显示masterdevelop的提示提交,以及之前提交的提交可以从这两个提交
  • git log --branches:显示所有分支的提示提交以及所有早期可达提交
  • git log --all:显示所有分支的提示提交,所有标记的提交,stash引用的提交(如果有),依此类推:find all 引用。使用这些提交来查找所有早期可达的提交。

您可能希望最后一个提交所有提交,但它不会: reflogs 中可能有提交,如果这些提交已启用,则会丢失;并且可能存在未引用的提交,这些将在下次git gc运行时被垃圾收集,但仍然在垃圾箱中,仍然可以被提取和查看。

在任何情况下,即使您设法命名存储库中的每个提交,存储库也会保存四种类型的对象:提交,带注释的标记,树和blob。注释标记,树或blob的哈希ID通常保持相当好的隐藏,因为这些更多&#34;实现细节&#34;而不是&#34;有用的数据&#34;。但是它们仍然占用了存储库哈希空间,因而干扰了引用缩短。

使任何特定缩短的哈希值唯一所需的字符数很难准确预测,但如果您知道存储库中存储的对象(所有四种类型)的总数,则概率估算并不太难。但是一开始很难知道对象的总数 - 你偶尔会看到Git计算它们,并且在一个大的存储库中需要一段时间!在你的情况下:

9d3fd2

只有六个字符;添加第七个可以将模糊性的可能性降低16倍,并且可能就足够了。如果存储库非常大,或者您非常不走运,则可能需要8,9,10或甚至更多字符才能获得唯一的哈希ID。

答案 1 :(得分:2)

可能有多个修订版使用了您正在使用的缩短ID之一。尝试提供更长的身份证(我认为Linus最近把这个长度花了大约11个字符)。