はい、理論的には、このような状況に遭遇する可能性があります。コミットハッシュは、コミットオブジェクトのコンテンツから生成されている。
- コミットメッセージ
- に著者名
- をオーサリングタイムスタンプ
- コミッター名
- コミットタイムスタンプ
- 親コミットのリスト
- ツリーオブジェクトリファレンス
ツリーオブジェクト参照は、オブジェクトのハッシュそのもので、blobオブジェクトとサブツリーへの参照で構成されています。したがって、同一のファイルツリーでは同じになります。
したがって、コミットのすべてのプロパティが同じ場合、yesの場合、同じハッシュになります。これは、同じ著者を使用して、まったく同じ時間にコミットした場合、絶対に構築できます。タイムスタンプの解像度はわずか数秒であるため、正確である必要はありません。
実際にはこれが問題ですか?実際はそうではありません。通常、同じユーザーで同時にコミットすることはありません。代わりに、独自のアイデンティティを持つ別々の貢献者が自分のもので作業することになります。したがって、同じハッシュを取得するコミットの確率はゼロに近くなります。
しかし、この状況が実際に起こったとしても。問題はありますか?いいえ。コミットは、定義(および構築)によって同じです。だから彼らは同じです。そして、彼らはお互いに互換性があるので、後でプッシュまたはプルすると、すでにコミットしていて、何も起こらないかのように見えます。
もちろん、SHA1のハッシュスペースが限られているため、ハッシュの衝突の問題が残ります。これは非常に大きなリポジトリでは問題になる可能性がありますが、それについては聞いていませんまだ - すでに巨大なリポジトリがあります。しかし、それが起こったとしても、管理可能なサイズの他のリポジトリには影響しません。
http://stackoverflow.com/questions/9392365/how-would-git-handle-a-sha-1-collision-on-a-blob – gzh
@ Slava.Kの回答を参照してください。質問はどのようにgitが状況を処理するかについてではなく、私の質問は実際に状況を作り出すことができるかどうかについてです。 – Ogen
も参照してください。http://stackoverflow.com/questions/25128077/how-does-git-assure-that-commit-sha-keys-for-identical-operations-data-are-still - 脚注1 「非強制」衝突確率を計算するためのものである。SHA-1を破損したり、部分的に破損したりする可能性がある場合は、衝突の可能性を高めることができます。しかし、一般的なSHA-1の既知の2番目の予備イメージ攻撃があっても、Gitで動作するように修正する必要があるかもしれません。 – torek