git gc does several jobs:
- Pack loose objects — consolidate
.git/objects/xx/ files into a single packfile.
- Prune unreachable objects — anything not reachable from any ref or reflog, older than 2 weeks by default, deleted.
- Expire reflog entries — entries older than 90 days (reachable) or 30 days (unreachable) removed.
- Repack — rewrite existing packs combining adjacent ones.
- Update auxiliary files — commit-graph, multi-pack-index.
Flags:
git gc --aggressive # heavier delta compression (slow, occasional)
git gc --prune=now # don't keep 2-week grace, prune immediately
git gc --auto # run only if thresholds exceeded
git maintenance (newer) runs gc + prefetch + commit-graph updates as scheduled background tasks.
Don't run gc --prune=now if you might want to recover something you just deleted — it bypasses the safety window.