Ich habe gerade angefangen, Git zu lernen, und dazu habe ich angefangen, das Git-Community-Buch zu lesen. In diesem Buch heißt es, dass SVN und CVS den Unterschied zwischen Dateien speichern und dass Git einen Schnappschuss aller Dateien speichert.
Aber ich habe nicht wirklich verstanden, was sie mit Schnappschuss meinen. Macht git wirklich eine Kopie aller Dateien in jedem Commit, weil ich das aus ihrer Erklärung verstanden habe?
PS: Wenn jemand eine bessere Quelle hat, um Git zu lernen, würde ich es begrüßen.
Antworten:
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:
In Übung 12 wird veranschaulicht, wie frühere Schnappschüsse abgerufen werden
" Du hättest git erfinden können (und vielleicht hast du es schon!) "
Was ist ein Git "Snapshot"?
Lerne GitHub
Das Progit-Buch enthält die umfassendere Beschreibung eines Schnappschusses:
Jan Hudec fügt diesen wichtigen Kommentar hinzu :
quelle
Git speichert jede Datei logisch unter seinem SHA1. Dies bedeutet, dass nur eine Kopie gespeichert wird, wenn Sie zwei Dateien mit genau demselben Inhalt in einem Repository haben (oder wenn Sie eine Datei umbenennen).
Dies bedeutet jedoch auch, dass beim Ändern eines kleinen Teils einer Datei und beim Festschreiben eine weitere Kopie der Datei gespeichert wird. Die Art und Weise, wie Git dies löst, ist die Verwendung von Pack-Dateien. Hin und wieder werden alle „losen“ Dateien (eigentlich nicht nur Dateien, sondern auch Objekte, die Commit- und Verzeichnisinformationen enthalten) aus einem Repo gesammelt und zu einer Packdatei komprimiert. Die Packdatei wird mit zlib komprimiert. Und ähnliche Dateien sind auch deltakomprimiert.
Das gleiche Format wird auch beim Ziehen oder Drücken verwendet (zumindest bei einigen Protokollen), sodass diese Dateien nicht erneut komprimiert werden müssen.
Das Ergebnis ist, dass ein Git-Repository, das die gesamte unkomprimierte Arbeitskopie, unkomprimierte aktuelle Dateien und komprimierte ältere Dateien enthält, normalerweise relativ klein ist, zweimal kleiner als die Größe der Arbeitskopie. Dies bedeutet, dass es kleiner als SVN-Repo mit denselben Dateien ist, obwohl SVN den Verlauf nicht lokal speichert.
quelle