Git містить для кожної фіксації повну копію всіх файлів, за винятком того, що для вмісту, який уже присутній у репортажі Git, знімок буде просто вказувати на зазначений вміст, а не дублювати його.
Це також означає, що кілька файлів з однаковим вмістом зберігаються лише один раз.
Отже, знімок - це в основному фіксація, посилаючись на зміст структури каталогів.
Деякі хороші посилання:
Ви скажете Git, що хочете зберегти знімок свого проекту за допомогою команди git commit, і він в основному записує маніфест про те, як виглядають усі файли вашого проекту в цей момент.
Лабораторія 12 ілюструє, як отримати попередні знімки
У книзі прогресу є більш вичерпний опис знімка:
Основна різниця між Git та будь-яким іншим VCS (включено Subversion та друзів) - це те, як Git думає про свої дані.
Концептуально більшість інших систем зберігають інформацію як список змін на основі файлів. Ці системи (CVS, Subversion, Perforce, Bazaar тощо) вважають інформацію, яку вони зберігають, як набір файлів та зміни, внесені до кожного файлу протягом часу
Git не думає і не зберігає свої дані таким чином. Натомість, Git сприймає свої дані більше як набір знімків міні-файлової системи.
Кожен раз, коли ви здійснюєте або зберігаєте стан свого проекту в Git, він в основному робить знімок того, як виглядають усі ваші файли в той момент, і зберігає посилання на цей знімок.
Для ефективності, якщо файли не змінені, Git знову не зберігає файл - лише посилання на попередній ідентичний файл, який він уже зберігав.
Гіт думає про свої дані так, як нижче:
Це важлива відмінність між Git і майже всіма іншими ДКС. Це змушує Git переглянути майже кожен аспект контролю версій, який більшість інших систем скопіювали з попереднього покоління. Це робить Git більше схожим на міні-файлову систему з неймовірними потужними інструментами, побудованими поверх неї, а не просто VCS.
Ян Худек додає цей важливий коментар :
Хоча це істинно і важливо на концептуальному рівні, це не відповідає дійсності на рівні зберігання.
Git використовує дельти для зберігання .
Не тільки це, але в ньому ефективніше, ніж будь-яка інша система. Оскільки він не зберігає історію файлів, коли він хоче робити стиснення дельти, вона бере кожну крапку, вибирає певні краплі, які, можливо, будуть схожі (використовуючи евристику, що включає найближче наближення попередньої версії та деякі інші), намагається генерувати дельти і вибирає найменшу. Таким чином, він може (часто залежить від евристики) скористатися іншими подібними файлами або старими версіями, схожішими за попередні. Параметр "вікно упаковки" дозволяє здійснювати торгівлю для якості стиснення дельта. За замовчуванням (10) загалом даються гідні результати, але коли простір обмежений або для прискорення мережевих передач, git gc --aggressive
використовується значення 250, що змушує його працювати дуже повільно, але забезпечує додаткове стиснення даних історії.