Git wirft keine Informationen von sich aus weg *. Alle vorherigen Versionen jeder Datei sind immer für Zurücksetzungen, Unterschiede, Überprüfungen usw. verfügbar.
Gesamtbaum versus Einzeldateien
Was Sie möglicherweise versuchen, in Einklang zu bringen, ist die Idee, auf eine alte Version einer einzelnen Datei zuzugreifen, und nicht die Tatsache, dass sich das Verlaufsmodell von Git auf den gesamten Baum konzentriert. Die Vollbaumversionierung erfordert ein wenig mehr Arbeit, um (zum Beispiel) die existierende Version von foo.c
vor zehn foo.c
Änderungen im Vergleich zu vor zehn Vollbaumänderungen zu sehen:
# 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
Die Vorteile der Baumorientierung, vor allem die Fähigkeit, Commits als eine Einheit von voneinander abhängigen Änderungen anzuzeigen, die an verschiedenen Teilen des gesamten Baums vorgenommen wurden, überwiegen im Allgemeinen bei weitem die zusätzliche Typisierung (die durch Aliase, Skripte usw. verringert werden kann) und die CPU-Zeit verbrachte durch vergangene Commits zu graben.
Speichereffizienz
Wenn ein neues Objekt (z. B. eine Datei mit zuvor nicht sichtbarem Inhalt) in das System eingeht, wird es mit einfacher (zlib) Komprimierung als „loses Objekt“ gespeichert. Wenn sich genügend lose Objekte ansammeln (basierend auf der gc.auto
Konfigurationsoption; oder wenn der Benutzer git gc oder einen der Packbefehle einer niedrigeren Ebene ausführt ), sammelt Git viele lose Objekte in einer einzigen "Packdatei".
Objekte in einer Packdatei können entweder als einfache komprimierte Daten (wie lose Objekte, die nur mit anderen Objekten gebündelt sind) oder als komprimierte Deltas für ein anderes Objekt gespeichert werden. Deltas können zu konfigurierbaren Tiefen verkettet werden ( pack.depth
) und können für jedes geeignete Objekt erstellt werden ( pack.window
steuert, wie häufig Git nach der besten Delta-Basis sucht; eine Version einer historisch nicht verwandten Datei kann als Basis verwendet werden, wenn dies zu a führen würde) gute Delta-Komprimierung). Der Spielraum, den die Tiefen- und Fenstergrößenkonfigurationen der Delta-Komprimierungs-Engine bieten, führt häufig zu einer besseren Delta-Komprimierung als die einfache Diff-Komprimierung im CVS-Stil (eine Version gegen die nächste / vorherige Version).
Diese aggressive Delta-Komprimierung (kombiniert mit normaler Zlib-Komprimierung) kann dazu führen, dass ein Git-Repository (mit vollem Verlauf und einem nicht komprimierten Arbeitsbaum) weniger Speicherplatz beansprucht als eine einzelne SVN-Prüfung (mit nicht komprimiertem Arbeitsbaum und unberührter Kopie).
Weitere Informationen finden Sie in den Abschnitten Speichern von Objekten und Packdateien in The Git Community Book . Auch die Manpage git pack-objects .
* Sie können Git anweisen, Commits wegzuwerfen, indem Sie den Verlauf neu schreiben und Befehle wie " git reset " ausführen . Aber auch in diesen Fällen "hängt" Git eine Weile an den neu verworfenen Commits, nur für den Fall, dass Sie sie benötigen. Siehe git reflog und git prune .