メインコンテンツにスキップ
Git remove file from tracking

Git でファイルを管理対象から外す方法

タグ: 🏷 Git ,gitignore

1. はじめに

「このファイル、もう Git で追跡したくない!」

開発を進めていると、こんな場面によく遭遇します:

  • ログファイルキャッシュ が誤ってコミットされた
  • ビルド成果物 を除外し忘れた

すでに 追跡中のファイルを外したい 場合、単に .gitignore に追加するだけでは不十分です。リポジトリ履歴からは残しつつ 今後は追跡しない ようにする正しい手順を解説します。


2. 基本的な手順

2.1. ステップ 1: .gitignore に追加

まず、今後追跡したくないファイルを .gitignore に記載します。

# .gitignore
config/database.yml
logs/*.log
node_modules/

2.2. ステップ 2: インデックスから削除

git rm --cached <ファイルパス>

--cached オプションがポイント:

  • インデックス(追跡対象)からのみ削除
  • ワークツリー(実際のファイル)は残る

2.3. ステップ 3: コミット

git commit -m "Stop tracking config/database.yml"

これで完了!次回以降、そのファイルは Git の管理対象外になります。

3. ディレクトリ全体を除外する場合

ディレクトリの場合は -r オプションが必要です。

私の例だと、アプリが加工したデータをdataディレクトリ配下に出力していました。ディレクトリの場合だと以下のコマンドを実行すると。。。

git rm --cached data/

以下のエラーが出ます:

fatal: not removing 'data/' recursively without -r

解決方法-r オプションを追加

git rm --cached -r data/

これで追跡中のディレクトリごと管理対象から外れます。

4. よくある間違いと注意点

4.1. ⚠️ 注意:–cached を忘れると危険

git rm secret.txt  # ファイルが物理削除される!

--cached オプションを忘れると、ワークツリーからもファイルが削除されてしまいます。

5. 履歴からも完全に削除したい場合

注意:これは危険な操作です。チーム開発では慎重に慎重を重ねましょう。

# 履歴からも完全に削除(BFG Repo-Cleaner を使用)
# ※事前にバックアップを取ること
java -jar bfg.jar --delete-files secret.txt repo.git
cd repo.git
git reflog expire --expire=now --all
git gc --prune=now --aggressive

6. 参考リンク