Git – annexe : les internes
Un commit est un snapshot, pas un diff
$ git cat-file -p 093450a^{tree}
100644 blob 6f64d556a15d5aea3a3d1141dd91fa3fc5be8374 README.md
040000 tree 70e5859e6a2701295669403bf8aa65d4e8a2e567 recettes
$ git cat-file -p a9bfd1f^{tree}
100644 blob 6f64d556a15d5aea3a3d1141dd91fa3fc5be8374 README.md
040000 tree b16b1c10d65458fd4be56ce9c835a371148f266e recettes
Entre les deux commits, seule crepes.md a changé : README.md a le même blob (6f64d55) dans les deux photos, alors que le tree recettes a changé. Chaque commit décrit l'état complet ; git ne paie que ce qui diffère, par partage des objets.
Le diff que montre git show est calculé à la demande, entre deux trees. En clair : git "ne sait pas" ce qu'un commit a changé, il le recalcule, et c'est instantané.