2017-01-31 6 views
3

同じハッシュで2つのコミットを作成できるかどうかは疑問でした。二重コミットを作成する

ちょうど私がmasterブランチにいるとしましょう。fooという新しいブランチを作成します。さて、2人の端末セッションがあり、どちらも著者として承認されているとしましょう。[email protected]ここで、1つのターミナルセッションではmasterにあり、別のターミナルセッションはfooにあり、両方のブランチが正確に同じ段階変更を行っているとします。さて、私はgit commitコマンドを両方のターミナルセッションで同じ時刻に実行するとしましょう...

2つのコミットは同じハッシュ値になりませんか?

+0

http://stackoverflow.com/questions/9392365/how-would-git-handle-a-sha-1-collision-on-a-blob – gzh

+0

@ Slava.Kの回答を参照してください。質問はどのようにgitが状況を処理するかについてではなく、私の質問は実際に状況を作り出すことができるかどうかについてです。 – Ogen

+1

も参照してください。http://stackoverflow.com/questions/25128077/how-does-git-assure-that-c​​ommit-sha-keys-for-identical-operations-data-are-still - 脚注1 「非強制」衝突確率を計算するためのものである。SHA-1を破損したり、部分的に破損したりする可能性がある場合は、衝突の可能性を高めることができます。しかし、一般的なSHA-1の既知の2番目の予備イメージ攻撃があっても、Gitで動作するように修正する必要があるかもしれません。 – torek

答えて

4

はい、理論的には、このような状況に遭遇する可能性があります。コミットハッシュは、コミットオブジェクトのコンテンツから生成されている。

  • コミットメッセージ
  • に著者名
  • をオーサリングタイムスタンプ
  • コミッター名
  • コミットタイムスタンプ
  • 親コミットのリスト
  • ツリーオブジェクトリファレンス

ツリーオブジェクト参照は、オブジェクトのハッシュそのもので、blobオブジェクトとサブツリーへの参照で構成されています。したがって、同一のファイルツリーでは同じになります。

したがって、コミットのすべてのプロパティが同じ場合、yesの場合、同じハッシュになります。これは、同じ著者を使用して、まったく同じ時間にコミットした場合、絶対に構築できます。タイムスタンプの解像度はわずか数秒であるため、正確である必要はありません。

実際にはこれが問題ですか?実際はそうではありません。通常、同じユーザーで同時にコミットすることはありません。代わりに、独自のアイデンティティを持つ別々の貢献者が自分のもので作業することになります。したがって、同じハッシュを取得するコミットの確率はゼロに近くなります。

しかし、この状況が実際に起こったとしても。問題はありますか?いいえ。コミットは、定義(および構築)によって同じです。だから彼らは同じです。そして、彼らはお互いに互換性があるので、後でプッシュまたはプルすると、すでにコミットしていて、何も起こらないかのように見えます。

もちろん、SHA1のハッシュスペースが限られているため、ハッシュの衝突の問題が残ります。これは非常に大きなリポジトリでは問題になる可能性がありますが、それについては聞いていませんまだ - すでに巨大なリポジトリがあります。しかし、それが起こったとしても、管理可能なサイズの他のリポジトリには影響しません。

+1

ありがとう、これはよく言われている答えです。わかりやすいです。私はそれが起こったとしてもそれは問題ではないだろうと気付かなかった! – Ogen

関連する問題