Git include per ogni commit una copia completa di tutti i file, ad eccezione del fatto che, per il contenuto già presente nel repository Git, lo snapshot punterà semplicemente a detto contenuto anziché duplicarlo.
Ciò significa anche che diversi file con lo stesso contenuto vengono archiviati una sola volta.
Quindi uno snapshot è sostanzialmente un commit, in riferimento al contenuto di una struttura di directory.
Alcuni buoni riferimenti sono:
Dici a Git che vuoi salvare un'istantanea del tuo progetto con il comando git commit e in pratica registra un manifest di come appariranno tutti i file nel tuo progetto a quel punto
Lab 12 illustra come ottenere istantanee precedenti
Il libro progit ha la descrizione più completa di un'istantanea:
La principale differenza tra Git e qualsiasi altro VCS (inclusi Subversion e amici) è il modo in cui Git pensa ai suoi dati.
Concettualmente, la maggior parte degli altri sistemi memorizza le informazioni come un elenco di modifiche basate su file. Questi sistemi (CVS, Subversion, Perforce, Bazaar e così via) pensano alle informazioni che conservano come un insieme di file e alle modifiche apportate a ciascun file nel tempo
Git non pensa né memorizza i suoi dati in questo modo. Invece, Git pensa ai suoi dati più come a una serie di istantanee di un mini filesystem.
Ogni volta che commetti o salvi lo stato del tuo progetto in Git, fondamentalmente scatta una foto di come appaiono tutti i tuoi file in quel momento e memorizza un riferimento a quella istantanea.
Per essere efficiente, se i file non sono stati modificati, Git non memorizza nuovamente il file, ma solo un collegamento al file identico precedente che ha già archiviato.
Git pensa ai suoi dati più come di seguito:
Questa è una distinzione importante tra Git e quasi tutti gli altri VCS. Rende Git riconsiderare quasi ogni aspetto del controllo di versione che la maggior parte degli altri sistemi ha copiato dalla generazione precedente. Questo rende Git più simile a un mini filesystem con alcuni strumenti incredibilmente potenti basati su di esso, piuttosto che semplicemente un VCS.
Jan Hudec aggiunge questo importante commento :
Sebbene sia vero e importante a livello concettuale, NON è vero a livello di archiviazione.
Git usa delta per l'archiviazione .
Non solo, ma è più efficiente di qualsiasi altro sistema. Poiché non mantiene la cronologia per file, quando desidera eseguire la compressione delta, prende ogni BLOB, seleziona alcuni BLOB che probabilmente saranno simili (usando l'euristica che include l'approssimazione più vicina della versione precedente e alcuni altri), cerca di generare i delta e seleziona quello più piccolo. In questo modo può (spesso dipende dall'euristica) sfruttare altri file simili o versioni precedenti che sono più simili alla precedente. Il parametro "finestra pacchetto" consente le prestazioni di trading per la qualità di compressione delta. Il valore predefinito (10) generalmente fornisce risultati decenti, ma quando lo spazio è limitato o per accelerare i trasferimenti di rete, git gc --aggressive
utilizza il valore 250, che lo rende molto lento, ma fornisce una compressione extra per i dati della cronologia.