how/объекты
Git внутри - это четыре типа объектов и одна большая хеш-таблица. Посмотрим, как файл с диска превращается в commit с SHA, и почему вся история криптографически связана.
Если выкинуть из Git все команды и оставить одну идею, останется
вот это: объектная база. Папка .git/objects/, в которой Git
хранит четыре типа объектов:
(права, тип, SHA, имя).tree плюс метаданные (автор, время, родители,
сообщение).Каждый объект адресуется своим [[sha1|SHA]] - хешем собственного содержимого. Идентичные файлы получают одинаковый SHA и хранятся один раз. История - это цепочка commit'ов, где каждый ссылается на своего родителя.
Жми ▶ - проследим, как три файла превращаются в один commit за четыре шага.
Папка проекта, в ней три файла: README.md,
index.html, style.css. С точки зрения Git это рабочая копия
(working-tree) - просто содержимое файловой системы, в котором ты
правишь код.
Git их пока не видел. В .git/objects/ ничего нашего нет, в
индексе - пусто. Чтобы что-то закоммитить, файлы сначала нужно
превратить в объекты.
итого
Что важно запомнить:
.git/refs/heads/main -
обычный текстовый файл; в нём 40 символов SHA коммита. Перевести
ветку - значит переписать этот файл.Plumbing-команды (hash-object, write-tree, commit-tree,
cat-file) делают ровно эти шаги по одному. Высокоуровневый
git commit склеивает их в одну операцию.