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/Объектная модель/tree

kb/objects ── Объектная модель ── intermediate

Tree

Объект Git, который хранит список того, что лежит в одной директории: записи `(права, тип, SHA, имя)`. Рекурсивно ссылается на другие tree для поддиректорий.

view as markdownaka: git-tree, tree-object

Tree - объект, который описывает содержимое одной директории. Каждая строка tree - это одна запись:

100644 blob 5f7e9c12...    README.md
100644 blob 8a3f2e91...    index.html
040000 tree e2b5a91f...    images
100644 blob b1d4a7e0...    style.css

Четыре колонки:

  • Права доступа - 100644 обычный файл, 100755 исполняемый, 040000 поддиректория, 120000 симлинк, 160000 gitlink (submodule). Git хранит mode как число, git ls-tree всегда печатает шестью цифрами с ведущим нулём.
  • Тип - blob для файла, tree для поддиректории.
  • SHA - указатель на сам blob или tree.
  • Имя - как файл/папка называется в этой директории.

Содержимое файла лежит в blob. Tree связывает имя с этим содержимым.

Рекурсивная структура

Tree, в котором есть запись типа tree, указывает на другой tree-объект для поддиректории. Получается дерево из tree-объектов, отражающее дерево директорий проекта:

корневой tree
   ├── blob README.md
   ├── tree images/
   │      ├── blob logo.png
   │      └── blob banner.jpg
   └── blob style.css

Когда создаётся

При git commit. До коммита tree не существует - есть только .git/index, который хранит плоский список путей. git write-tree превращает индекс в иерархию tree-объектов и возвращает SHA корневого.

Посмотреть содержимое

bash
git cat-file -p <tree-sha>
git ls-tree HEAD              # tree последнего коммита
git ls-tree -r HEAD           # рекурсивно, плоский список всех файлов

Дедупликация на уровне дерева

Если поддиректория не изменилась между двумя коммитами - tree этой поддиректории идентичен. Tree родителя ссылается на тот же SHA. То есть Git дедуплицирует не только файлы, но и целые поддиректории.

§ команды

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

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

bash
git ls-tree HEAD

Список tree корневой директории последнего коммита

bash
git ls-tree -r HEAD

Рекурсивно все файлы из tree

bash
git write-tree

Собрать tree из текущего индекса

§ см. также

  • blobBlobОбъект Git, который хранит содержимое одного файла. Только байты, без имени, прав и даты. Имя файла лежит в `tree`, не в blob.
  • commitCommitОбъект Git: снимок состояния всего проекта (через tree) плюс метаданные - автор, коммиттер, дата, родители, сообщение. SHA коммита включает SHA родителя, что делает историю криптографически связанной.
  • sha1SHA-1 в Git40-символьный хэш, по которому Git адресует объекты. Считается от содержимого с префиксом типа. Сломан криптографически в 2017 (SHAttered), но в Git до сих пор основной - миграция на SHA-256 идёт медленно.
Footer
linuxlab-
Copyright © 2026 LinuxLab. Все права защищены.
Учебники
Цены
О платформе
Конфиденциальность и куки