Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建重复的git提交_Git - Fatal编程技术网

创建重复的git提交

创建重复的git提交,git,Git,我想知道是否可以使用相同的哈希创建两个提交 假设我在master分支上,我创建了一个名为foo的新分支。现在让我们假设我有两个终端会话,它们都被授权为作者john。smith@gmail.com。现在让我们假设在一个终端会话上,主会话处于打开状态,另一个终端会话处于打开状态,并且两个分支都具有完全相同的阶段性更改。现在让我们假设我在两个终端会话中同时运行git commit命令 这两个提交的散列值不是相同吗?是的,理论上可能会遇到这种情况。提交哈希由提交对象的内容生成,这些内容是: 提交消息

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

假设我在
master
分支上,我创建了一个名为
foo
的新分支。现在让我们假设我有两个终端会话,它们都被授权为作者
john。smith@gmail.com
。现在让我们假设在一个终端会话上,主会话处于打开状态,另一个终端会话处于打开状态,并且两个分支都具有完全相同的阶段性更改。现在让我们假设我在两个终端会话中同时运行git commit命令


这两个提交的散列值不是相同吗?

是的,理论上可能会遇到这种情况。提交哈希由提交对象的内容生成,这些内容是:

  • 提交消息
  • 作者姓名
  • 创作时间戳
  • 提交者名称
  • 提交时间戳
  • 父提交的列表
  • 树对象引用
树对象引用本身就是一个对象哈希,由对blob对象和子树的引用组成。因此,对于相同的文件树,它将是相同的

所以,如果提交的所有属性都相同,那么是的,您将得到相同的哈希。如果您使用同一作者并在同一时间提交,则完全可以构造此文档;由于时间戳的分辨率仅以秒为单位,因此您甚至不需要如此精确

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

但即使这种情况在实践中发生。会有问题吗?否。提交在定义(和构造)上是相同的。所以他们是一样的。它们彼此兼容,所以当你以后推拉时,看起来就像你已经提交了,什么也没有发生


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

请参考@Slava.K的答案。这是完全不同的,我的问题不是git如何处理这种情况,我的问题是你是否真的可以创建这种情况。另请参见脚注1中我给出了一个计算公式“非受迫性“碰撞概率。如果可以破坏或部分破坏SHA-1,则可以增加碰撞的概率。然而,即使您知道general SHA-1的第二个前映像攻击,您也可能需要对其进行修改以使用Git。谢谢,这是一个很好的回答-非常容易理解。我从来没有意识到,即使它真的发生了,也不会是一个问题!