Guardar cada objeto como un archivo individual comprimido es simple,
pero ineficiente para repositorios con muchísimos objetos: muchos
archivos pequeños desperdician espacio y son lentos de transferir
por red. Periódicamente —o al ejecutar git gc manualmente—
Git empaqueta los objetos sueltos en un packfile: un único
archivo que contiene muchos objetos comprimidos juntos, aprovechando
además que objetos similares (como dos versiones consecutivas del
mismo archivo) suelen compartir mucho contenido, lo que permite
guardar solo las diferencias entre ellos internamente.
git gc
Además de empaquetar objetos sueltos, elimina objetos que ya no son
alcanzables desde ninguna referencia: por ejemplo, el commit
original que quedó huérfano tras un commit --amend
(see Deshacer cambios), una vez que pasó suficiente tiempo desde
que dejó de estar referenciado. Por eso, inmediatamente después de
un amend o un reset --hard, el commit "perdido"
normalmente sigue existiendo en la base de datos y puede
recuperarse (see Refs y reflog); solo desaparece definitivamente
tras la recolección de basura.
git fsck
Recorre toda la base de datos de objetos verificando su consistencia interna, y reporta objetos dañados o inalcanzables. Es la herramienta de diagnóstico de última instancia cuando algo en el repositorio parece corrupto.