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/how/object-model

how/объекты

Объектная модель: blob → tree → commit

Git внутри - это четыре типа объектов и одна большая хеш-таблица. Посмотрим, как файл с диска превращается в commit с SHA, и почему вся история криптографически связана.

Если выкинуть из Git все команды и оставить одну идею, останется вот это: объектная база. Папка .git/objects/, в которой Git хранит четыре типа объектов:

  • blob - содержимое одного файла. Только байты.
  • tree - список того, что лежит в директории: (права, тип, SHA, имя).
  • commit - снимок tree плюс метаданные (автор, время, родители, сообщение).
  • tag - именованная ссылка на commit (опционально подписанная).

Каждый объект адресуется своим [[sha1|SHA]] - хешем собственного содержимого. Идентичные файлы получают одинаковый SHA и хранятся один раз. История - это цепочка commit'ов, где каждый ссылается на своего родителя.

Жми ▶ - проследим, как три файла превращаются в один commit за четыре шага.

step 1/5·00 · три файла лежат на диске
WORKING TREEфайлы на дискеBLOBS.git/objects/TREEsnapshot директорииCOMMITSистор. цепочкаREADME.mdtext · файл на дискеindex.htmltext · файл на дискеstyle.csstext · файл на дискеblob5f7e9c1blob8a3f2e9blobb1d4a7etree · d4e5f6amode type sha name100644blob5f7e9c1README.md100644blob8a3f2e9index.html100644blobb1d4a7estyle.cssтри файла в рабочей копии · Git их ещё не видел

§ шаги

  1. Папка проекта, в ней три файла: README.md, index.html, style.css. С точки зрения Git это рабочая копия (working-tree) - просто содержимое файловой системы, в котором ты правишь код.

    Git их пока не видел. В .git/objects/ ничего нашего нет, в индексе - пусто. Чтобы что-то закоммитить, файлы сначала нужно превратить в объекты.

итого

Что важно запомнить:

  • В Git снимки, а не diff'ы. Каждый commit - это полный снимок проекта через tree. Diff считается на лету между двумя tree.
  • SHA - это адрес и проверка целостности одновременно. Хеш считается от содержимого; изменишь содержимое - сменится SHA, и история ниже по цепочке об этом узнает.
  • Имя файла лежит в tree, не в blob. Один blob может ссылаться на два разных имени - и хранится один раз.
  • Branch - это просто файл с SHA внутри. .git/refs/heads/main - обычный текстовый файл; в нём 40 символов SHA коммита. Перевести ветку - значит переписать этот файл.
  • Commit ссылается на parent. История - это direct acyclic graph (DAG): обычный коммит - один parent, merge-коммит - два-три-четыре, root-коммит - ноль.

Plumbing-команды (hash-object, write-tree, commit-tree, cat-file) делают ровно эти шаги по одному. Высокоуровневый git commit склеивает их в одну операцию.

§ копнуть в базу знаний

  • blobblob - содержимое файла, без имени и прав
  • treetree - список записей директории
  • commitcommit - снимок и метаданные
  • sha1SHA-1 в Git - что и как хешируется
  • branchbranch - это просто файл со SHA
  • packfilepackfile - как Git упаковывает объекты на диске
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки