El Sistema de Archivos Content-Addressable (.git/objects): Blobs, Trees, Commits y Árboles de Merkle (55 min)
El Sistema de Archivos Content-Addressable (.git/objects): Blobs, Trees, Commits y Árboles de Merkle
1. Git No Almacena "Diffs" por Commit: Almacena Instantáneas Completas en un DAG de Merkle
Contrario a sistemas antiguos como SVN o CVS que guardaban listas de diferencias línea por línea, Git es un almacén clave-valor direccionable por contenido donde cada objeto se comprime con zlib y se identifica por el hash criptográfico de su encabezado más su contenido binario:
$\text{OID} = \text{SHA-1 / SHA-256}\left( \text{type} \;\|\; \text{" "} \;\|\; \text{size\_bytes} \;\|\; \text{"\0"} \;\|\; \text{payload} \right)$
flowchart TD
COMMIT["Commit Object (tree + parent + author + GPG signature)"] --> TREE_ROOT["Root Tree Object (Directorio Raíz)"]
TREE_ROOT --> BLOB1["Blob e83c5163 (Contenido puro de package.json — Sin nombre de archivo)"]
TREE_ROOT --> SUBTREE["Tree 4b825dc6 (Directorio src/)"]
SUBTREE --> BLOB2["Blob 9a1f22b0 (Contenido puro de index.ts)"]
Consecuencia Arquitectónica: Si un archivo de $10\text{ MB}$ no cambia entre el commit $C_1$ y el commit $C_{1000}$, los $1,000$ objetostreeapuntan exactamente al mismo punteroblobúnico ($0\text{ bytes}$ de duplicación). Si renombras un archivo sin tocar su texto, sublobpermanece $100\%$ idéntico; solo cambia la entrada de nombre en el objetotreepadre.
2. Compresión Delta en Packfiles (.pack y .idx)
Cuando ejecutas git gc o git push, Git empaqueta miles de objetos sueltos en un único archivo Packfile (.pack) aplicando compresión delta heurística (Delta Chains) donde las versiones antiguas se almacenan como deltas respecto a la versión más reciente (HEAD tiene acceso directo sin reconstrucción de deltas).'