| この記事の要点 |
|
なぜ .gitignore が効かないのか
「.gitignore に書いたのに、変更が git status に表示される」「コミット対象から外れない」という症状の 99% は同じ原因です:
.gitignore は「まだ Git に追跡されていない(untracked)ファイル」にしか効きません。
一度コミットしたファイルや git add 済のファイルは、.gitignore に追記しても無視されません。
Git の追跡状態は次の 3 つに分類されます:
| 状態 | 説明 | .gitignore の効果 |
|---|---|---|
| untracked | Git が知らないファイル | 効く(無視される) |
| tracked (committed) | 過去にコミット済 | 効かない(追跡継続) |
| tracked (staged) | git add 済 | 効かない |
原因の切り分け: git check-ignore
まずはそのファイルが どのルールにマッチしているか / そもそも追跡済か を git check-ignore で確認します:
# どのルールでマッチしているか表示(-v: verbose)
git check-ignore -v config/local.env
# 出力例:
# .gitignore:3:*.env config/local.env
# ↑ファイル ↑行 ↑ルール ↑対象
# マッチしない場合は何も表示されない → ルールが書けていない or 既に tracked
# 全候補を確認
git check-ignore -v -- *
# 追跡済か確認
git ls-files --error-unmatch config/local.env
# 0 で抜ければ tracked、エラーなら untracked
対処1: 既に追跡済ファイルを untrack する
最も多いケース。git rm --cached でインデックスから削除(ワーキングツリーのファイル自体は残る):
# 単一ファイル
git rm --cached config/local.env
# ディレクトリ単位
git rm -r --cached node_modules/
git rm -r --cached .idea/
# ワイルドカード
git rm --cached "*.log"
# コミット
git add .gitignore
git commit -m "Untrack files that should be ignored"
注意: git rm --cached はリモートで pull した他メンバーの環境からもそのファイルを削除します。.env 等の個人設定ファイルを untrack する場合は、事前にチームに周知すること。
対処2: 全ファイル untrack して再 add(リセット)
.gitignore を大幅に変更した、または「とりあえず全部 .gitignore を反映し直したい」場合の決定版:
# 1. 全ファイルをインデックスから一旦外す
git rm -r --cached .
# 2. .gitignore を効かせた状態で再追加
git add .
# 3. 差分を確認(無視対象だけが削除されているはず)
git status
# 4. コミット
git commit -m "Apply .gitignore"
これで .gitignore に新しく書いたパターンがすべて反映されます。
対処3: 書き方ミスをチェック
.gitignore の書き方には独特のルールがあります。よくある間違い:
| 書き方 | 意味 | 注意 |
|---|---|---|
*.log | 全階層の .log ファイル | OK |
/build | リポジトリ直下の build のみ | サブディレクトリの build は無視しない |
build/ | 全階層の build ディレクトリ | 末尾スラッシュ重要 |
!important.log | 除外を打ち消す | 親ディレクトリが無視されていると効かない |
# comment | コメント | 行頭のみ。行末 # は無効 |
| BOM 付き .gitignore | UTF-8 BOM があるとパース失敗 | BOM なしで保存 |
対処4: グローバル .gitignore
.DS_Store / Thumbs.db / .idea/ など 個人環境特有のファイルは、プロジェクトの .gitignore ではなくホームの ~/.gitignore_global に書くのが行儀の良い運用:
# ~/.gitignore_global を作成
cat > ~/.gitignore_global <<EOF
.DS_Store
Thumbs.db
.idea/
.vscode/
*.swp
*~
EOF
# Git に登録
git config --global core.excludesfile ~/.gitignore_global
# 確認
git config --global --get core.excludesfile
対処5: 一時的に変更を無視する(assume-unchanged / skip-worktree)
「tracked のままだが、ローカル変更を Git に見せたくない」ケース。config ファイルをローカルでだけ書き換えるときに便利:
# 変更を無視する(Git が「ファイル変わってない」とみなす)
git update-index --assume-unchanged config/database.yml
# 解除
git update-index --no-assume-unchanged config/database.yml
# 現在 assume-unchanged になっているファイル一覧
git ls-files -v | grep "^h "
# より強力: skip-worktree(pull で上書きもされない)
git update-index --skip-worktree config/database.yml
# 解除
git update-index --no-skip-worktree config/database.yml
注意: assume-unchanged / skip-worktree はローカル設定でリモートに伝わりません。チーム共有が必要な無視は .gitignore か .git/info/exclude を使うべき。
対処6: リポジトリローカルな無視 (.git/info/exclude)
「自分の作業環境だけ無視したい、でも .gitignore はチーム共有でいじりたくない」場合は .git/info/exclude:
# このリポジトリの自分の環境だけで無視
echo "scratch/" >> .git/info/exclude
echo "*.local" >> .git/info/exclude
# .git/ 配下なのでコミットされない
確認手順チートシート
# Step 1. そのファイルは tracked?
git ls-files | grep target.txt
# Step 2. .gitignore のどのルールに該当している?
git check-ignore -v target.txt
# Step 3. 何も該当しなければ .gitignore のパターンを見直し
cat .gitignore
# Step 4. tracked だった場合は untrack
git rm --cached target.txt
git commit -m "Untrack target.txt"
FAQ
Q: .env を間違ってコミットしてしまった
A: 履歴からも消したい場合は git filter-repo または BFG Repo-Cleaner。リモート push 済なら強制 push とシークレット失効処理が必須。
Q: サブディレクトリの .gitignore は効く?
A: 効きます。階層ごとに .gitignore を置けます。ルートのルールはサブにも継承されます。
Q: 否定ルール (!file) が効かない
A: 親ディレクトリが無視されていると子の否定は効きません。foo/ + !foo/important.txt は不可。foo/* + !foo/important.txt なら可。
関連トピック
.gitattributes— 改行コードやマージ動作の指定git clean -fdn— untracked ファイルの掃除(事前 dry-run)git stash -u— untracked ファイルも含めて stash
子ページはありません
- 用語一覧
- エラー一覧
- git本体のインストール(Linux)
- Linuxサーバーへのgit導入とクライアントのセットアップ
- リモートリポジトリをローカルリポジトリとしてクローンする方法
- リモートとローカルのリポジトリを同期(pull)する方法
- 設定の確認
- gitユーザー名とemailの設定
- リモートリポジトリの作成
- ローカルリポジトリの作成
- 新規ファイル/ディレクトリをインデックスに登録
- インデックスの登録状態を確認
- ローカルリポジトリの変更をコミット
- コミット履歴の確認
- クライアントからリモートリポジトリの接続設定、確認、削除
- リポジトリへのプッシュ
- リモートリポジトリからクライアントへのSSHクローン
- リモートとローカルの差分表示
- バージョンの確認
- プロキシの設定
- ローカルをリモートリポジトリの状態に戻す
- ブランチの作成, 一覧表示, 切り替え
- ブランチのマージと削除
- リベース
- .gitignoreの書き方
- .gitignoreの設定が反映されない場合
- 特定のファイルをgitの管理から外す方法
- 参照(ORIG_HEAD, HEAD, FETCH_HEAD)
- git rm [-r --cached] の取り消し
- 一部のディレクトリ/ファイルのみをリポジトリから復元する方法
- ローカルとリモートリポジトリの有無を同期
- pushの取消し方法
- マージツールの起動方法
- Gitで「MERGING」の状態
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38