5

私の意見では、ハッシュコードは一意性の凝縮された表現であるため、重複したgitハッシュを取得できるはずです。したがって、同じハッシュコードを生成する一連の手順があります。さらに重要なことに、さまざまな変更がコミットされても同じハッシュコードが生成される一連の手順が必要です。

たとえば、同じマシン上で同じリポジトリのクローンを2回作成し、異なるリポジトリでほぼ同じ正確な変更(1バイトまたはビットの節約)を行ってコミットします。コミットでディレクトリ名またはタイムスタンプが使用されている場合でも、これを取得できるはずです(まれに付与されますが)。たとえば、2つの異なるマシン上の2人の別々の人が、同時にコミットを行います。

私の質問は2つあります。これはどのように発生し、Gitはどのように処理しますか。

または、より明確に言えば、Gitはプッシュ前に最新の状態になっていることをどのように確認しますか。1人が最初にプッシュし、次にもう1人がプッシュを試み(両方とも同じ親コミットに基づいて変更)、Gitはハッシュコードがリモートとローカルの履歴から一致することを確認し、あなたが行ってもよいと判断し、プッシュしますが、変更の1つを失いましたか?この状況では、私はそれを次のようにもっと見ます:

repo1 a-> b-> c1

repo2 a-> b-> c1'-> c2

たとえば、c1、c1'、c2はすべて、両方のリポジトリがbで複製された後に発生し、repo1がプッシュされ、問題はありません。repo2はc1'とc2をプッシュしようとし、gitはc1' = c1と判断しますが、実際には異なります。 c1のa->b->c1-> c2を取得し、c1'で行われた変更を失いました

これは可能ですか?どのようにそれが起こり、gitは何をしますか?

4

1 に答える 1

12

重複ハッシュに関連する質問の部分に関して:

Gitは、生成されるハッシュの一意性に完全に依存しており、私が知る限り、同じハッシュ値を生成するさまざまなデータBLOBを処理するための保護手段はありません。ただし、ハッシュ衝突が発生する可能性はほとんどなく、実際には無視できます。それでも心配な場合は、ProGitのこのセクションで心が落ち着くかもしれません。

プログラミングチームのすべてのメンバーが、同じ夜に無関係の事件でオオカミに襲われて殺される可能性が高くなります。

あなたの質問の2番目の部分(何が起こるか)に関して:

リポジトリ内の前のオブジェクトと同じSHA-1値にハッシュするオブジェクトをコミットした場合、GitはGitデータベースにすでにある前のオブジェクトを認識し、すでに書き込まれていると見なします。ある時点でそのオブジェクトを再度チェックアウトしようとすると、常に最初のオブジェクトのデータが取得されます。

于 2012-08-02T12:16:06.547 に答える