gitに対する知識が不足していたため、次のコマンドで最新のコミットが削除されると思っておりました。
git reset --hard HEAD~
しかし、これはコミットが削除されているわけではなく、ブランチ(とHEAD)を最新より一つ前のコミットに戻しているだけだと知りました。
実際に下記のようにして試してみると、git reset --hard HEAD~
をしたあとに、git cherry-pick
に成功しており、コミット自体は削除されていないことが確認できました。
$ git init $ touch README.md $ git add README.md $ git commit -m "init commit" $ mkfile 500m bigSizeFile $ git add bigSizeFile $ git commit -m "add bigSizeFile" $ git log --oneline 0adff49 (HEAD -> master) add bigSizeFile b0993e8 init commit $ git reset --hard HEAD~ $ git log --oneline b0993e8 (HEAD -> master) init commit $ git cherry-pick 0adff49 $ git log --oneline b28d8cf (HEAD -> master) add bigSizeFile b0993e8 init commit
コミットを削除する方法で調べると、git reset
する方法は見つかるのですが、コミット自体を削除する方法は見つかりませんでした。
ローカルリポジトリのコミットを削除する方法はありますでしょうか?
実用上それで問題ないと思いますが、どうしても消したいなら git gc では。
https://git-scm.com/book/ja/v2/Git%E3%81%AE%E5%86%85%E5%81%B4-%E3%83%A1%E3%83%B3%E3%83%86%E3%83%8A%E3%83%B3%E3%82%B9%E3%81%A8%E3%83%87%E3%83%BC%E3%82%BF%E3%83%AA%E3%82%AB%E3%83%90%E3%83%AA
間違って大きなサイズのファイル等をコミットしてしまって場合に、git resetで取り消したとしてもリポジトリのサイズが大きいままになってしまうため、コミット自体を削除する何かしらの手法がないかと思って質問させていただきました。
ありがとうございます、単純にgit reset --hard HEAD~後のgit gcだと削除されなかったので、ページの手順をよく読みながら試してみます。
reflog に残ってると gc 対象にならないようなので、まず reflog から消して gc する必要があるようです。
https://stackoverflow.com/a/4528593
教えて頂いたページの、
git reflog expire --expire-unreachable=now --all
git gc --prune=now
によりコミット自体を削除することに成功いたしました。
ありがとうございました。
reflogに残っているとgc対象にならないのですね。
ベストアンサーに選びたいのですが、回答の方に記載していただいでも良いでしょうか?
また、手間であればこちらで自己解決方法を追加しますがどうでしょうか。
回答2件
あなたの回答
tips
プレビュー