この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:9
ページ更新者:T
更新日時:2026-06-11 07:07:02

タイトル: .gitignoreの設定が反映されない場合
SEOタイトル: .gitignore が効かない原因と対処(既に追跡済ファイルを untrack する手順)

この記事の要点
  • 最頻原因: そのファイルが 既に Git の追跡対象(tracked)になっている。.gitignore は未追跡ファイルにしか効かない
  • untrack の基本: git rm --cached でインデックスから外す(ワーキングツリーは残る)
  • 全ファイル untrack: git rm -r --cached .git add .git commit で .gitignore を反映し直す
  • 原因デバッグ: git check-ignore -v でどのルールが効いているか確認
  • 個人用無視: ~/.gitignore_global + core.excludesfile一時無視: git update-index --assume-unchanged

なぜ .gitignore が効かないのか

.gitignore に書いたのに、変更が git status に表示される」「コミット対象から外れない」という症状の 99% は同じ原因です:

.gitignore は「まだ Git に追跡されていない(untracked)ファイル」にしか効きません。 一度コミットしたファイルや git add 済のファイルは、.gitignore に追記しても無視されません。

Git の追跡状態は次の 3 つに分類されます:

状態説明.gitignore の効果
untrackedGit が知らないファイル効く(無視される)
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 付き .gitignoreUTF-8 BOM があるとパース失敗BOM なしで保存

対処4: グローバル .gitignore

.DS_Store / Thumbs.db / .idea/ など 個人環境特有のファイルは、プロジェクトの .gitignore ではなくホームの ~/.gitignore_global に書くのが行儀の良い運用:

# ~/.gitignore_global を作成
cat > ~/.gitignore_global <

対処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