章 ▾ 第2版

10.1 Gitの内部構造 - 配管と磁器

この章にずっと前の章から飛んできた方もいるでしょうし、この書籍のここまでの内容を順番に読んできてたどり着いた方もいるでしょう。いずれにしても、ここではGitの内部の仕組みと実装について見ていきます。この情報を理解することが、Gitがいかに有用で強力であるかを評価するために極めて重要であると我々は考えましたが、一方で初心者にとっては混乱を招き、不必要に複雑になりうると主張する人もいます。したがって、この議論は本書の最後の章に配置し、学習プロセスの早い段階で読むことも、後で読むこともできるようにしました。それは皆さんの判断にお任せします。

さて、この章を読み始めたところで、早速始めましょう。まず、まだ明確でない場合は、Gitは本質的にコンテンツアドレス指定可能なファイルシステムであり、その上にVCS(バージョン管理システム)のユーザーインターフェースが構築されているということを理解してください。これが何を意味するのかについては、後ほど詳しく説明します。

Gitの初期の頃(主にバージョン1.5以前)は、洗練されたVCSというよりもこのファイルシステムに重点が置かれていたため、ユーザーインターフェースははるかに複雑でした。ここ数年で、UIは既存のどのシステムと比べてもクリーンで使いやすくなるまで洗練されました。しかし、初期のGitのUIが複雑で習得が難しいという固定観念は残っています。

コンテンツアドレス指定可能なファイルシステム層は驚くほど優れており、この章ではまずその点について説明します。その後、転送メカニズムや、いずれ対処する必要があるかもしれないリポジトリのメンテナンス作業について学びます。

配管と磁器

この書籍は主に、checkoutbranchremoteなどの約30のサブコマンドを使ってGitを操作する方法を扱っています。しかし、Gitは元々、完全なユーザーフレンドリーなVCSというよりもバージョン管理システムのためのツールキットとして開発されたため、低レベルの作業を行うサブコマンドが多数あり、UNIXスタイルで連結して使用したり、スクリプトから呼び出したりするように設計されています。これらのコマンドは一般にGitの「配管」コマンドと呼ばれ、よりユーザーフレンドリーなコマンドは「磁器」コマンドと呼ばれます。

これまでに気づかれたかもしれませんが、この書籍の最初の9つの章では、ほぼ磁器コマンドのみを扱ってきました。しかし、この章では主に低レベルの配管コマンドを扱います。なぜなら、それらはGitの内部動作にアクセスすることを可能にし、Gitがどのように、そしてなぜそう動作するのかを理解するのに役立つからです。これらのコマンドの多くは、コマンドラインで手動で使用することを意図しているのではなく、新しいツールやカスタムスクリプトのための構成要素として使用することを目的としています。

新規または既存のディレクトリでgit initを実行すると、Gitは.gitディレクトリを作成します。このディレクトリには、Gitが格納および操作するほとんどすべてのものが含まれています。リポジトリをバックアップしたりクローンしたりしたい場合、この単一のディレクトリを別の場所にコピーするだけで、必要なもののほとんどが得られます。この章全体は基本的に、このディレクトリ内で見ることができるものについて扱います。新しく初期化された.gitディレクトリは通常、次のようになります

$ ls -F1
config
description
HEAD
hooks/
info/
objects/
refs/

Gitのバージョンによっては、追加のコンテンツが表示される場合がありますが、これはgit initで作成されたばかりのリポジトリであり、デフォルトで表示されるものです。descriptionファイルはGitWebプログラムによってのみ使用されるため、気にする必要はありません。configファイルにはプロジェクト固有の設定オプションが含まれ、infoディレクトリには.gitignoreファイルで追跡したくない無視パターン用のグローバルな除外ファイルが保持されます。hooksディレクトリにはクライアント側またはサーバー側のフックスクリプトが含まれており、これらはGitフックで詳しく説明されています。

これで、4つの重要なエントリが残ります。それは、HEADファイル、(まだ作成されていない)indexファイル、そしてobjectsディレクトリとrefsディレクトリです。これらはGitの中核部分です。objectsディレクトリはデータベースのすべてのコンテンツを格納し、refsディレクトリはそのデータ内のコミットオブジェクト(ブランチ、タグ、リモートなど)へのポインタを格納します。HEADファイルは現在チェックアウトしているブランチを指し、indexファイルはGitがステージングエリア情報を格納する場所です。Gitがどのように動作するかを見るために、これらの各セクションを詳しく見ていきましょう。

scroll-to-top