Git は、ユーザーがコミットを参照するために SHA-1 を使用します。
Subversion (SVN) とMercurial (hg) は増分番号を使用します。
Git チームはなぜ、わかりやすいものではなく SHA-1 を使用するという設計上の決定を下したのでしょうか?
Git は、ユーザーがコミットを参照するために SHA-1 を使用します。
Subversion (SVN) とMercurial (hg) は増分番号を使用します。
Git チームはなぜ、わかりやすいものではなく SHA-1 を使用するという設計上の決定を下したのでしょうか?
Mercurial (hg) も SHA1 ハッシュを使用します。また、コミット履歴からリビジョン番号を取得しようとします。ただし、これらのリビジョンは 1 つのリポジトリでのみ有効です。別のレポを見る場合、これらのリビジョンが一致するとは限りません。
git と mercurial がハッシュを使用する理由については、どちらも非線形のコミット履歴を持っています。両方が分散されているため、ローカル リポジトリで同じコード ベースで作業でき、中央機関と同期する必要はありません (SVN と CVS で必要)。ローカルでコミットして後でマージすると、直線的に増加する整数リビジョンを形成するための一貫したスキーマを考え出すのに苦労することになります。できたとしても、異なるリポジトリ間で異なる結果が得られます。
結局のところ、それはすべて分散型の性質によるものです。これは、コミットに対してかなり一意の識別子を作成する簡単な方法です。また、副産物として、単一のコミットに対する完全な履歴をハッシュにエンコードすることもできます。つまり、コミットに同じ diff がある場合でも、異なる SHA1 ハッシュが得られる可能性があります。
これは、コミットの識別と検証の両方の方法として使用されます。SHA1 番号は、コミットで行われたすべての変更のチェックサム、作成者の名前、および親コミットの SHA1 です。(そしてIIRCにはコミットメッセージも含まれていますが、確かではありません)。
リモートからプル/フェッチすると、git は受信したファイルに対してチェックサムをチェックして、コードの破損または変更されたバージョンを受信していないことを確認します。
Git と HG はどちらも SHA1 を使用してコミットを識別します。SVN は変更のシーケンシャル モデルを操作するため、増分バージョン番号をサポートできますが、Git と HG ははるかに洗練されており、頻繁な分岐とマージにはるかに適した開発の有向非巡回グラフ モデルをサポートしています。
HG 増分番号は SVN 増分番号とは異なり、リポジトリの異なるコピー間で特定のリビジョンを参照するのには適していないため、SVN リビジョン番号と同じ方法で使用することはできません。