可以由两个人提交相同的哈希?

时间:2016-05-22 07:07:53

标签: git git-commit internal

更新:我将两个东西混合在一起:第一行实际指向目录(在下面的答案中有很好的解释),第二行指向父提交。我让第二个误导了我。谢谢大家的澄清。

我正在学习git,而我正在复制代码she。我在名为提交不属于第一次提交的小节中。在她承诺之后,这就是她得到的(为了格式化原因,我划掉了她的电子邮件):

  

tree ce72afb5ff229a39f6cce47b00d1b0ed60fe3556

     

父774b54a193d6cfdd081e581a007d2e11f784b9fe

     

作者Mary Rose Cook ......

     提交人Mary Rose Cook ......

     

A2

而且,神秘地,我得到了(我划掉了我的个人信息)

  

tree ce72afb5ff229a39f6cce47b00d1b0ed60fe3556

     

父母c96fbf6143ccef645d1cb867b05427c399a9bcb3

     

作者......

     

提交者......

     

A2

比较当前树的两个哈希,很明显我们都得到了相同的哈希(我确实按照她的代码)。

所以我很好奇这是怎么回事?我知道git据说可以隐藏那个时刻的快照,但我的megadatas肯定与她的不同。愿有人知道会发生什么吗?

1 个答案:

答案 0 :(得分:7)

tree hash是当前工作目录的散列 - 换句话说,其中包含相同文件和目录的任何两个目录将具有相同的树形散列。

  

树是文件和目录的分层集合,不依赖于历史记录中的任何特定点。例如,如果您创建一个文件然后删除该文件(没有其他干预提交),您将最终得到您开始使用的同一个树。

     

提交是项目历史中的一个要点。提交指定树,但也包含其他信息,例如作者/提交者和时间,提交消息(作者描述更改的内容),最重要的是零或更多父项,它们是存储库的先前状态。 (您的第一次提交没有父项。大多数提交之后在线性开发期间有一个父项,如果合并则有多个项。)

     

Source

进行一些修改并提交后,您将获得commit hash。在40个字符的SHA1哈希中发生哈希冲突的可能性非常非常非常微小。

  

SHA-1散列是40十六进制字符串...每个字符的4位乘以40 ... 160位。现在我们知道10位大约是1000(准确地说是10 ^ 24),这意味着有1 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000 000个不同的SHA-1哈希... 10 ^ 48。< / p>      

这相当于什么?月球由大约10 ^ 47个原子组成。所以,如果我们有10个月亮......然后你在其中一个卫星上随机选择一个原子......然后再继续在它们上面选择一个随机原子...然后你可能选择相同的原子原子两次,是两个git提交具有相同SHA-1哈希的可能性。

     

Source

您也可以在同一个父提交(parent hash)之外提交两个或更多不同的提交,这也很好,但每个提交哈希都会有所不同。除非你感到惊讶,否则请大笑(不)幸运。