誤って大きなファイルを「git push」してしまった後、ファイルを「.gitignore」に追加したり、削除しても、リポジトリの履歴として残るらしく、その後のリポジトリへのコミットやプッシュ動作が異常に重たく、遅くなる。
このような場合、バージョン管理システムとしては、コミット履歴を削除したりブランチを削除したりするのが適切な対処とされるだろうが、GitHubを個人でストレージとして利用しているような場合、面倒なので以下の方法をとるのが楽。
Gitリポジトリ履歴の削除/初期化
GitHubにすでに作成してあるリポジトリの場所(URL)はそのまま、履歴を削除して整理したディレクトリを新しくプッシュするための準備をまず行う。
リモートリポジトリのURLを確認
リポジトリ内の「./.git/config」ファイルに保存されているリモートリストの状態を確認して、URLを確認する。
これには以下のコマンドを用いる
git remote -v
.gitディレクトリの削除
次にリポジトリを構成しているディレクトリを削除する
rm -rf .git
.gitファイルの作成
先ほど削除した.gitディレクトリの新しいものを作成する
git init
リポジトリへプッシュする
このあとは、このローカルリポジトリとリモートリポジトリを紐づけてプッシュを行っていく
まず、いつも通りローカルリポジトリの変更をインデックスに追加して、コミットを行う。
git add .
git commit -a -m"Initial Commit"
git remote add origin {上で保存したURL}
最後に、リモートリポジトリへ強制的にプッシュ
git push -u origin main -f
上記「git push」した際、ブランチ名がmainじゃなくなっていてプッシュできない場合は、以下の手順で変更したければbranch名を変更可能
ブランチ名がmainじゃない時の修正方法
手順1:ローカルのブランチ名変更
ブランチ名の確認
git branch
git branch -m master main
手順2:リモートのブランチ名変更
git push -u origin main
エラー:
! [rejected] main -> main (fetch first)
error: failed to push some refs to "URL"
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
このようなエラーが出た場合には、主に2つ解決策があります。
手法1:
最後に「-f」をつけることで強制的リモートの履歴を上書きしてpushする方法
git push -u origin main -f
手法2:
わけあって強硬手段を取りたくない場合、以下のようにエラー内容に従って「fetch」してから、「merge」する方法
以下のコマンドでfetchすることで、リモートレポジトリのコミット履歴をすべて取得してきます。
ただし、まだマージ(統合)はしていません。
git fetch
git merge
git push -u origin main
以上、毎回忘れるのでメモ
もちろん、バージョン管理システムとして複数人で管理しているような場合は、状況に合わせた適切な処置を行ってください。
▼参考記事
参考:
- Git のブランチ名の変更 – ローカルブランチ名を変更する方法
- Gitのリポジトリ(履歴)を初期化する
- masterからmainに変更する(githubのリモート&ローカルブランチ)branches
- git push コマンドの使い方と、主要オプションまとめ