Gitキャッシュの削除方法|git rm –cachedで管理対象から外す完全ガイド

「.gitignoreに追加したのに、ファイルがまだGitで追跡されてる…」
「間違えてパスワードファイルをコミットしちゃった!」

こんな経験、ありませんか?Gitを使っていると、誤って追加してしまったファイルを管理対象から外したい場面は意外と多いものです。

この記事では、Gitのキャッシュを削除する方法について、初心者の方にも分かりやすく解説していきます。

スポンサーリンク
  1. Gitの「キャッシュ」って何?基本を理解しよう
    1. キャッシュ = インデックス = ステージングエリア
    2. Gitの3つのエリア
    3. なぜ「キャッシュ」と呼ばれるの?
  2. git rm –cached:キャッシュからファイルを削除
    1. git rm –cachedの基本
    2. 具体例で理解しよう
  3. 全体のキャッシュを削除する方法
    1. すべてのキャッシュを一括削除
    2. 実行するとどうなる?
  4. .gitignoreとキャッシュ削除の関係
    1. .gitignoreだけでは不十分な理由
    2. 正しい手順:.gitignore + キャッシュ削除
    3. よくあるシナリオと対処法
  5. ディレクトリ全体のキャッシュ削除
    1. 特定ディレクトリを削除
    2. ワイルドカードを使った削除
  6. git rmのオプション一覧
    1. 主要なオプション
    2. オプションの組み合わせ例
  7. –cachedの有無による違い
    1. git rm –cached(推奨)
    2. git rm(危険)
    3. 比較表
  8. よくあるトラブルと解決方法
    1. トラブル1:git rm –cachedを実行したのに追跡されている
    2. トラブル2:実際のファイルまで消えてしまった
    3. トラブル3:大量の「deleted」が表示されて怖い
    4. トラブル4:.gitignoreが反映されない
    5. トラブル5:間違えて全部削除してしまった
    6. トラブル6:ブランチを切り替えたらファイルが消えた
  9. 実践的な使用例
    1. ケース1:機密情報を誤ってコミットした
    2. ケース2:ビルド成果物を除外したい
    3. ケース3:node_modulesを後から除外
    4. ケース4:複数のファイルタイプを一括除外
    5. ケース5:特定のディレクトリの中の一部を残す
  10. コマンドのエイリアス設定
    1. 便利なエイリアス
    2. .gitconfigに直接記述
  11. 安全にキャッシュ削除を行うチェックリスト
    1. 実行前のチェックリスト
    2. 実行後のチェックリスト
  12. よくある質問Q&A
    1. Q1:git rm –cachedとgit reset HEADの違いは?
    2. Q2:すでにpushしたファイルも削除できますか?
    3. Q3:ディレクトリが空になっても残りますか?
    4. Q4:複数のファイルを一度に削除できますか?
    5. Q5:他のブランチにも影響しますか?
    6. Q6:間違えて削除した場合、どうやって戻せますか?
    7. Q7:git cleanとの違いは?
  13. まとめ:Gitのキャッシュ削除をマスターしよう

Gitの「キャッシュ」って何?基本を理解しよう

まずは、Gitにおける「キャッシュ」の正体を理解しましょう。

キャッシュ = インデックス = ステージングエリア

実は、Gitの世界では以下の3つの用語が同じものを指しています:

  • キャッシュ(Cache)
  • インデックス(Index)
  • ステージングエリア(Staging Area)

これらは全て、「コミット待ちの変更を一時的に保存する場所」のことなんです。

Gitの3つのエリア

Gitでファイルを管理する際、ファイルは3つのエリアを移動します:

1. 作業ディレクトリ(Working Directory)

  • パソコン上の実際のファイル
  • 普段編集している場所

2. ステージングエリア(Index / Cache)

  • git addで追加された変更
  • 次のコミットに含める予定の変更

3. リポジトリ(Repository)

  • git commitでコミットされた変更
  • Gitの歴史に記録された変更

流れの図:

作業ディレクトリ  →[git add]→  ステージングエリア  →[git commit]→  リポジトリ
  (編集中)                      (コミット待ち)              (記録済み)

なぜ「キャッシュ」と呼ばれるの?

Gitの初期バージョンでは、このステージングエリアを「キャッシュ」と呼んでいました。

--cachedというオプション名は、その名残なんです。

現在では「ステージングエリア」や「インデックス」という呼び方の方が一般的ですが、コマンドには古い用語が残っているというわけです。

git rm –cached:キャッシュからファイルを削除

それでは、本題のキャッシュ削除方法を見ていきましょう。

git rm –cachedの基本

基本コマンド:

git rm --cached ファイル名

このコマンドは:

  • ✅ Gitの追跡から外す(インデックスから削除)
  • ✅ 実際のファイルは残る(作業ディレクトリには残る)
  • ❌ ファイル自体は削除しない

重要なポイント:
--cachedオプションを必ず付けてください。

付けないと、実際のファイルまで削除されてしまいます!

具体例で理解しよう

シナリオ:パスワードが書かれたconfig.txtを誤ってGitに追加してしまった

手順1:現在の状態を確認

$ git status
On branch main
Changes to be committed:
  new file:   config.txt

config.txtがステージングされている(コミット待ち)状態です。

手順2:キャッシュから削除

$ git rm --cached config.txt
rm 'config.txt'

手順3:状態を再確認

$ git status
On branch main
Untracked files:
  config.txt

config.txtは「追跡されていないファイル」になりました。

手順4:ファイルがまだ存在するか確認

$ ls config.txt
config.txt

ちゃんと残ってます!

手順5:変更をコミット

$ git commit -m "Remove config.txt from tracking"

これで、Gitの管理対象から外れました。

全体のキャッシュを削除する方法

プロジェクト全体のキャッシュをクリアしたい場合の方法です。

すべてのキャッシュを一括削除

コマンド:

git rm -r --cached .

オプションの意味:

  • -r:再帰的(recursive)にディレクトリ全体を対象
  • --cached:キャッシュのみ削除(ファイルは残す)
  • .:カレントディレクトリ全体

実行するとどうなる?

手順1:キャッシュを全削除

$ git rm -r --cached .
rm 'file1.txt'
rm 'file2.txt'
rm 'src/main.js'
rm 'src/utils.js'
(全ファイルが表示される)

すべてのファイルがステージングエリアから削除されます。

手順2:状態を確認

$ git status
On branch main
Changes to be committed:
  deleted:   file1.txt
  deleted:   file2.txt
  deleted:   src/main.js
  deleted:   src/utils.js
  (全ファイルが表示される)

Untracked files:
  file1.txt
  file2.txt
  src/

大量のdeletedが表示されますが、これは正常です

Gitの追跡から削除されただけで、実際のファイルは残っています。

手順3:再度ステージング

$ git add .

必要なファイルだけを再度ステージングします。

このとき、.gitignoreに書かれたファイルは自動的に除外されます。

手順4:状態を確認

$ git status
On branch main
Changes to be committed:
  modified:   .gitignore

.gitignoreの変更だけが表示されれば成功です!

手順5:コミット

$ git commit -m "Update .gitignore and remove ignored files from tracking"

.gitignoreとキャッシュ削除の関係

.gitignoreファイルとキャッシュ削除は、セットで使うことが多いです。

.gitignoreだけでは不十分な理由

重要なポイント:

❌ .gitignoreは「まだ追跡されていないファイル」にのみ有効
❌ すでにGitに追加されたファイルには効果がない

つまり:

# すでにコミット済み
$ git add config.txt
$ git commit -m "Add config"

# 後から.gitignoreに追加
$ echo "config.txt" >> .gitignore
$ git add .gitignore
$ git commit -m "Update .gitignore"

# ここで問題!
# config.txtはまだGitの追跡下にある

正しい手順:.gitignore + キャッシュ削除

ステップ1:.gitignoreに追加

$ echo "config.txt" >> .gitignore

または、エディタで.gitignoreを開いて追加:

config.txt
*.log
node_modules/
.env

ステップ2:キャッシュから削除

$ git rm --cached config.txt

複数ファイルの場合:

$ git rm -r --cached .

ステップ3:変更をステージング

$ git add .

ステップ4:コミット

$ git commit -m "Remove sensitive files from tracking"

これで完璧です!

よくあるシナリオと対処法

シナリオ1:ログファイルを除外したい

# .gitignoreに追加
$ echo "*.log" >> .gitignore

# 既存のログファイルをキャッシュから削除
$ git rm --cached *.log

# コミット
$ git add .gitignore
$ git commit -m "Ignore log files"

シナリオ2:node_modulesを除外したい

# .gitignoreに追加
$ echo "node_modules/" >> .gitignore

# キャッシュから削除
$ git rm -r --cached node_modules/

# コミット
$ git add .gitignore
$ git commit -m "Ignore node_modules"

シナリオ3:環境変数ファイルを除外したい

# .gitignoreに追加
$ echo ".env" >> .gitignore

# キャッシュから削除
$ git rm --cached .env

# コミット
$ git add .gitignore
$ git commit -m "Ignore .env file"

ディレクトリ全体のキャッシュ削除

フォルダごと管理対象から外したい場合の方法です。

特定ディレクトリを削除

コマンド:

git rm -r --cached ディレクトリ名/

具体例:

# logsディレクトリ全体を削除
$ git rm -r --cached logs/

# vendorディレクトリ全体を削除
$ git rm -r --cached vendor/

# distディレクトリ全体を削除
$ git rm -r --cached dist/

ワイルドカードを使った削除

パターンマッチング:

# すべての.logファイルを削除
$ git rm --cached *.log

# すべての.tmpファイルを削除
$ git rm --cached *.tmp

# Documentationディレクトリ以下の全.txtファイル
$ git rm --cached 'Documentation/**/*.txt'

注意点:

引用符('...')を使うと、シェルではなくGitがワイルドカードを展開します。

サブディレクトリも含めたい場合は、引用符を使いましょう。

git rmのオプション一覧

git rmコマンドには、様々なオプションがあります。

主要なオプション

–cached

git rm --cached ファイル名
  • キャッシュ(インデックス)からのみ削除
  • 作業ディレクトリのファイルは残る
  • 最もよく使うオプション

-r (–recursive)

git rm -r ディレクトリ名
  • ディレクトリを再帰的に削除
  • サブディレクトリも含めて削除

-f (–force)

git rm -f ファイル名
  • 強制削除
  • 未コミットの変更があっても削除
  • 危険なので注意!

-n (–dry-run)

git rm -n --cached *.log
  • 実際には削除せず、何が削除されるかを表示
  • テスト実行に便利

–ignore-unmatch

git rm --cached --ignore-unmatch config.txt
  • ファイルが存在しなくてもエラーにならない
  • スクリプトで使うと便利

-q (–quiet)

git rm -q --cached *.tmp
  • 削除メッセージを表示しない
  • 静かに実行

オプションの組み合わせ例

例1:ディレクトリのキャッシュを安全に削除

# まずテスト実行
$ git rm -n -r --cached logs/

# 問題なければ実行
$ git rm -r --cached logs/

例2:存在しないファイルでもエラーにならない

$ git rm --cached --ignore-unmatch secret.txt

例3:全.logファイルを静かに削除

$ git rm -q --cached '*.log'

–cachedの有無による違い

--cachedオプションを付けるかどうかで、挙動が大きく変わります。

git rm –cached(推奨)

$ git rm --cached config.txt

影響範囲:

  • ✅ インデックスから削除される
  • ✅ 作業ディレクトリのファイルは残る
  • ✅ 次のコミットで追跡が外れる

使用場面:

  • ファイルは手元に残したい
  • Gitの管理だけ外したい
  • .gitignoreに追加した後のクリーンアップ

git rm(危険)

$ git rm config.txt

影響範囲:

  • ❌ インデックスから削除される
  • ❌ 作業ディレクトリからも削除される
  • ❌ ファイルが完全になくなる

使用場面:

  • ファイル自体が不要
  • リポジトリからもローカルからも削除したい

比較表

項目git rm –cachedgit rm
インデックス削除される削除される
作業ディレクトリ残る削除される
ファイルの状態Untracked存在しない
復元不要(既にある)git checkoutで復元可能
安全性安全注意が必要

よくあるトラブルと解決方法

Gitのキャッシュ削除でよく遭遇する問題と、その解決策をまとめました。

トラブル1:git rm –cachedを実行したのに追跡されている

症状:

$ git rm --cached config.txt
$ git status
On branch main
Changes to be committed:
  deleted:   config.txt

削除されたように見えるけど、まだ追跡されている…

原因:
git rm --cachedだけでは不十分。変更をコミットする必要があります。

解決策:

# 変更をコミット
$ git commit -m "Remove config.txt from tracking"

# これで完全に追跡が外れる
$ git status
On branch main
Untracked files:
  config.txt

トラブル2:実際のファイルまで消えてしまった

症状:

$ git rm config.txt  # --cachedを付け忘れた!
$ ls config.txt
ls: config.txt: No such file or directory

原因:
--cachedオプションを忘れた

解決策:

# まだコミットしていない場合
$ git restore --staged config.txt
$ git restore config.txt

# または
$ git checkout HEAD config.txt

すでにコミットしてしまった場合:

# 直前のコミットを取り消し
$ git reset --soft HEAD~1

# ファイルを復元
$ git checkout HEAD config.txt

トラブル3:大量の「deleted」が表示されて怖い

症状:

$ git rm -r --cached .
$ git status
Changes to be committed:
  deleted:   file1.txt
  deleted:   file2.txt
  deleted:   file3.txt
  (数百個のファイル)

原因:
全てのファイルがインデックスから削除されたため

解決策:
これは正常な動作です。次のステップを実行しましょう:

# 必要なファイルを再追加
$ git add .

# .gitignoreに従って、必要なものだけが追加される
$ git status
Changes to be committed:
  modified:   .gitignore

# コミットして完了
$ git commit -m "Update .gitignore"

トラブル4:.gitignoreが反映されない

症状:

$ echo "*.log" >> .gitignore
$ git add .
$ git status
Changes to be committed:
  modified:   debug.log  # まだ追跡されている!

原因:
すでにGitに追加されているファイルは、.gitignoreだけでは除外されない

解決策:

# キャッシュをクリア
$ git rm -r --cached .

# 再度追加(.gitignoreが適用される)
$ git add .

# コミット
$ git commit -m "Apply .gitignore"

トラブル5:間違えて全部削除してしまった

症状:

$ git rm -r .  # --cachedを付け忘れた!
# すべてのファイルが消えた…

原因:
--cachedなしでgit rm -r .を実行してしまった

解決策:

まだコミットしていない場合:

# 全てを元に戻す
$ git reset --hard HEAD

すでにコミットしてしまった場合:

# コミットを取り消し
$ git reset --hard HEAD~1

トラブル6:ブランチを切り替えたらファイルが消えた

症状:

$ git rm -r --cached vendor/
$ git commit -m "Remove vendor"
$ git checkout other-branch
# vendor/が消えた!

原因:
vendor/はGitの管理下に入ったため、ブランチ切り替え時に影響を受ける

解決策:

これは正常な動作です。ファイルを残したい場合:

# 元のブランチに戻る
$ git checkout main

# または、.gitignoreに追加して管理対象から完全に外す

実践的な使用例

実際の開発でよく使うシナリオを見ていきましょう。

ケース1:機密情報を誤ってコミットした

シナリオ:
APIキーが入った.envファイルをコミットしてしまった

対処手順:

# 1. .gitignoreに追加
$ echo ".env" >> .gitignore

# 2. キャッシュから削除
$ git rm --cached .env

# 3. 変更をコミット
$ git add .gitignore
$ git commit -m "Remove .env from tracking and add to .gitignore"

# 4. リモートにプッシュ
$ git push

注意点:

この方法では、過去のコミット履歴には残ったままです。

完全に履歴から削除したい場合は、git filter-branchBFG Repo-Cleanerなどの高度な方法が必要です。

ケース2:ビルド成果物を除外したい

シナリオ:
dist/ディレクトリ(ビルド成果物)をGitに入れてしまった

対処手順:

# 1. .gitignoreに追加
$ echo "dist/" >> .gitignore
$ echo "build/" >> .gitignore

# 2. キャッシュから削除
$ git rm -r --cached dist/
$ git rm -r --cached build/

# 3. コミット
$ git add .gitignore
$ git commit -m "Ignore build artifacts"

ケース3:node_modulesを後から除外

シナリオ:
最初にnode_modules/を入れてしまい、リポジトリが巨大化

対処手順:

# 1. .gitignoreに追加
$ echo "node_modules/" >> .gitignore

# 2. キャッシュから削除
$ git rm -r --cached node_modules/

# 3. コミット
$ git add .gitignore
$ git commit -m "Remove node_modules from tracking"

# 4. リポジトリサイズを確認
$ git count-objects -vH

ケース4:複数のファイルタイプを一括除外

シナリオ:
ログファイル、一時ファイル、キャッシュファイルを全て除外したい

対処手順:

# 1. .gitignoreに追加
$ cat >> .gitignore << 'EOF'
# ログファイル
*.log
logs/

# 一時ファイル
*.tmp
*.temp
*.swp

# キャッシュ
cache/
.cache/
__pycache__/
EOF

# 2. 全キャッシュをクリア
$ git rm -r --cached .

# 3. 再追加(.gitignoreが適用される)
$ git add .

# 4. コミット
$ git commit -m "Update .gitignore and remove ignored files"

ケース5:特定のディレクトリの中の一部を残す

シナリオ:
config/ディレクトリは無視したいが、config/example.jsonだけは残したい

対処手順:

# 1. .gitignoreに追加
$ cat >> .gitignore << 'EOF'
# configディレクトリ全体を無視
config/*

# でもexample.jsonは除外(管理する)
!config/example.json
EOF

# 2. キャッシュをクリア
$ git rm -r --cached config/

# 3. example.jsonだけ再追加
$ git add config/example.json

# 4. コミット
$ git commit -m "Ignore config files except example.json"

コマンドのエイリアス設定

よく使うコマンドをエイリアスに登録しておくと便利です。

便利なエイリアス

キャッシュ全削除のエイリアス:

$ git config --global alias.uncache 'rm -r --cached .'

使い方:

$ git uncache

特定ファイルのキャッシュ削除:

$ git config --global alias.untrack 'rm --cached'

使い方:

$ git untrack config.txt

ドライラン(テスト実行):

$ git config --global alias.uncache-test 'rm -n -r --cached .'

使い方:

$ git uncache-test

.gitconfigに直接記述

~/.gitconfigファイルに以下を追加:

[alias]
    # キャッシュ全削除
    uncache = rm -r --cached .

    # 特定ファイルのキャッシュ削除
    untrack = rm --cached

    # テスト実行
    uncache-test = rm -n -r --cached .

    # ディレクトリのキャッシュ削除
    uncache-dir = rm -r --cached

安全にキャッシュ削除を行うチェックリスト

キャッシュ削除を安全に行うための確認事項です。

実行前のチェックリスト

☑️ ステップ1:現在の状態を確認

$ git status

何がステージングされているか把握しておきましょう。

☑️ ステップ2:バックアップを作成(重要なファイルの場合)

$ cp config.txt config.txt.backup

☑️ ステップ3:–cachedオプションを確認

# OK
$ git rm --cached config.txt

# NG(ファイルが削除される)
$ git rm config.txt

☑️ ステップ4:必要に応じてテスト実行

$ git rm -n --cached config.txt

何が削除されるか事前に確認できます。

☑️ ステップ5:.gitignoreを準備

$ echo "config.txt" >> .gitignore

今後、再び追跡されないようにします。

実行後のチェックリスト

☑️ ステップ1:ファイルが残っているか確認

$ ls config.txt
config.txt  # 存在すればOK

☑️ ステップ2:Gitの状態を確認

$ git status
On branch main
Changes to be committed:
  deleted:   config.txt

Untracked files:
  config.txt

deletedUntrackedの両方に表示されていればOK。

☑️ ステップ3:コミット

$ git commit -m "Remove config.txt from tracking"

☑️ ステップ4:リモートへプッシュ

$ git push

☑️ ステップ5:他の開発者に通知

チームで開発している場合、他のメンバーに以下を伝えましょう:

  • どのファイルが管理対象から外れたか
  • .gitignoreの変更内容
  • 必要に応じて、各自でファイルを用意する方法

よくある質問Q&A

Gitのキャッシュ削除について、よくある質問をまとめました。

Q1:git rm –cachedとgit reset HEADの違いは?

A:用途が異なります。

git rm –cached

  • ファイルをGitの追跡から完全に外す
  • 次のコミットで追跡が解除される
  • .gitignoreと組み合わせて使う

git reset HEAD

  • ステージングを解除するだけ
  • Gitの追跡自体は続く
  • 間違えてgit addした時に使う

使い分け:

# 間違えてaddした → reset
$ git add secret.txt
$ git reset HEAD secret.txt

# 今後追跡したくない → rm --cached
$ git rm --cached secret.txt
$ echo "secret.txt" >> .gitignore

Q2:すでにpushしたファイルも削除できますか?

A:はい、できます。ただし注意が必要です。

手順:

# ローカルでキャッシュ削除
$ git rm --cached sensitive.txt

# .gitignoreに追加
$ echo "sensitive.txt" >> .gitignore

# コミット
$ git commit -m "Remove sensitive.txt from tracking"

# プッシュ
$ git push

注意点:

  • 過去のコミット履歴には残る
  • 他の開発者がpullすると、彼らのローカルからもファイルが削除される
  • 機密情報の場合、履歴からも削除する必要がある(高度な方法が必要)

Q3:ディレクトリが空になっても残りますか?

A:いいえ、空のディレクトリは残りません。

Gitは空のディレクトリを管理できないため、中身が全て削除されると、ディレクトリも消えます。

空ディレクトリを残したい場合:

# .gitkeepファイルを作成
$ touch logs/.gitkeep

# これをGitに追加
$ git add logs/.gitkeep
$ git commit -m "Keep logs directory"

Q4:複数のファイルを一度に削除できますか?

A:はい、できます。

ワイルドカードを使う:

# すべての.logファイル
$ git rm --cached *.log

# すべての.tmpファイル
$ git rm --cached *.tmp

ディレクトリごと:

# logsディレクトリ全体
$ git rm -r --cached logs/

全部まとめて:

# すべてのファイル
$ git rm -r --cached .

Q5:他のブランチにも影響しますか?

A:コミットするまでは影響しません。

影響範囲:

  • コミット前:現在のブランチのみ
  • コミット後:そのブランチのみ
  • プッシュ後:リモートのそのブランチにも反映

他のブランチには、マージしない限り影響しません。

Q6:間違えて削除した場合、どうやって戻せますか?

A:まだコミットしていなければ簡単に戻せます。

コミット前の場合:

# ステージングを解除して復元
$ git restore --staged config.txt
$ git restore config.txt

コミット後の場合:

# 直前のコミットを取り消し
$ git reset --soft HEAD~1

# ファイルを復元
$ git restore --staged config.txt

プッシュ後の場合:

# 新しいコミットで戻す
$ git add config.txt
$ git commit -m "Re-add config.txt"
$ git push

Q7:git cleanとの違いは?

A:対象とする範囲が違います。

git rm –cached

  • Gitが追跡しているファイルを対象
  • キャッシュ(インデックス)から削除
  • ファイル自体は残る

git clean

  • Gitが追跡していないファイルを対象
  • 作業ディレクトリから削除
  • ファイル自体を消す

使い分け:

# Gitの追跡から外す
$ git rm --cached temp.txt

# 追跡されていないファイルを削除
$ git clean -f

まとめ:Gitのキャッシュ削除をマスターしよう

長い記事を読んでいただき、ありがとうございました!

この記事の重要ポイントをまとめます:

基本コマンド

# 単一ファイル
git rm --cached ファイル名

# ディレクトリ全体
git rm -r --cached ディレクトリ名/

# すべてのキャッシュ
git rm -r --cached .

必ず覚えておくこと
--cachedオプションを必ず付ける(付けないとファイルが消える)
✅ .gitignoreとセットで使う
✅ コミットしないと完了しない
✅ 実際のファイルは残る

典型的な使用手順

  1. .gitignoreに追加
  2. キャッシュから削除(git rm –cached)
  3. 変更をステージング(git add)
  4. コミット(git commit)
  5. プッシュ(git push)

よくある使用シーン
✅ .gitignoreが反映されない時
✅ 機密情報を誤ってコミットした時
✅ ビルド成果物を除外したい時
✅ ログファイルを管理対象から外したい時

注意事項
⚠️ 過去の履歴には残る
⚠️ 他の開発者にも影響する
⚠️ テスト実行(-n)で事前確認するのが安全
⚠️ バックアップを取ってから実行

Gitのキャッシュ削除は、最初は戸惑うかもしれませんが、仕組みを理解すれば怖くありません。

この記事を参考に、安全にファイル管理ができるようになってくださいね!

コメント

タイトルとURLをコピーしました