誤ってプッシュしてしまった巨大ファイルを、Gitの履歴から完全に抹消するための手順です。
状況に合わせて「A」または「B」の手順を実行してください。
パターンA: 誤ってプッシュしたのが「直前の1つのコミット」だけの場合
コミットしてプッシュした直後に気づき、その後まだ何も新しいコミットをしていない場合は、この方法が一番簡単です。
1. リポジトリからファイルを削除(手元のファイルは残す)
以下のコマンドで、Gitの管理からのみファイルを外します。
git rm --cached <巨大ファイルのパス>
※ファイルそのものをPCから消して良い場合は --cached は不要です。
2. .gitignore に追加する(再発防止)
同じファイルをまたコミットしないように、.gitignore に追記します。
echo "<巨大ファイルのパス>" >> .gitignore
git add .gitignore
3. 直前のコミットを上書きする
直前のコミットの内容を、ファイルが削除された状態に上書き(Amend)します。
git commit --amend --no-edit
4. リモートへ強制プッシュ(Force Push)
履歴を書き換えたため、通常のプッシュは弾かれます。強制プッシュでリモートの履歴を上書きします。
git push -f origin <現在のブランチ名>
パターンB: 数世代前のコミットに混ざっている場合(最も確実な完全削除)
すでにいくつかのコミットを重ねてしまっている場合や、完全にリポジトリの容量を減らしたい場合は、公式が推奨しているツール git filter-repo を使用します。(古い git filter-branch は非推奨・激遅のため使用しません)。
1. 準備: ツールのインストール
Pythonがインストールされている環境で、以下のコマンドを実行してツールをインストールします。
Mac (Homebrew) の場合:
brew install git-filter-repo
Windows / Linux (pip) の場合:
pip install git-filter-repo
2. ローカルリポジトリを最新にする
念のため、現在の状態を最新にしておきます。
git pull
3. 履歴から巨大ファイルを抹消する
以下のコマンドを実行すると、リポジトリの全履歴から指定したファイルが完全に削除されます。
git filter-repo --invert-paths --path <巨大ファイルのパス>
(例: git filter-repo --invert-paths --path data/large_video.mp4)
※このコマンドを実行すると自動的にリポジトリが整理され、ローカルの .git フォルダの容量も劇的に軽くなります。
4. リモートリポジトリの紐付けを直す
git filter-repo を実行すると、安全のためリモート(origin)の設定が解除されます。再度設定し直します。
git remote add origin <リモートリポジトリのURL>
5. リモートへ強制プッシュ(Force Push)
書き換えたクリーンな履歴をリモートに強制的に反映させます。全ブランチを対象にプッシュします。
git push origin --force --all
⚠️ チーム開発時の超重要事項(必ず読んでください)
履歴の書き換え(Force Push)を行ったリポジトリは、他のチームメンバーの手元にある古いリポジトリと整合性が取れなくなります。
あなたが強制プッシュを完了した直後に、チームメンバーには以下の対応をお願いしてください。
チームメンバーにやってもらうこと:
既存のローカルリポジトリで普通に git pull すると履歴がバグります。以下のコマンドで、リモートのクリーンな履歴を強制的にローカルに同期してもらってください。
git fetch origin
git reset --hard origin/<対象ブランチ>
※または、一度ローカルフォルダを丸ごと削除して、新しく git clone し直すのが最も確実で安全です。


コメント