我的观点是应该有可能得到一个重复的 git 哈希,因为哈希码是唯一性的浓缩表示,因此会有一些步骤序列产生相同的哈希码。更重要的是,应该有一系列步骤,在这些步骤中提交不同的更改但产生相同的哈希码。
例如,在同一台机器上克隆相同的存储库两次,在不同的存储库中进行几乎完全相同的更改(保存一个字节或位)并提交。即使在提交中使用了目录名称或时间戳,它仍然应该可以得到它(尽管很少被授予)。例如,两个不同的人在两台不同的机器上同时进行提交。
我的问题是两方面的。这怎么会发生,Git 将如何处理它。
或者更明确地说,git 如何在推送之前确保您是最新的。是否有可能一个人先推送,然后另一个人尝试推送(这两个更改都基于相同的父提交)并且 Git 从远程和本地历史记录中看到哈希码匹配,决定您可以继续,允许您的push 但您刚刚丢失了一项更改?在这种情况下,我看到它更像以下内容:
repo1 a->b->c1
repo2 a->b->c1'->c2
说 c1,c1',c2 都发生在两个 repos 都被克隆到 b 之后,现在 repo1 推送,现在没有问题 repo2 尝试推送 c1' 和 c2 并且 git 确定 c1' = c1 但实际上它们不同,git 将 c2 推送到顶部c1 得到 a->b->c1->c2 并且我们丢失了在 c1' 中所做的更改
这可能吗?它怎么会发生,git会做什么?