Cuatro tipos de objetos
Git almacena todo como objetos direccionados por contenido bajo .git/objects. Hay cuatro tipos: blob (contenido de archivo), tree (listado de directorio de blobs y subtrees), commit (puntero de instantánea con autor, committer, mensaje y padres), y tag (tag anotado con firmante y mensaje). Cada uno se nombra por el SHA-1 (o SHA-256) de su contenido.
Inspección
git cat-file -t <sha>
git cat-file -p <sha>
git cat-file -s <sha>
git ls-tree HEAD
git rev-parse HEAD^{tree}
Sueltos vs empaquetados
Los objetos recién creados empiezan sueltos: un archivo comprimido por zlib por objeto bajo .git/objects/xx/yyyy.... La recolección de basura combina luego muchos objetos en un packfile.
Hashing
echo "hello" | git hash-object --stdin
git hash-object -w README.md
Los trees codifican permisos
Una entrada de tree es modo + nombre + sha. Los modos son 040000 (directorio), 100644 (regular), 100755 (ejecutable), 120000 (symlink), 160000 (gitlink/submódulo).
Caminar la historia
git log --raw
git log --pretty=raw
git rev-list --objects HEAD
Alcanzabilidad y poda
Un objeto es alcanzable si alguna ref lleva a él a través del grafo commit-tree-blob. Los objetos no alcanzables son podados por gc tras la ventana de expiración del reflog.
git fsck --unreachable
git gc --prune=now
Transición a SHA-256
Git moderno soporta repositorios SHA-256 (git init --object-format=sha256).
Errores comunes
Editar archivos bajo .git/objects directamente. No lo hagas. Asumir que las colisiones SHA-1 son imposibles — Git incluye detección reforzada por defecto.