История создания Git и мотивация архитектуры
В 2005 году, после разрыва сотрудничества с BitKeeper — проприетарной системой контроля версий, которую использовали разработчики ядра Linux — Линус Торвальдс за считанные недели создает новый инструмент. Главной задачей было обеспечить скорость, надежность и полную децентрализацию. Так появляется Git, изначально заточенный под нужды огромного распределенного проекта, с миллионами строк кода и тысячами коммитов.
Одна из ключевых особенностей Git — это его подход к хранению данных, который радикально отличается от классических систем контроля версий. Вместо хранения изменений (deltas), Git сохраняет каждый файл и состояние проекта как снимок (snapshot). Именно эта идея легла в основу внутренней структуры .git/objects — того самого каталога, где живут все объекты Git.
Что такое .git/objects и зачем он нужен
Каталог `.git/objects` — это сердце репозитория. Когда вы инициализируете новый git-репозиторий (`git init`), Git создает структуру папок внутри `.git`, и среди них — директорию `objects`. В ней Git хранит всё: от коммитов и деревьев до отдельных файлов и тегов. Это не просто хранилище — это база данных, организованная по принципу хэш-идентификаторов, где каждый объект идентифицируется 40-символьным SHA-1 (в 2025 году — все чаще SHA-256, но об этом позже).
Когда говорят о разборе git objects, чаще всего имеют в виду именно содержимое этого каталога. Понимание того, как устроен .git/objects, позволяет не только лучше осознать внутренности Git, но и диагностировать проблемы, оптимизировать работу с репозиториями или даже вручную восстанавливать утерянные данные.
Структура хранения: как Git организует объекты

Git использует четыре основных типа объектов: blob, tree, commit и tag. Все они сериализуются, сжимаются и сохраняются в `.git/objects`. Каждый объект идентифицируется своим хэшем. Первые два символа этого хэша становятся именем подкаталога, а оставшиеся 38 символов — именем файла. Например, объект с SHA-1 `e69de29bb2d1d6434b8b29ae775ad8c2e48c5391` будет храниться в `.git/objects/e6/9de29bb2d1d6434b8b29ae775ad8c2e48c5391`.
Это простое и гениальное решение позволяет избежать коллизий и обеспечивает высокую производительность при обращении к объектам. Хранение данных в Git построено на идее неизменяемых объектов: как только объект создан, он никогда не изменяется. Это позволяет Git кэшировать, переиспользовать и уверенно ссылаться на объекты между коммитами.
---
Пример: создание объекта blob вручную
```bash
echo "Hello Git" | git hash-object -w --stdin
```
Эта команда создаст blob-объект из строки `Hello Git`, запишет его в `.git/objects`, и выведет его SHA-1. Теперь объект физически существует, и вы можете найти его в подкаталоге `objects` по хэшу.
---
Типы объектов: blob, tree, commit, tag
Чтобы в полной мере понять, как устроен .git/objects, нужно разобраться в типах объектов:
- Blob — это содержимое файла. Оно не содержит имени файла или метаданных, только данные. Если вы добавите два идентичных файла в разные директории, Git сохранит только один blob.
- Tree — это «папка» в Git. Tree-объекты содержат ссылки на blob и другие tree-объекты. Они включают имена файлов, режимы доступа (например, `100644` для обычного файла) и хэши связанных объектов.
- Commit — это снимок состояния проекта и метаданные: автор, дата, сообщение и ссылка на tree-объект, представляющий корень файловой иерархии на момент коммита. Также commit может ссылаться на предыдущие коммиты (родителей).
- Tag — это аннотированная (или легковесная) ссылка на другой объект, чаще коммит. Используется для пометки релизов, например `v1.0.0`.
В совокупности эти объекты образуют структуру Git объектов, где каждый коммит — это вершина дерева, ссылающаяся на поддеревья и файлы, а также на родителей.
Объекты — неизменны и универсальны

Одна из причин, почему Git так эффективно работает с большими репозиториями — это неизменяемость и универсальность его объектов. Так как структура git объектов построена на хэшах, Git может легко определить, был ли уже такой файл или коммит, и переиспользовать его. Это экономит место: если вы 10 раз добавите один и тот же файл в разные коммиты — Git сохранит его blob только один раз.
К 2025 году Git продолжает использовать эту модель, хотя появляются улучшения — например, поддержка SHA-256 для повышения криптостойкости. Однако фундамент остается прежним: хранение данных в git по-прежнему основано на идее неизменяемых, сжимаемых, хэшированных объектов.
---
Технический блок: как выглядит объект внутри
Объект Git — это сжатый gzip-файл, содержащий следующую структуру:
```

