我想知道是否可以使用相同的哈希创建两个提交。
我们只是说我在master
分支上,我创建了一个名为foo
的新分支。现在让我们说我有两个终端会话,它们都被授权为作者john.smith@gmail.com
。现在让我们说一个终端会话在master
上,另一个终端会话在foo
上,两个分支都有完全相同的分阶段变化。现在让我们说我在两个终端会话中完全同时运行git commit命令......
这两个提交最终是否具有相同的哈希值?
答案 0 :(得分:4)
是的,理论上你可能会遇到这种情况。提交哈希是根据提交对象的内容生成的,它们是:
树对象引用是一个对象哈希本身,由对blob对象和子树的引用组成。因此,对于相同的文件树,它将是相同的。
因此,如果提交的所有属性都相同,那么是的,您最终会得到相同的哈希值。如果您使用同一个作者并在同一时间提交,则绝对可以构建它;由于时间戳的分辨率只有几秒钟,你甚至不需要那么精确。
但这在实践中是一个问题吗?不是真的:你通常不会同时使用同一个用户;相反,你会有独立的贡献者,他们自己的身份在他们自己的东西上工作。因此,提交获得相同哈希的概率接近于零。
但即使这种情况在实践中发生。会有问题吗?不可以。根据定义(和构造),提交是相同的。所以他们是一样的。并且它们彼此兼容,因此当您稍后推送或拉动时,它看起来就好像您已经有了提交而没有任何反应。
当然,由于SHA1的哈希空间有限,还存在哈希冲突的问题。这可能成为非常大的存储库中的一个可能的问题,但我还没有听说过尚未 - 尽管已经存在巨大的存储库。但即使它发生在其中之一,它也不会影响其他具有更多可管理大小的存储库。