【Git】ステージングとは何か?なぜ必要なのか?実例のコードで分かりやすく解説!(git add)

git-prograshi(プロぐらし)-kv git/github
記事内に広告が含まれていることがあります。

「Gitを使っているけど、git addで一体何をしているのか、正直よく分からない…」「そもそもステージングって何?」そう感じたことはありませんか?

ステージングは、Gitの仕組みを理解する上で最も重要な概念の一つです。

ここが曖昧だと、「間違ったファイルも一緒にコミットしてしまった」というミスにも繋がりかねません。

本記事では、Gitのステージングとは何かや、なぜステージングが必要なのかを具体的なコード例を交えて段階的に説明しています。

この記事を読めば、あなたは自信を持ってgit addを使いこなせるようになります。


Gitのステージングとは何か?

Gitにおけるgit addのステージングとは、次にコミットしたいファイルを一時的に準備しておく行為、またはその準備場所のことを指します。

より具体的には、git addコマンドで変更が追加された場所のことで、インデックスとも呼ばれます。

ステージングの意味

英語の「ステージング」(staging)は、一般的に「何かを行うための準備段階」や「段階的に実行すること」です。

Gitの文脈で使われる「ステージング」の概念(変更をコミットするために準備する中間地点)も、この一般的な意味合いから派生しています。


ステージングはなぜ必要か?

ステージングがある最大のメリットは、どの変更をコミット対象にするかをコントロールできることです。

ステージングを上手に使うことで、Gitの履歴(バージョン)をよりきれいに、かつ意味のあるまとまりとして残すことができます。


例えばどういうこと?

一つのコミットには、一つの論理的な変更(機能追加、バグ修正など)だけを含めるのがベストプラクティスです。

しかし、開発作業中には、以下のような複数の変更を同時行うことがよくあります。

  1. ファイルAのコーディングによる開発
  2. ファイル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}!"
MEMO

ステージ前の変更(上記ではファイルB「typo.txt」)を確認するには、git diffコマンドを使います。

コマンド表示される差分意味
git diff --stagedmain.pyの変更 のみステージングエリア vs. 最後のコミット
git diff (引数なし)typo.txtの変更 のみワーキングツリー vs. ステージングエリア
git diff HEADmain.pytypo.txtの両方の変更ワーキングツリー vs. 最後のコミット

タイトルとURLをコピーしました