15 El almacén de objetos en detalle

Este capítulo profundiza en lo introducido en El modelo de objetos, mirando directamente los archivos dentro de .git.

15.1 Objetos sueltos

Cada objeto nuevo se guarda inicialmente como un archivo individual dentro de .git/objects, comprimido con zlib. La ruta se construye a partir de su hash: los dos primeros caracteres forman el nombre del subdirectorio, y el resto forma el nombre del archivo. Por ejemplo, el objeto con hash a1b2c3d4... se guarda en .git/objects/a1/b2c3d4....

15.2 Inspeccionar objetos directamente

git cat-file -t <hash>

Muestra el tipo de un objeto (blob, tree, commit o tag).

git cat-file -p <hash>

Muestra el contenido de un objeto, ya descomprimido y legible.

git hash-object archivo.txt

Calcula el hash que tendría el contenido de un archivo si se convirtiera en un blob, sin necesidad de que esté siendo rastreado ni de que exista un commit.

Estos comandos rara vez se usan en el trabajo diario, pero son la forma más directa de confirmar, sin intermediarios, que Git es "solo" una base de datos de objetos de contenido con referencias encima.

15.3 Direccionamiento por contenido

Como el hash de un objeto se deriva de su contenido, dos objetos con el mismo contenido exacto son, literalmente, el mismo objeto: Git nunca guarda duplicados. Esto también implica que cualquier alteración —por mínima que sea— de un blob, tree o commit produce un hash completamente distinto, lo que hace que el historial sea resistente a manipulaciones silenciosas: no es posible modificar un commit antiguo "en su lugar" sin que su hash cambie, y sin que, en cascada, cambien también los hashes de todos los commits posteriores que dependen de él.