linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
Intro
Lessons
Footer
linuxlab-УчебникиЦеныО платформеКонфиденциальность и куки
Copyright © 2026 LinuxLab. Все права защищены.
linuxlab.io
Учебники▾
  • Линукс и сети
    Файловая система, процессы, TCP/IP, BGP и OSPF
    →
  • Terraform и IaC
    HCL, state, plan/apply на sandbox LocalStack
    →
  • Git и GitHub
    Объектная модель, plumbing, ветвление, GitHub Actions
    →
Все учебники →
ЦеныО платформеВойтиСоздать аккаунт
/
  • Введение
  • Главы
  • How it works
  • Уроки
  • База знаний
  • Собеседование
home/git/kb/Основы Git/snapshot-vs-delta

kb/basics ── Основы Git ── beginner

Снимки против дельт

Главное идейное отличие Git от SVN/CVS/Perforce. Старые VCS хранят каждую версию как разницу с предыдущей. Git хранит каждую версию как полный снимок проекта, с дедупликацией одинаковых файлов через SHA.

view as markdownaka: snapshot-vs-deltas, delta-vs-snapshot

В системах вроде SVN, CVS, Perforce каждая версия файла хранится как разница (delta) от предыдущей. Чтобы получить файл недельной давности, система начинает с одной из версий и накатывает дельты в нужную сторону.

SVN / CVS / Perforce - модель дельт:
v1: полный файл
v2: дельта (3 строки изменены)
v3: дельта (1 строка добавлена)
v4: дельта (5 строк удалено)
                    ↑
            чтобы восстановить v4,
            нужно применить дельты v1+v2+v3+v4

Git устроен иначе. Каждый коммит хранит полный снимок всего проекта через tree-объект. Не разницу - фотографию.

Git - модель снимков:
коммит 1: snapshot 1
коммит 2: snapshot 2
коммит 3: snapshot 3
                    ↑
            чтобы посмотреть коммит 3,
            просто берём snapshot 3

Откуда экономия места

Кажется расточительным хранить весь проект на каждом коммите. Так и есть, и Git использует две хитрости:

Дедупликация по содержимому. Файл хранится через blob, адресуемый по SHA содержимого. Если файл не менялся между коммитами - у него тот же SHA, и Git переиспользует один и тот же blob. Реально на диске лежит «снимок дерева директорий с указателями на файлы», а не «снимок проекта целиком».

Дельты внутри packfile. При git gc или git push накопленные объекты упаковываются в один файл, внутри которого похожие объекты кодируются как дельты. Это оптимизация хранения, не модель данных.

Почему это важно

Разница между моделями - фундамент того, как Git работает.

  • Ветка - это указатель на снимок, а не запись «отделилось в такой-то момент». Создание ветки = 40 байт. Переключение - мгновенное.
  • git log идёт по цепочке parent коммитов, читая готовые снимки. Не нужно реконструировать историю.
    • git diff показывает разницу между двумя снимками - вычисляется на лету. Это вид, не способ хранения. Частая путаница.

§ команды

bash
git cat-file -p HEAD^{tree}

Содержимое снимка последнего коммита

bash
git cat-file -t <sha>

Тип объекта (snapshot обращается через tree)

bash
git diff <commit-A> <commit-B>

Diff между двумя снимками - вычисляется в момент запроса

§ см. также

  • blobBlobОбъект Git, который хранит содержимое одного файла. Только байты, без имени, прав и даты. Имя файла лежит в `tree`, не в blob.
  • treeTreeОбъект Git, который хранит список того, что лежит в одной директории: записи `(права, тип, SHA, имя)`. Рекурсивно ссылается на другие tree для поддиректорий.
  • commitCommitОбъект Git: снимок состояния всего проекта (через tree) плюс метаданные - автор, коммиттер, дата, родители, сообщение. SHA коммита включает SHA родителя, что делает историю криптографически связанной.
  • packfilePackfileСжатый файл в `.git/objects/pack/`, в который Git упаковывает множество loose-объектов, чтобы экономить место и ускорять сетевые операции. Использует дельта-компрессию между похожими объектами.
  • distributed-vcsРаспределённая система контроля версийVCS, где у каждого разработчика - полная копия истории, а не только снимок. Git, Mercurial, Bazaar. Главное отличие от централизованных (SVN, CVS) - отсутствие единой точки отказа и работа без сети.
  • vcsСистема контроля версийИнструмент, который хранит историю изменений файлов, позволяет возвращаться к прошлым версиям и совместно работать над проектом нескольким людям. Три поколения: локальные, централизованные, распределённые.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки