◀ 12.

【git】インデックスの登録状態を確認

▶
この記事の要点
  • Git のインデックス(ステージング領域)は「次のコミットに入る内容」を置く場所
  • 何がステージされているかは git status の「Changes to be committed(コミット予定の変更点)」で確認
  • 差分の中身まで見るなら git diff --cached(--staged も同じ)
  • ファイル名だけなら git diff --cached --name-only、短い一覧は git status -s
  • ステージを取り消すのは git restore --staged ファイル(古い Git は git reset HEAD ファイル)

インデックス(ステージング領域)とは

Git では、ファイルの変更は次の 3 つの場所を順に移動します。

場所内容移動させるコマンド
作業ツリー実際に編集しているファイル—
インデックス次のコミットに含める内容(ステージ済み)git add
リポジトリ(HEAD)コミット済みの履歴git commit

git commit は作業ツリーではなくインデックスの内容をコミットします。そのため、コミット前に「インデックスに何が登録されているか」を確認することで、入れ忘れや余計なファイルの混入を防げます。本稿は git の index に登録している状態を確認する方法を説明します。

基本: git status で確認する

以下のコマンドを実行します。

$ git status
ブランチ master
コミット予定の変更点:
  (use "git restore --staged <file>..." to unstage)
	new file:   file3
	modified:   file1

コミット予定に含まれていない変更:
  (use "git add <file>..." to update what will be committed)
	modified:   file2

追跡されていないファイル:
	memo.txt

表示は 3 つのブロックに分かれます。

  • コミット予定の変更点(Changes to be committed): インデックスに登録済みの変更。次の git commit に入る
  • コミット予定に含まれていない変更(Changes not staged for commit): 編集したがまだ git add していない変更
  • 追跡されていないファイル(Untracked files): Git がまだ管理していない新規ファイル

同じファイルが上下両方に出ることがあります。これは「一度 add したあとにさらに編集した」状態で、add した時点の内容だけがコミットされます。最新の内容を入れたいなら、もう一度 git add します。

Git のバージョンによっては、取り消し方法の案内が git reset HEAD <file> と表示されます(Git 2.23 より前)。どちらも「ステージを取り消す」という意味です。

短く確認する: git status -s

$ git status -s
A  file3
M  file1
 M file2
?? memo.txt

先頭 2 文字のうち、左がインデックスの状態、右が作業ツリーの状態です。

表示意味
A(左)新規ファイルをステージ済み
M(左)変更をステージ済み
M(右)変更したがステージしていない
D削除(左ならステージ済み)
Rリネーム(ステージ済み)
??未追跡ファイル
MMステージ後にさらに変更あり

ステージした内容の差分を見る: git diff --cached

git status はファイル名しか表示しません。どの行を変更してステージしたかを見るには次のコマンドを使います。

# インデックスと HEAD(直前のコミット)の差分 = 次にコミットされる内容
git diff --cached
git diff --staged          # 同じ意味

# ファイル名だけ
git diff --cached --name-only

# ファイル名と状態(A/M/D)
git diff --cached --name-status

# 変更行数の統計
git diff --cached --stat

オプションなしの git diff は「作業ツリーとインデックスの差分」、つまりまだステージしていない変更を表示します。混同しやすいので注意してください。

インデックスの中身そのものを見る: git ls-files

インデックスには、変更分だけでなく追跡中の全ファイルが登録されています。一覧は次のコマンドで確認できます。

# インデックスに登録されている全ファイル
git ls-files

# モード・オブジェクト ID・ステージ番号付き
git ls-files -s

git ls-files -s のステージ番号は通常 0 です。マージで競合が起きているファイルは 1〜3 の番号で複数行表示されるため、競合の確認にも使えます。

間違えてステージしたときの取り消し

# ステージを取り消す(作業ツリーの変更は残る)
git restore --staged file3

# Git 2.23 より前
git reset HEAD file3

# 追跡自体をやめる(ファイルは残す)
git rm --cached secret.env

git rm --cached は追跡をやめるコマンドなので、単に「add を取り消したい」場合は git restore --staged を使います。

よくある質問

Q. 「git add .」で何が入ったか一覧で確認したい
A. git diff --cached --name-status が便利です。不要なファイルが入っていたら git restore --staged で外し、.gitignore に追加します。

Q. コミット直前に最終確認する習慣をつけたい
A. git commit -v を使うと、コミットメッセージ入力画面にステージ済みの差分が表示されます。

関連

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」の状態