「Gitを使っているけど、git addで一体何をしているのか、正直よく分からない…」「そもそもステージングって何?」そう感じたことはありませんか?
ステージングは、Gitの仕組みを理解する上で最も重要な概念の一つです。
ここが曖昧だと、「間違ったファイルも一緒にコミットしてしまった」というミスにも繋がりかねません。
本記事では、Gitのステージングとは何かや、なぜステージングが必要なのかを具体的なコード例を交えて段階的に説明しています。
この記事を読めば、あなたは自信を持ってgit addを使いこなせるようになります。
Gitのステージングとは何か?
Gitにおけるgit addのステージングとは、次にコミットしたいファイルを一時的に準備しておく行為、またはその準備場所のことを指します。
より具体的には、git addコマンドで変更が追加された場所のことで、インデックスとも呼ばれます。
英語の「ステージング」(staging)は、一般的に「何かを行うための準備段階」や「段階的に実行すること」です。
Gitの文脈で使われる「ステージング」の概念(変更をコミットするために準備する中間地点)も、この一般的な意味合いから派生しています。
ステージングはなぜ必要か?
ステージングがある最大のメリットは、どの変更をコミット対象にするかをコントロールできることです。
ステージングを上手に使うことで、Gitの履歴(バージョン)をよりきれいに、かつ意味のあるまとまりとして残すことができます。
例えばどういうこと?
一つのコミットには、一つの論理的な変更(機能追加、バグ修正など)だけを含めるのがベストプラクティスです。
しかし、開発作業中には、以下のような複数の変更を同時行うことがよくあります。
- ファイルAのコーディングによる開発
- ファイルBのタイプミスの修正
ステージングを使えば、これらの変更の中から「ファイルAのコーディング」をコミット対象とし、「ファイルBの修正」はステージングせずに残しておくことが可能です。
コードで解説
上記の状態をコードで解説します。
ファイルA「main.py」を編集し、同時にファイルB「typo.txt」も修正したとします。
git statusで状態を確認すると以下のように表示されます。
$ git status
On branch main
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: main.py
modified: typo.txt
no changes added to commit (use "git add" and/or "git commit -a")コミット用にステージしていないファイルとして、ファイルA「main.py」とファイルB「typo.txt」が表示されています。
このうち、ファイルA「main.py」だけをコミット用に準備するには 以下のコマンドを実行します。
$ git add main.pyこの状態で再度git statusで状態を確認すると以下のように表示されます。
$ git status
On branch main
Changes to be committed:
(use "git restore --staged <file>..." to unstage)
modified: main.py # コミット対象
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: typo.txt # コミット対象外コミットされる予定の変更の部分に「main.py」が移動しています。
この状態でgit commitを実行すれば、main.pyの変更のみがコミットされます。
$ git commit -m "機能Aを追加"ステージのコードの確認
git addでステージに加えた状態の変更をを確認したい場合は以下のコードを実行します。
git diff --staged例えば、上記のコミット前の処理であれば以下のようにコードが表示され、ステージング中の変更内容を確認することができます。
$ git diff --staged
diff --git a/main.py b/main.py
index a1b2c3d..e4f5g6h 100644
--- a/main.py
+++ b/main.py
@@ -1,5 +1,9 @@
# 古いコード
def calculate_sum(a, b):
- return a * b # バグ: 足し算の代わりに掛け算をしている
+ # バグ修正: 足し算を行う
+ return a + b
+# 新しい機能を追加
+def get_welcome_message(user_name):
+ return f"Hello, {user_name}!"ステージ前の変更(上記ではファイルB「typo.txt」)を確認するには、git diffコマンドを使います。
| コマンド | 表示される差分 | 意味 |
git diff --staged | main.pyの変更 のみ | ステージングエリア vs. 最後のコミット |
git diff (引数なし) | typo.txtの変更 のみ | ワーキングツリー vs. ステージングエリア |
git diff HEAD | main.pyとtypo.txtの両方の変更 | ワーキングツリー vs. 最後のコミット |


