作業ツリー、ワーキングツリー (working tree)

Git の管理下に入ったローカルのディレクトリツリーを 作業ツリー (working tree) と呼びます。 実際にファイルを編集する場所であり、ユーザーが直接操作するのはこの作業ツリーです。 リポジトリに記録された内容を作業ツリーに展開する操作を チェックアウト (checkout) と呼びます。 git init コマンドなどで作成される .git/ ディレクトリが存在するディレクトリが、作業ツリーのルートになります。

リポジトリ (repository)

変更履歴などを管理するデータベースで、Git ではローカルディレクトリ内にリポジトリの実体が存在します。 リポジトリの実体は、作業ツリーのルートにある .git/ ディレクトリです。 Git は分散型バージョン管理システムなので、各開発者がローカルにリポジトリの完全なコピーを持ちます。 それぞれのリポジトリは対等の関係にあり、コミットされた変更内容を互いにやりとり (push / pull) することでプロジェクト全体の一貫性を保ちます。 一般的には、GitHub などにある一つのリポジトリを中央リポジトリ(リモートリポジトリ)とし、開発のベースとして使用します。

インデックス、ステージングエリア (index / staging area)

インデックス は、作業ツリーとリポジトリ(コミット履歴)の間にある中間領域です。 次回のコミットに含めるファイルの変更内容が登録される場所で、ステージングエリア とも呼ばれます。 git add でファイルをインデックスに登録し、git commit でインデックスの内容をリポジトリに記録する、という 2 段階の仕組みになっています。 インデックスの実体は .git/index ファイルです。

ステージする (stage)

あるファイルの変更を次回のコミット対象に含めることを、ファイルを ステージする (stage) といいます。 git addgit rm コマンドでファイルを指定すると、その変更がインデックスに登録され、次回のコミット対象となります。

ハンク (hunk)

ファイル内の連続した変更箇所のこと。 1 つのファイル内に連続した変更箇所が複数あれば、ハンクも複数存在することになります。 Git ではファイル単位で変更を追跡するのではなく、もっと細かいハンク単位で追跡します。 つまり、ファイル内の変更の一部だけをコミットするという作業が行えます。

チェックアウト (checkout)

リポジトリに格納されたあるリビジョンの内容を作業ツリーに展開し、ローカルファイルとして見えるようにすることを チェックアウトする (checkout) と言います。 また、チェックアウトされているブランチとは、現在の作業ツリーに反映されているブランチのことで、作業対象になっているブランチのことを指します。

main ブランチ / master ブランチ

git init した後の初期状態で何かファイルをコミットすると、デフォルトで main というブランチが作成され、チェックアウトされた状態になります。 以前は master という名前がデフォルトでしたが、Git 2.28.0(2020 年)以降、main がデフォルトのブランチ名として推奨されるようになりました。 GitHub でも 2020 年 10 月から新規リポジトリのデフォルトブランチ名が main に変更されています。

オブジェクトデータベース (object database)

Git プロジェクトのデータベース(オブジェクトデータベース)には、オブジェクト (object) という統一形式でデータが保存されています。 Git のオブジェクトには、ブロブ、ツリー、コミット、タグの 4 種類があり、それぞれ SHA-1 ハッシュ値で一意に識別されます。 オブジェクトデータベースの実体は、作業ツリーにある .git/objects/ ディレクトリです。

ブロブオブジェクト (blob object)

ブロブオブジェクト は、1 つのファイルの内容を表現するオブジェクトです。 ファイル名やパス情報は含まず、ファイルの中身だけを保持します。 同じ内容のファイルは同じブロブオブジェクトとして共有されるため、ストレージの効率化に貢献しています。

ツリーオブジェクト (tree object)

ツリーオブジェクト は、1 つのディレクトリの内容を表現するオブジェクトです。 ツリーオブジェクトには、ディレクトリ内の各エントリのファイル名、パーミッション、および対応するブロブオブジェクトやサブディレクトリのツリーオブジェクトへの参照(オブジェクト ID)が含まれています。

コミットオブジェクト (commit object)

コミットオブジェクト は、1 つのコミットの内容を表現するオブジェクトです。 コミットオブジェクトには、以下の情報が含まれています。

  • tree — コミット時点のプロジェクト全体のスナップショットを表すツリーオブジェクトへの参照
  • parent — 親コミット(直前のコミット)への参照。マージコミットの場合は複数の親を持ちます
  • author — 変更を作成した人の名前、メールアドレス、タイムスタンプ
  • committer — コミットを記録した人の名前、メールアドレス、タイムスタンプ
  • message — コミットメッセージ

タグオブジェクト (tag object)

タグオブジェクト は、注釈付きタグ (git tag -a) を作成したときに生成されるオブジェクトです。 タグ名、タグを作成した人の情報、タグメッセージ、および対象のコミットオブジェクトへの参照が含まれています。 軽量タグ (git tag) の場合はタグオブジェクトは作成されず、コミットへの直接参照のみが記録されます。