Git inclut pour chaque commit une copie complète de tous les fichiers, sauf que, pour le contenu déjà présent dans le repo Git, le snapshot pointera simplement vers ce contenu plutôt que de le dupliquer.
Cela signifie également que plusieurs fichiers ayant le même contenu ne sont stockés qu'une seule fois.
Donc un instantané est fondamentalement un commit, se référant au contenu d'une structure de répertoire.
Voici quelques bonnes références :
Vous dites à Git que vous voulez sauvegarder un instantané de votre projet avec la commande git commit et il enregistre un manifeste de ce à quoi ressemblent tous les fichiers de votre projet à ce moment-là.
Laboratoire 12 illustre comment obtenir des instantanés précédents
El livre progit a la description plus complète d'un instantané :
La différence majeure entre Git et tout autre VCS (Subversion et ses amis inclus) est la façon dont Git pense à ses données.
D'un point de vue conceptuel, la plupart des autres systèmes stockent les informations sous la forme d'une liste de changements dans les fichiers. Ces systèmes (CVS, Subversion, Perforce, Bazaar, etc.) considèrent les informations qu'ils conservent comme un ensemble de fichiers et les modifications apportées à chaque fichier au fil du temps.
Git ne pense pas ou ne stocke pas ses données de cette façon. Au lieu de cela, Git pense à ses données plus comme un ensemble d'instantanés d'un mini système de fichiers.
Chaque fois que vous livrez ou enregistrez l'état de votre projet dans Git, celui-ci prend une photo de l'aspect de tous vos fichiers à ce moment-là et stocke une référence à cet instantané.
Pour être efficace, si les fichiers n'ont pas changé, Git ne stocke pas le fichier à nouveau - seulement un lien vers le fichier identique précédent qu'il a déjà stocké.
Git pense à ses données de la manière suivante :
C'est une distinction importante entre Git et presque tous les autres VCSs. Elle amène Git à reconsidérer presque tous les aspects du contrôle de version que la plupart des autres systèmes ont copié de la génération précédente. Cela fait de Git un mini-système de fichiers sur lequel sont construits des outils incroyablement puissants, plutôt qu'un simple VCS.
Voir aussi :
Jan Hudec ajoute ceci commentaire important :
Si cela est vrai et important au niveau conceptuel, ce n'est PAS vrai au niveau du stockage.
Git utilise les deltas pour le stockage .
Non seulement cela, mais il est plus efficace dans ce domaine que tout autre système. Parce qu'il ne conserve pas d'historique par fichier, quand il veut faire une compression delta il prend chaque goutte, sélectionne quelques gouttes qui sont susceptibles d'être similaires (en utilisant une heuristique qui inclut la plus proche approximation de la version précédente et quelques autres), essaie de générer les deltas et choisit le plus petit. De cette façon, il peut (souvent, cela dépend de l'heuristique) profiter d'autres fichiers similaires ou d'anciennes versions qui sont plus similaires que la précédente. Le paramètre "pack window" permet d'échanger les performances contre la qualité de la compression des deltas. La valeur par défaut (10) donne généralement des résultats décents, mais lorsque l'espace est limité ou pour accélérer les transferts réseau, git gc --aggressive
utilise la valeur 250, ce qui rend son exécution très lente, mais fournit une compression supplémentaire pour les données de l'historique.
31 votes
Voici un post brillant qui explique en détail le fonctionnement de git. Ce que vous cherchez est probablement le § sur la base de données des objets.
0 votes
Excellent article qui contient des liens vers d'autres excellentes ressources. Je me suis amusé avec ces derniers pendant quelques heures.
3 votes
J'ai trouvé cet article très intéressant qui décrit git de l'intérieur : maryrosecook.com/blog/post/git-from-the-inside-out