𝗜𝗻𝘀𝗶𝗱𝗲 𝗚𝗶𝘁: 𝗢𝗯𝗷𝗲𝗰𝘁𝘀 & 𝗛𝗮𝘀𝗵𝗶𝗻𝗴 Gitの内部構造:オブジェクトとハッシュ

Gitが高速で信頼できる理由は、そのデータ保存の仕組みにあります。Gitをマスターするには、.git ディレクトリを理解することが不可欠です。この隠しフォルダには、Gitがプロジェクトを追跡するために必要なすべての情報が格納されています。

Gitは、作業を管理するために主に4つのオブジェクトタイプを使用します:

  • Blobs(ブロブ):ファイルの内容を保存します。
  • Trees(ツリー):ディレクトリ構造とファイル名を保存します。
  • Commits(コミット):プロジェクトのスナップショットとメタデータを保存します。
  • Tags(タグ):特定のバージョンへの参照を保存します。

Gitはハッシュを使用してすべてを識別します。SHA-1アルゴリズムを使用して、データを一意のIDに変換します。このIDは指紋のような役割を果たします。ファイル内の1文字を変更するだけで、ハッシュ値は完全に変わります。

Gitがスナップショットを作成する方法:

ファイルをコミットすると、Gitはオブジェクトの連鎖を作成します。

  1. Blobがファイル内の実際のテキストやデータを保存します。
  2. TreeがそのBlobを特定のファイル名とフォルダパスに紐付けます。
  3. CommitがそのTreeを、作成者、タイムスタンプ、およびメッセージにリンクさせます。

Gitは変更内容や「デルタ(差分)」を保存するのではなく、スナップショットを保存します。コミットするたびに、Gitは新しいオブジェクトを作成します。これにより、履歴は不変(immutable)となり、復元が容易になります。

この構造を理解することで、エラーの修正、紛失したデータの復元、および複雑なブランチの管理が容易になります。

実際に動作を確認するために、このミニプロジェクトを試してみてください:

  1. リポジトリを初期化する:
mkdir git-lab
cd git-lab
git init
  1. ファイルを作成し、そのハッシュを確認する:
echo 'Hello Git' > hello.txt
git hash-object hello.txt
  1. ファイルをblobとして保存する:
git hash-object -w hello.txt
  1. オブジェクトのタイプと内容を確認する:
git cat-file -t [YOUR_HASH]
git cat-file -p [YOUR_HASH]
  1. コミットを作成し、ツリーを確認する:
git add hello.txt
git commit -m 'Initial commit'
git ls-tree HEAD

内部構造を見ることで、Gitが単なるバージョン管理ツール以上の存在であることがわかります。それは、コンテンツ・アドレッシング(内容によるアドレス指定)されたオブジェクトの、高度に整理されたデータベースなのです。

Source: https://dev.to/lotanna_obianefo/inside-git-objects-hashing-44gc

Optional learning community: https://t.me/GyaanSetuAi