Este capítulo profundiza en lo introducido en El modelo de objetos, mirando directamente los archivos dentro de .git.
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....
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.txtCalcula 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.
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.