タイトル: 新規ファイル/ディレクトリをインデックスに登録
SEOタイトル: git add 完全ガイド (ステージング)
| この記事の要点 |
|
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 の導入を検討。