Gitのステージングエリアとは?addとcommitの間にある領域を図解で解説

Gitのステージングエリア(インデックス)の仕組みを初心者向けに図解で解説します。git addとgit commitの間で何が起きているのか、なぜステージングが必要なのかを理解して、効率的なコミット管理を身につけましょう。

ステージングエリアとは

ステージングエリア(Staging Area)は、Gitにおける「コミット前の準備領域」です。インデックス(Index)とも呼ばれます。git addでファイルを追加すると、変更内容はまずステージングエリアに登録され、git commitを実行したときにはじめてリポジトリに記録されます。

この仕組みにより、作業ディレクトリ内のすべての変更をコミットするのではなく、関連する変更だけを選んでコミットできます。たとえば、複数の機能を同時に修正した場合でも、機能ごとに分けてコミットすることが可能です。

3つの領域の関係

Gitでは、ファイルは「作業ディレクトリ」「ステージングエリア」「リポジトリ」の3つの領域を移動します。

領域説明状態
作業ディレクトリ実際にファイルを編集する場所変更が未追跡またはmodified
ステージングエリアコミット対象として選択された変更staged
リポジトリコミット済みの変更履歴committed

この3層構造がGitの特徴であり、他のバージョン管理システム(SVNなど)との大きな違いです。

なぜステージングエリアが必要なのか

ステージングエリアがあることで、以下のような柔軟な操作が可能になります。

変更を選択的にコミットできる

1つのファイル内で複数の変更を行った場合でも、一部の変更だけをステージングしてコミットできます。

# ファイルの一部の変更だけをステージング
git add -p filename.js

-p(patch)オプションを使うと、変更を「ハンク」(変更のかたまり)単位で選択できます。「y」でステージング、「n」でスキップ、「s」でさらに細かく分割できます。

コミット前に内容を確認できる

ステージングした内容はgit diff --stagedで確認できます。これにより、コミット前に意図した変更だけが含まれているか確認できます。

# ステージングされた変更を確認
git diff --staged

# 作業ディレクトリの変更(未ステージング)を確認
git diff

論理的に意味のあるコミットを作れる

複数のファイルを修正した場合でも、関連する変更だけをまとめてコミットできます。これにより、コミット履歴が読みやすくなり、後からの追跡やrevertが容易になります。

ステージングエリアの基本操作

ファイルをステージングする

# 特定のファイルをステージング
git add filename.js

# 複数のファイルをステージング
git add file1.js file2.js

# すべての変更をステージング
git add .

# 特定のディレクトリ以下をステージング
git add src/

ステージングを取り消す

間違ってステージングした場合は、以下のコマンドで取り消せます。

# 特定ファイルのステージングを取り消す
git restore --staged filename.js

# すべてのステージングを取り消す
git restore --staged .

# Git 2.23以前の書き方
git reset HEAD filename.js

restore --stagedはステージングを取り消すだけで、作業ディレクトリの変更は保持されます。

状態を確認する

git status

出力例:

On branch main
Changes to be committed:
  (use "git restore --staged <file>..." to unstage)
        modified:   staged-file.js

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
        modified:   unstaged-file.js

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        new-file.js
表示状態
Changes to be committedステージング済み(次のコミットに含まれる)
Changes not staged for commit変更あり、未ステージング
Untracked files新規ファイル、Gitで追跡されていない

ファイルの状態遷移

ファイルはGit内で以下の状態を遷移します。

状態説明
Untracked新規ファイル、まだGitで管理されていない
Stagedステージングエリアに追加済み
Committedリポジトリにコミット済み
Modifiedコミット後に変更された

実践的な使い方

一部の変更だけをコミットする

git add -pを使うと、ファイル内の変更を部分的にステージングできます。

git add -p

対話的なプロンプトが表示されます:

@@ -1,3 +1,4 @@
 function hello() {
+  console.log("Debug");  // デバッグ用
   console.log("Hello");
 }
Stage this hunk [y,n,q,a,d,s,e,?]?
キー動作
yこのハンクをステージング
nこのハンクをスキップ
sこのハンクをさらに分割
q終了
?ヘルプを表示

新規ファイルと変更ファイルを分けてコミット

新規ファイルの追加と既存ファイルの修正を別々のコミットにする場合:

# 新規ファイルだけをステージング
git add new-feature.js
git commit -m "feat: 新機能のファイルを追加"

# 変更ファイルをステージング
git add modified-file.js
git commit -m "fix: 既存機能のバグを修正"

変更を確認してからコミット

# 変更をステージング
git add .

# ステージング内容を確認
git diff --staged

# 問題なければコミット
git commit -m "変更内容の説明"

初心者が混乱しやすいポイント

git add . と git add -A の違い

コマンド動作
git add .カレントディレクトリ以下の変更・新規ファイルをステージング
git add -Aリポジトリ全体の変更・新規・削除をステージング
git add -u追跡中ファイルの変更・削除のみステージング(新規ファイルは含まない)

Git 2.0以降、git add .は削除も含むようになりましたが、カレントディレクトリ以下に限定されます。リポジトリ全体を対象にしたい場合はgit add -Aを使います。

ステージングを取り消しても変更は消えない

git restore --stagedはステージングを取り消すだけで、作業ディレクトリの変更はそのまま残ります。

# ステージングを取り消す(変更は残る)
git restore --staged filename.js

# 作業ディレクトリの変更も取り消す(変更が消える)
git restore filename.js

注意git restore(--stagedなし)を実行すると、作業ディレクトリの変更が失われます。取り消す前に本当に不要か確認してください。

コミットせずにステージングしたまま放置すると

ステージングしたまま別のブランチに切り替えると、ステージング内容も一緒に移動します。これは意図しない動作につながることがあります。

# ステージング状態を確認
git status

# ブランチを切り替える前にコミットするか、stashで退避
git stash
git checkout other-branch

ブランチを切り替える前に、作業中の変更をコミットするかstashで退避することをおすすめします。

ステージングエリアとインデックスは同じもの

Gitの公式ドキュメントやツールによって「ステージングエリア」「インデックス」「キャッシュ」と呼び方が異なりますが、すべて同じものを指しています。

呼び方使われる場面
ステージングエリア概念的な説明
インデックス技術的な文脈、内部構造の説明
キャッシュ古いドキュメント、一部のコマンドオプション

まとめ

ステージングエリアは、Gitの「コミット前の準備領域」です。

操作コマンド
ステージングgit add ファイル名
ステージング取り消しgit restore --staged ファイル名
ステージング内容の確認git diff --staged
状態確認git status
部分的なステージングgit add -p

ステージングエリアがあることで、変更を選択的にコミットでき、論理的に意味のあるコミット履歴を作れます。git add -pを使えば、1つのファイル内の変更を分割してコミットすることも可能です。

コミットとは?の記事と合わせて読むと、Gitの基本的なワークフローがより深く理解できます。ステージングエリアを活用して、きれいなコミット履歴を維持しましょう。

編集部

編集部