Git enthält für jedes Commit eine vollständige Kopie aller Dateien, mit der Ausnahme, dass der Snapshot für den bereits im Git-Repo vorhandenen Inhalt einfach auf diesen Inhalt verweist, anstatt ihn zu duplizieren.
Das bedeutet auch, dass mehrere Dateien mit demselben Inhalt nur einmal gespeichert werden.
Ein Snapshot ist also im Grunde ein Commit, der sich auf den Inhalt einer Verzeichnisstruktur bezieht .
Einige gute Referenzen sind:
Sie teilen Git mit, dass Sie einen Snapshot Ihres Projekts mit dem Befehl git commit speichern möchten, und es zeichnet im Grunde ein Manifest auf, wie alle Dateien in Ihrem Projekt zu diesem Zeitpunkt aussehen
In Übung 12 wird veranschaulicht, wie frühere Schnappschüsse abgerufen werden
Das Progit-Buch enthält die umfassendere Beschreibung eines Schnappschusses:
Der Hauptunterschied zwischen Git und anderen VCS (einschließlich Subversion und Freunde) besteht darin, wie Git über seine Daten denkt.
Konzeptionell speichern die meisten anderen Systeme Informationen als Liste dateibasierter Änderungen. Diese Systeme (CVS, Subversion, Perforce, Bazaar usw.) betrachten die Informationen, die sie speichern, als eine Reihe von Dateien und die Änderungen, die im Laufe der Zeit an jeder Datei vorgenommen wurden
Git denkt oder speichert seine Daten nicht so. Stattdessen betrachtet Git seine Daten eher als eine Reihe von Schnappschüssen eines Mini-Dateisystems.
Jedes Mal, wenn Sie den Status Ihres Projekts in Git festschreiben oder speichern, wird im Grunde genommen ein Bild davon erstellt, wie alle Ihre Dateien in diesem Moment aussehen, und ein Verweis auf diesen Snapshot gespeichert.
Um effizient zu sein, speichert Git die Datei nicht erneut, wenn sie nicht geändert wurde - nur ein Link zu der vorherigen identischen Datei, die bereits gespeichert wurde.
Git denkt über seine Daten eher wie folgt nach:
Dies ist eine wichtige Unterscheidung zwischen Git und fast allen anderen VCSs. Dadurch überprüft Git fast jeden Aspekt der Versionskontrolle, den die meisten anderen Systeme der vorherigen Generation kopiert haben. Dies macht Git eher zu einem Mini-Dateisystem mit einigen unglaublich leistungsstarken Tools als zu einem VCS.
Jan Hudec fügt diesen wichtigen Kommentar hinzu :
Während dies auf konzeptioneller Ebene wahr und wichtig ist, gilt dies NICHT auf Speicherebene.
Git verwendet Deltas zur Speicherung .
Darüber hinaus ist es effizienter als jedes andere System. Da der Verlauf pro Datei nicht beibehalten wird, wenn eine Delta-Komprimierung durchgeführt werden sollEs wird jeder Blob benötigt, einige Blobs ausgewählt, die wahrscheinlich ähnlich sind (unter Verwendung von Heuristiken, die die engste Annäherung an die vorherige Version und einige andere enthalten), versucht, die Deltas zu generieren und die kleinste auszuwählen. Auf diese Weise kann es (oft abhängig von der Heuristik) andere ähnliche Dateien oder ältere Versionen nutzen, die ähnlicher sind als die vorherigen. Der Parameter "Pack Window" ermöglicht die Handelsleistung für die Delta-Komprimierungsqualität. Die Standardeinstellung (10) liefert im Allgemeinen anständige Ergebnisse. Wenn jedoch der Speicherplatz begrenzt ist oder die Netzwerkübertragung beschleunigt wird, git gc --aggressive
wird der Wert 250 verwendet, wodurch die Ausführung sehr langsam wird, jedoch eine zusätzliche Komprimierung für Verlaufsdaten bereitgestellt wird.