1)首先确保所有分支都没有引用该提交,包括 HEAD 也不指向这个提交。
2)git reflog expire --expire=now --all
3)git gc --prune=now

命令解析

git reflog

git reflog [show] [log-options] [<ref>]
git reflog expire [--expire=<time>] [--expire-unreachable=<time>]
        [--rewrite] [--updateref] [--stale-fix]
        [--dry-run] [--verbose] [--all | <refs>…]
git reflog delete [--rewrite] [--updateref]
        [--dry-run] [--verbose] ref@{specifier}…
git reflog exists <ref>
  • git expire子命令用于修剪旧的 reflog 条目。从比较日志中删除 expireexpire-unreachable 时间早的条目或比时间早且不能从当前提示可达的条目。
  • --expire=<time>:剪除比指定时间更早的条目。如果未指定此选项,则从配置设置中获取到期时间,而配置设置 gc.reflogExpire 又默认为 90 天。--expire=all 不论年龄大小,都能修剪; --expire=never 关闭修剪可及条目。
  • --all:处理所有引用的 reflog。

git gc

  • --aggressive:通常 git gc运行速度很快,同时提供良好的磁盘空间利用率和性能 此选项将导致 git gc 更积极地优化存储库,但花费更多时间。这种优化的效果是持久的,所以这个选项只需要偶尔使用; 每隔几百个变更集左右。
  • --auto:使用此选项,git gc检查是否需要进行任何清洁工作; 如果没有,它会退出而不执行任何工作。一些 git 命令git gc --auto 在执行可能会产生许多松散对象的操作之后运行。
  • --prune=<date>:修剪比日期更旧的松散对象(默认为 2 周前,可由配置变量覆盖 gc.pruneExpire)。--prune=不管年龄大小,都修剪松散的物体,并且如果另一个进程同时写入存储库,则会增加腐败风险;

更多

腾讯云社区——git reflog

腾讯云社区——git gc