创建重复的git提交

时间:2017-01-31 07:07:05

标签: git

我想知道是否可以使用相同的哈希创建两个提交。

我们只是说我在master分支上,我创建了一个名为foo的新分支。现在让我们说我有两个终端会话,它们都被授权为作者john.smith@gmail.com。现在让我们说一个终端会话在master上,另一个终端会话在foo上,两个分支都有完全相同的分阶段变化。现在让我们说我在两个终端会话中完全同时运行git commit命令......

这两个提交最终是否具有相同的哈希值?

1 个答案:

答案 0 :(得分:4)

是的,理论上你可能会遇到这种情况。提交哈希是根据提交对象的内容生成的,它们是:

  • 提交消息
  • 作者姓名
  • 创作时间戳
  • 提交者名称
  • 提交时间戳
  • 父提交列表
  • 树对象引用

树对象引用是一个对象哈希本身,由对blob对象和子树的引用组成。因此,对于相同的文件树,它将是相同的。

因此,如果提交的所有属性都相同,那么是的,您最终会得到相同的哈希值。如果您使用同一个作者并在同一时间提交,则绝对可以构建它;由于时间戳的分辨率只有几秒钟,你甚至不需要那么精确。

但这在实践中是一个问题吗?不是真的:你通常不会同时使用同一个用户;相反,你会有独立的贡献者,他们自己的身份在他们自己的东西上工作。因此,提交获得相同哈希的概率接近于零。

但即使这种情况在实践中发生。会有问题吗?不可以。根据定义(和构造),提交是相同的。所以他们是一样的。并且它们彼此兼容,因此当您稍后推送或拉动时,它看起来就好像您已经有了提交而没有任何反应。

当然,由于SHA1的哈希空间有限,还存在哈希冲突的问题。这可能成为非常大的存储库中的一个可能的问题,但我还没有听说过尚未 - 尽管已经存在巨大的存储库。但即使它发生在其中之一,它也不会影响其他具有更多可管理大小的存储库。