すでにコミットしたファイルを .gitignore で無視する
.gitignore に追加しても追跡され続けるファイルを git rm --cached で追跡から外す方法、無視ルールに一致する追跡ファイルの探し方、秘密情報がコミットされたときの手順を説明します。
最もよく受ける質問である。.gitignore はまだ追跡されていないファイルにのみ適用される。 一度コミットされたファイルは、ルールを追加しても変更が表示され続ける。追跡を止めるには、インデックス(ステージングエリア)からファイルを外す必要がある。
ファイル 1 つまたはフォルダー 1 つ
# 1) .gitignore にルールを追加(例: .env, dist/)
# 2) インデックスからのみ削除 — 作業フォルダーの実ファイルはそのまま残る
git rm --cached .env
git rm -r --cached dist/
# 3) コミット
git commit -m "Stop tracking .env and dist"
--cached が要点である。このオプションがないと、git rm は作業フォルダーのファイルまで削除する。ディレクトリには -r が必要である。
無視ルールに一致する追跡ファイルを探す
テンプレートを新たに適用した後、何が一致するかを確認するには次のコマンドを使う。
git ls-files -ci --exclude-standard
-c は追跡中のファイル、-i は無視ルールに一致するものだけ、--exclude-standard は .gitignore・.git/info/exclude・グローバル設定をすべて適用するという意味である。一覧が正しければ、一度に追跡から外せる。
# bash / zsh
git ls-files -ci --exclude-standard -z | xargs -0 git rm --cached --
# PowerShell
git -c core.quotePath=false ls-files -ci --exclude-standard | ForEach-Object { git rm --cached -- "$_" }
ジェネレーターの追跡解除タブで、このコマンドをシェルに合わせて作成できる。
全体を再適用する方法
.gitignore を大きく変えた場合は、インデックスを空にして再び追加する方法もよく使われる。
git rm -r --cached .
git add .
git commit -m "Apply .gitignore"
git add . は無視ルールを適用して再追加するので、無視の対象は外れる。ただし、コミットする前に必ず git status で削除一覧を確認する。改行設定(core.autocrlf)が変わったリポジトリでは、多くのファイルが変更として表示されることがある。
他の人への影響
追跡解除のコミットを push すると、そのコミットを pull した他の人の作業フォルダーでは該当ファイルが削除される。 git から見ると、ファイルがリポジトリから削除されたことになるためである。.env や IDE の設定のように各自に必要なファイルなら、事前に知らせてバックアップしてもらう。
秘密情報がすでに push されていたら
追跡解除はこれからのコミットにしか影響しない。過去のコミットにはファイルがそのまま残っており、誰でも履歴から取り出せる。手順は次のとおりである。
- 露出したキー・パスワードをまず破棄し、新たに発行する。 これが最も重要である。
- ファイルを追跡から外し、.gitignore に追加する。
- 必要なら git filter-repo のようなツールで履歴からファイルを削除し、強制 push する。すでに clone・fork されたコピーまでは消せないため、1 の代わりにはならない。
assume-unchanged、skip-worktree は無視機能ではない
git update-index --assume-unchanged と --skip-worktree は追跡中のファイルの変更を一時的に見えなくするが、ファイルは追跡され続ける。
--assume-unchangedはパフォーマンスのためのヒントである。git がファイルの変更を確認しなくてよいと約束するもので、git は必要ならこの印を無視できる。--skip-worktreeは作業フォルダーのファイルに git が手を触れないようにする印で、スパースチェックアウト(sparse checkout)に使われる。
git のドキュメントも、追跡ファイルの変更を無視する目的でこれらのオプションを使わないよう案内している。共有設定ファイルは config.example.json をコミットし、実際の config.json は無視する方式が安全である。
参考
- git-rm 公式ドキュメント
- git-ls-files 公式ドキュメント
- git-update-index 公式ドキュメント: NOTES
- GitHub Docs: Ignoring files
- 確認基準日: 2026-09-23 (git 2.50.1 でコマンドを検証)