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にパターンを追加 |
| 2 | git 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 stash → git 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の組み合わせで対応できます。ただし、すでにリモートにプッシュした場合は、他の開発者にも影響があることを忘れないでください。
編集部