Git не викидає інформацію самостійно *. Усі попередні версії кожного файлу завжди доступні для ревертування, різниці, перевірок тощо.
Ціле дерево проти окремих файлів
Можливо, ви намагаєтеся погодитись - це ідея отримати доступ до старої версії окремого файлу проти того, що модель історії Git орієнтована на ціле дерево. Версія для цілого дерева вимагає трохи більше роботи, щоб побачити (наприклад) версію такої, foo.c
якою вона існувала десять foo.c
змін у порівнянні з десятьма цільними деревами зміни тому:
# 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
Переваги орієнтації на дерева, головним чином, здатність переглядати вчинки як одиницю взаємозалежних змін, внесених до різних частин дерева, загалом значно переважають над додатковими введеннями (які можна полегшити псевдонімами, сценаріями та ін.) Та часом процесора провів копання через минулі коміти.
Ефективність зберігання
Коли новий об'єкт (наприклад, файл із раніше небаченим вмістом) потрапляє в систему, він зберігається з простим (zlib) стисненням як "вільний об'єкт". Коли накопичиться достатньо вільних об’єктів (на основі параметра gc.auto
конфігурації; або коли користувач виконує git gc або одну з команд упаковки нижнього рівня), Git збирає багато вільних об'єктів в єдиний "файл упаковки".
Об'єкти у пакувальному файлі можуть зберігатися як звичайні стислі дані (такі ж, як вільний об’єкт, щойно зв'язані з іншими об’єктами), або як стислі дельти проти якогось іншого об'єкта. Дельти можуть бути пов'язані між собою до настроюваних глибин ( pack.depth
) і можуть бути зроблені проти будь-якого відповідного об'єкта ( pack.window
контролює, наскільки широко Git шукає кращу базу дельти; версія базового файлу, який історично не пов'язаний, може використовуватися як база, якщо це призведе до отримання хороша дельта стиснення). Широта, що надає конфігурації глибини та розміру вікна, дає механізму стиснення дельти, часто призводить до кращого стиснення дельти, ніж простое стиснення «версія» проти «наступної» та «попередньої» в стилі CVS.
Саме ця агресивна дельта-компресія (у поєднанні з нормальним стисненням zlib) часто може дозволити сховищу Git (з повною історією та нестисненим робочим деревом) зайняти менше місця, ніж для одного SVN-каси (із нестисненим робочим деревом та незайманою копією).
Дивіться, як Git зберігає об’єкти та розділи Packfile Книги Git Community . Також git pack-об'єкти керують сторінкою .
* Ви можете сказати, що Git викидає комісії, "переписуючи історію" та за допомогою таких команд, як скидання git , але навіть у цих випадках Git "зависає" на щойно відкинуті коміти на деякий час, лише на випадок, якщо ви вирішите, що вони вам потрібні. Див. Git reflog та git prune .