11.

git add 完全ガイド (ステージング)

編集
この記事の要点
  • git add は変更を「ステージング領域 (index)」に乗せるコマンド。commit 対象はステージのみ
  • git add file 個別、git add . カレント以下、git add -A 削除も含めて全部
  • git add -p でハンク(差分の塊)単位で選択 → 関係ない変更を分けてコミット
  • ステージ確認: git diff --cached または git status
  • 取り消し: git restore --staged file(Git 2.23+) / 旧 git reset HEAD file

git add とは(ステージング領域)

Git のコミットは 3 つの領域を行き来します:

[Working Tree]      [Staging (Index)]      [Repository]
  編集中ファイル → git add →   ステージ   → git commit → コミット履歴
                    ↑
              git restore --staged で戻る

git add は "何を次のコミットに含めるか" を選ぶ作業です。「全ての変更を勝手にコミットする」のではなく、意図的に選んでコミットできるのが Git の強みです。

基本オプション一覧

コマンド対象削除の扱い
git add file.txt個別ファイル明示すれば削除も
git add dir/ディレクトリ配下削除も含む
git add .カレント以下の全変更削除も含む(Git 2.0+)
git add -A / --allリポジトリ全体の全変更削除も含む
git add -u / --update追跡中ファイルのみ変更・削除含む。新規は無視
git add -p対話的にハンク選択選択次第
git add -i対話モード選択次第
git add -nドライラン(何が add されるか確認のみ)

使用例

# 個別ファイル
git add README.md

# 複数ファイル
git add README.md src/Login.php

# パターン
git add src/*.php
git add '**/*.test.js'

# カレント以下全て
git add .

# 削除されたファイルも含めて全部
git add -A

# 追跡中ファイルのみ(新規は無視)
git add -u

# 確認だけ(ドライラン)
git add -n .

パッチモード(-p)でハンク選択

1つのファイルに「機能追加」と「無関係なフォーマット修正」が混ざっているとき、機能追加だけをステージするために使います。「1コミット1目的」の習慣を支える機能。

git add -p

# Git が差分をハンク(塊)ごとに見せて、それぞれ採用/却下を聞く
# 操作キー:
#   y - このハンクをステージ
#   n - 飛ばす
#   q - 終了
#   s - ハンクをさらに小さく分割
#   e - ハンクを手動編集
#   ? - ヘルプ

ステージ状態の確認

# サマリー
git status

# ステージ済の差分を見る(次回コミットに含まれる内容)
git diff --cached
git diff --staged    # ↑のエイリアス

# 未ステージの差分(ワーキングツリー vs ステージ)
git diff

# 全部(ステージ + 未ステージ)
git diff HEAD

ステージから戻す(unstage)

「間違えて add してしまった」場合、ファイル内容は変えずにステージから外せます。

# Git 2.23+ 推奨
git restore --staged file.txt

# 全部 unstage
git restore --staged .

# 旧来の書き方(今でも動く)
git reset HEAD file.txt
git reset HEAD       # 全部

# 「ファイルの中身も最新コミット状態に戻す」(破壊的)
git restore file.txt
# 旧: git checkout -- file.txt

.gitignore は git add で尊重される

git add ..gitignore に書かれたパターンを自動でスキップします。ただし明示的なパス指定なら無視ルールを上書きできます:

# .gitignore に *.log 指定済
git add .              # → app.log はスキップされる
git add app.log        # → スキップされる(警告)
git add -f app.log     # → 強制 add(.gitignore を無視)

git status の見方

$ git status
On branch main
Changes to be committed:                    ← ステージ済(緑)
  (use "git restore --staged ..." to unstage)
        modified:   src/Login.php
        new file:   src/Register.php

Changes not staged for commit:              ← 未ステージ(赤)
  (use "git add ..." to update what will be committed)
        modified:   README.md

Untracked files:                            ← 未追跡(新規・赤)
  (use "git add ..." to include in what will be committed)
        config/local.php

add 後にファイルを更に編集したら

add 後に同じファイルを編集すると、ステージ済のスナップショットと現在のファイルが食い違います。そのままコミットすると add 時点の内容が記録されます。

echo "v1" > a.txt
git add a.txt        # ← v1 がステージ
echo "v2" > a.txt    # ← ワーキングツリーは v2
git diff             # → v1 と v2 の差分(未ステージ部分)
git diff --cached    # → v1 がステージされている
git commit -m "..."  # → v1 がコミット(v2 は次回コミット対象)

# v2 も入れたければ再 add
git add a.txt
git commit --amend --no-edit   # 直前コミットに混ぜる

IDE での統合

  • VS Code: Source Control パネルの "+" ボタンでステージ。行単位ステージも可能
  • JetBrains IDE: 「Changes」ビューで右クリック → Add to VCS
  • GitHub Desktop: チェックボックスで選択
  • SourceTree: 「Unstaged」から「Staged」へ移動

FAQ

Q: git add .git add -A の違いは?
A: Git 2.0 以降はほぼ同じです(削除も含む)。違いは作業対象範囲: .はカレントディレクトリ以下、-Aはリポジトリ全体。

Q: add せずに直接コミットしたい
A: git commit -am "..." で追跡中ファイルの変更を一括 add + commit できます。新規ファイルは含まれません。

Q: バイナリファイルや巨大ファイルは?
A: そのまま add 可能ですがリポジトリが肥大化します。動画・画像・モデルファイルなどは Git LFS の導入を検討。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. 用語一覧
  2. エラー一覧
  3. git本体のインストール(Linux)
  4. Linuxサーバーへのgit導入とクライアントのセットアップ
  5. リモートリポジトリをローカルリポジトリとしてクローンする方法
  6. リモートとローカルのリポジトリを同期(pull)する方法
  7. 設定の確認
  8. gitユーザー名とemailの設定
  9. リモートリポジトリの作成
  10. ローカルリポジトリの作成
  11. 新規ファイル/ディレクトリをインデックスに登録
  12. インデックスの登録状態を確認
  13. ローカルリポジトリの変更をコミット
  14. コミット履歴の確認
  15. クライアントからリモートリポジトリの接続設定、確認、削除
  16. リポジトリへのプッシュ
  17. リモートリポジトリからクライアントへのSSHクローン
  18. リモートとローカルの差分表示
  19. バージョンの確認
  20. プロキシの設定
  21. ローカルをリモートリポジトリの状態に戻す
  22. ブランチの作成, 一覧表示, 切り替え
  23. ブランチのマージと削除
  24. リベース
  25. .gitignoreの書き方
  26. .gitignoreの設定が反映されない場合
  27. 特定のファイルをgitの管理から外す方法
  28. 参照(ORIG_HEAD, HEAD, FETCH_HEAD)
  29. git rm [-r --cached] の取り消し
  30. 一部のディレクトリ/ファイルのみをリポジトリから復元する方法
  31. ローカルとリモートリポジトリの有無を同期
  32. pushの取消し方法
  33. マージツールの起動方法
  34. Gitで「MERGING」の状態