Git rmとは?ファイルの削除と追跡解除の方法を初心者向けにわかりやすく解説

Git rmの基本的な使い方から実践的な活用方法まで初心者向けに解説します。ファイルの削除、--cachedオプションによる追跡解除、誤って追加したファイルの取り消し方法を学び、リポジトリを適切に管理しましょう。

Git rmとは

Git rmは、Gitリポジトリからファイルを削除するためのコマンドです。単にファイルを消すだけでなく、Gitの追跡対象からファイルを外す(追跡解除)こともできます。

通常のrmコマンドでファイルを削除した場合、ファイルは消えますがGitの追跡情報は残ったままです。git rmを使うことで、ファイルの削除とステージングを同時に行えます。

git rmとrmコマンドの違い

ファイルを削除する方法として、OSのrmコマンドとgit rmがあります。それぞれの動作の違いを理解しておきましょう。

コマンドファイル削除ステージング追跡解除
rm file.txtされるされないされない
git rm file.txtされるされるされる
git rm --cached file.txtされないされるされる

基本的な使い方

ファイルを削除する

# ファイルを削除してステージング
git rm file.txt

# 削除をコミット
git commit -m "file.txtを削除"

このコマンドは以下の2つの操作を一度に行います。

操作内容
ファイル削除作業ディレクトリからファイルを削除
ステージング削除をステージングエリアに追加

複数ファイルを削除する

# 複数ファイルを指定
git rm file1.txt file2.txt file3.txt

# ワイルドカードを使用
git rm *.log

# ディレクトリごと削除(-rオプション)
git rm -r old-directory/

ディレクトリを削除する場合は-r(recursive)オプションが必要です。

--cachedオプション:追跡解除

ファイルを残したまま追跡を解除する

--cachedオプションを使うと、ファイル自体は作業ディレクトリに残したまま、Gitの追跡対象から外せます。

# ファイルを残して追跡だけ解除
git rm --cached secret.txt

# 削除をコミット
git commit -m "secret.txtをGit管理から除外"

この操作の後、ファイルはUntracked files(未追跡)として表示されるようになります。

誤ってコミットしたファイルを除外する

.gitignoreに追加し忘れてコミットしてしまったファイルを除外する場合:

# 1. .gitignoreにパターンを追加
echo "*.env" >> .gitignore

# 2. ファイルの追跡を解除(ファイルは残す)
git rm --cached .env

# 3. 変更をコミット
git add .gitignore
git commit -m ".envをGit管理から除外"

これにより、ファイルはローカルに残りますが、リモートリポジトリからは削除されます。

ディレクトリの追跡を解除

# node_modulesを追跡解除(よくあるケース)
git rm -r --cached node_modules/

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

# コミット
git add .gitignore
git commit -m "node_modulesをGit管理から除外"

よく使うオプション

オプション説明
--cachedファイルを残して追跡のみ解除
-rディレクトリを再帰的に削除
-f変更があっても強制的に削除
-n / --dry-run実際には削除せず、何が削除されるか表示
--オプションとファイル名の区切り

--dry-runで事前確認

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

# 削除対象を確認(実際には削除しない)
git rm -n *.log

# 出力例
# rm 'debug.log'
# rm 'error.log'
# rm 'access.log'

-fオプションで強制削除

変更がステージングされていないファイルを削除しようとすると、警告が表示されます。

git rm modified-file.txt
# error: the following file has local modifications:
#     modified-file.txt

変更を破棄してでも削除したい場合は-fオプションを使います。

# 強制的に削除(変更は失われる)
git rm -f modified-file.txt

注意-fオプションは変更を完全に破棄するため、慎重に使ってください。

実践的な活用シーン

機密ファイルを履歴から完全に削除

過去のコミットに含まれる機密ファイルを完全に削除するには、git rmだけでは不十分です。履歴からも削除する必要があります。

# 現在の追跡を解除
git rm --cached secrets.json

# 履歴からも削除(git filter-branchを使用)
git filter-branch --force --index-filter \
  'git rm --cached --ignore-unmatch secrets.json' \
  --prune-empty --tag-name-filter cat -- --all

注意:履歴の書き換えは危険な操作です。チームで作業している場合は、全員に影響が及びます。

特定のパターンのファイルを一括削除

# .bakファイルをすべて削除
git rm '*.bak'

# 特定ディレクトリ内の.logファイルを削除
git rm 'logs/*.log'

# サブディレクトリも含めて.tmpファイルを削除
git rm '**/*.tmp'

シェルのグロブ展開を避けるため、パターンをクォートで囲むことをおすすめします。

rmで削除したファイルをステージング

OSのrmコマンドで削除したファイルがある場合:

# rmで削除済み
rm old-file.txt

# git statusで確認
git status
# deleted:    old-file.txt

# 削除をステージング
git add old-file.txt
# または
git add -u  # 変更・削除されたファイルをすべてステージング

初心者が混乱しやすいポイント

git rmとgit restoreの違い

git rmは「削除」、git restoreは「復元」という逆の操作です。

コマンド用途
git rm file.txtファイルを削除
git restore file.txt変更を取り消して復元
git restore --staged file.txtステージングを取り消す
# 間違ってgit rmした場合の復元
git restore --staged file.txt  # ステージングを取り消し
git restore file.txt           # ファイルを復元

--cachedを付け忘れるとファイルが消える

--cachedを付け忘れると、ファイル自体も削除されてしまいます。

# 追跡解除のつもりが...
git rm important.txt
# ファイルも消えてしまう!

# 復元する場合
git restore --staged important.txt
git restore important.txt

追跡だけ解除したい場合は、必ず--cachedを付けてください。

.gitignoreに追加しても追跡は解除されない

.gitignoreは「これから追跡を始めない」ファイルを指定するものです。すでに追跡中のファイルには効果がありません。

# すでに追跡中のファイルを.gitignoreに追加
echo "config.local" >> .gitignore

# これだけでは追跡は解除されない
git status
# config.localは依然として追跡中

# 追跡を解除する必要がある
git rm --cached config.local

正しい手順は以下の通りです。

ステップコマンド
1.gitignoreにパターンを追加
2git rm --cachedで追跡を解除
3変更をコミット

削除したファイルは履歴に残る

git rmでファイルを削除しても、過去のコミットからは取得できます。

# 過去のコミットからファイルを確認
git show HEAD~3:path/to/deleted-file.txt

# 過去のバージョンを復元
git checkout HEAD~3 -- path/to/deleted-file.txt

機密情報を含むファイルを削除する場合は、履歴からも削除する必要があることを覚えておいてください。

トラブルシューティング

"pathspec did not match any files"エラー

fatal: pathspec 'file.txt' did not match any files
原因対処
ファイルが存在しないパスを確認
ファイルが追跡されていないgit addで追跡を開始
パスの指定が間違っている相対パス/絶対パスを確認

"has local modifications"エラー

error: the following file has local modifications:
    file.txt

変更があるファイルを削除しようとしています。

対処コマンド
変更を保存してから削除git stashgit rm
変更を破棄して強制削除git rm -f file.txt
削除をキャンセル何もしない

"has staged content different from..."エラー

error: the following file has staged content different from both the file and the HEAD:
    file.txt

ステージングされた変更と作業ディレクトリの変更が異なります。

# ステージングをリセットしてから削除
git restore --staged file.txt
git rm file.txt

よく使うコマンド一覧

操作コマンド
ファイルを削除git rm file.txt
ディレクトリを削除git rm -r directory/
追跡のみ解除(ファイルは残す)git rm --cached file.txt
強制削除git rm -f file.txt
削除対象を確認git rm -n file.txt
削除されたファイルをステージングgit add -u

まとめ

Git rmは、Gitリポジトリからファイルを削除するコマンドです。

操作コマンド
ファイル削除 + 追跡解除git rm file.txt
追跡解除のみ(ファイルは残す)git rm --cached file.txt
ディレクトリ削除git rm -r directory/
削除前の確認git rm -n file.txt
  • git rmはファイル削除とステージングを同時に行う
  • --cachedオプションでファイルを残したまま追跡を解除できる
  • .gitignoreに追加しても、すでに追跡中のファイルは解除されない
  • 削除したファイルは履歴に残るため、機密情報は別途対応が必要

誤ってコミットしたファイルの追跡解除は、git rm --cachedと.gitignoreの組み合わせで対応できます。ただし、すでにリモートにプッシュした場合は、他の開発者にも影響があることを忘れないでください。

編集部

編集部