Linuxコマンドの基本:Git:ワークツリーとインデックス

 ここでは、「Gitの基本的な使い方」で使ったgit addgit commitがどのようにワークツリーとインデックス、そしてリポジトリの間で機能するのか、図やコマンド表を用いてわかりやすく説明します。


ワークツリーとインデックスとは何か

 Gitでファイルをコミットする際は、単純にワークツリー(作業用ディレクトリ)からリポジトリへ直接変更を反映しているわけではありません。間に「インデックス」という領域が存在し、コミットする変更内容はまずこのインデックスに登録(ステージング)され、その後にインデックスの内容がリポジトリへと反映されます。この仕組みを理解すると、git addgit commitが行っている処理の流れが明確になります。

ワークツリーとインデックスの関係

  • ワークツリー (Working Tree)
     Gitで管理しているプロジェクトディレクトリのことです。ここでは実際にファイルの編集や作成などの作業を行います。ワークツリー上でファイルを編集しても、まだリポジトリには反映されません。
  • インデックス (Index)
     コミットする内容を一時的に記録しておくステージ領域です。git addコマンドで、修正したファイルをインデックスに登録します。インデックスは「次回のコミットで反映する変更内容」を決定する場所と考えるとよいでしょう。
  • リポジトリ (Repository)
     .gitディレクトリとして存在し、コミット履歴やブランチ、タグなどの情報を格納するデータベースです。git commitコマンドを実行すると、インデックスの内容がリポジトリに永続的な履歴として保存されます。

図で見るワークツリーとインデックス

「ワークツリーとインデックス図」を例に解説をします。下記のような流れになります。

ワークツリーとインデックス図

  1. 初期状態
     ワークツリーとインデックスが同じ状態であり、リポジトリに登録済みの内容が反映された状態を想定します。ファイルfile-Afile-Bが存在し、どちらも最新コミットと同じ内容です。
  2. ファイルの編集
     ワークツリー上でfile-Afile-Bを編集します。しかし、この時点ではインデックスには変更が反映されません。ワークツリーが変わっても、インデックスは以前のままです。
  3. git add実行
     git add file-Afile-Aの変更内容をインデックスに登録します。この結果、file-Aの変更は次のコミット対象となりましたが、file-Bはまだインデックスに反映されていません。したがって、次にコミットしてもfile-Aの変更だけがリポジトリに反映されることになります。
  4. コミット (git commit)
     git commitを実行すると、インデックスにステージングされているfile-Aの変更がリポジトリにコミットされます。file-Bの変更はまだワークツリーに残ったままで、コミットには含まれません。

 このように、ワークツリーでの編集内容が必ずしも全てコミットされるわけではなく、git addによってインデックスに登録したものだけがコミット対象になる点がポイントです。

よく使うGitコマンドと詳細解説

コマンド役割・詳細使用例
git status現在のワークツリーとインデックスの状態を表示します。未コミット変更やステージされていない変更が一目でわかります。git status
git diff差分を表示します。ワークツリーとインデックス、インデックスとリポジトリ間の差分を指定でき、何が変更されたか確認可能です。git diff (ワークツリーとインデックスの差分表示)git diff --staged (インデックスとリポジトリの差分表示)
git add <ファイル>指定したファイルの変更をインデックスに登録(ステージ)します。この後、git commitを実行することでリポジトリに反映されます。git add logview.sh
git commitインデックスにある変更内容をリポジトリにコミットします。-mオプションでメッセージを指定、未指定時はエディタで編集可能。git commit -m "変更内容の説明"

git diffでの差分確認

 git diffコマンドは、ワークツリーとインデックス、あるいはインデックスとリポジトリとの差分を確認するのに便利です。

  • ワークツリーとインデックス間の差分
    git diff
    ・ワークツリーで行った変更のうち、まだgit addされていない部分が表示されます。
  • インデックスとリポジトリ間の差分
    git diff --staged(またはgit diff --cached
    ・すでにgit addされているが、まだコミットされていない変更点を確認できます。

 これらのオプションを使い分けることで、「どの段階の変更がどこまで反映されているか」を正確に把握できます。


まとめ

 ワークツリー、インデックス、リポジトリという3つの領域は、Gitによるバージョン管理の基本的な構造を理解する上でとても重要です。以下がポイントです。

  • ワークツリー:ファイルの実際の編集場所
  • インデックス:次にコミットする変更内容を一時的に保存する領域
  • リポジトリ:コミットされた変更履歴を永久的に保存する領域

 git addで特定の変更をインデックスに登録し、git commitでインデックスの内容をリポジトリに反映させます。git statusgit diffを用いて、どの変更がどの段階にあるのかを明確にすることで、より効率的なバージョン管理が可能になります。