Git non elimina le informazioni da solo *. Tutte le versioni precedenti di ogni file sono sempre disponibili per ripristini, differenze, ispezioni, ecc.
Intero albero contro singoli file
Quello che potresti provare a conciliare è l'idea di accedere a una vecchia versione di un singolo file rispetto al fatto che il modello di cronologia di Git è focalizzato sull'intero albero. Il versioning dell'intero albero richiede un po 'più di lavoro per vedere (per esempio) la versione di foo.c
come esisteva dieci foo.c
cambiamenti fa contro dieci cambiamenti dell'albero intero:
# 10 foo.c-changes ago
git show $(git rev-list -n 10 --reverse HEAD -- foo.c | head -1):foo.c
# 10 whole-tree-changes ago
git show HEAD~10:foo.c
I vantaggi dell'orientamento dell'albero, principalmente la capacità di visualizzare i commit come unità di modifiche interdipendenti apportate a varie parti dell'intero albero, in generale superano di gran lunga la digitazione aggiuntiva (che può essere alleviata con alias, script, ecc.) E tempo della CPU trascorso a scavare in impegni passati.
Efficienza di archiviazione
Quando un nuovo oggetto (ad esempio un file con contenuti mai visti prima) entra nel sistema, viene archiviato con una semplice compressione (zlib) come "oggetto sciolto". Quando si accumulano abbastanza oggetti sfusi (in base gc.auto
all'opzione di configurazione; o quando l'utente esegue git gc o uno dei comandi di impacchettamento di livello inferiore), Git raccoglierà molti oggetti sfusi in un unico "file pack".
Gli oggetti in un file pack possono essere archiviati come semplici dati compressi (lo stesso di un oggetto sciolto, semplicemente impacchettato con altri oggetti) o come delta compressi rispetto ad altri oggetti. I delta possono essere concatenati a profondità configurabili ( pack.depth
) e possono essere fatti contro qualsiasi oggetto adatto ( pack.window
controlla quanto Git cerca la migliore base di delta; una versione di un file storicamente non correlato può essere usata come base se ciò comporterebbe un buona compressione delta). La latitudine che le configurazioni di profondità e dimensione della finestra offrono al motore di compressione delta spesso si traduce in una migliore compressione delta rispetto alla semplice compressione “diff” di una versione-CV-contro-la / successiva-versione precedente.
È questa compressione delta aggressiva (combinata con la normale compressione zlib) che spesso può consentire a un repository Git (con cronologia completa e un albero di lavoro non compresso) di occupare meno spazio di un singolo checkout SVN (con albero di lavoro non compresso e copia originale).
Vedi le sezioni Come Git memorizza oggetti e The Packfile del libro della community di Git . Anche la manpage git pack-objects .
* Puoi dire a Git di eliminare i commit "riscrivendo la cronologia" e con comandi come git reset , ma anche in questi casi Git "si blocca" sui commit appena scartati per un po ', nel caso in cui decidi di averne bisogno. Vedi git reflog e git prune .