Репозиторий и история

Обозреватель объектов

За git закрепилась репутация сложного. Почти вся она берётся из того, что модель никто никогда не видел: четыре вида объектов и указатели. Как только вы сможете кликнуть по коммиту, попасть на его дерево и обнаружить, что ваш файл и есть блоб с именем, которое ему выдало дерево, — фарфор перестанет быть магией.

⌘K → Обозреватель объектов. Ничто на этой странице не может изменить ни байта — за каждым вызовом стоит чтение.

Поля коммита, с его деревом и родителями в виде ссылок, рядом со списком ссылок

Четыре объекта

Объект Это Знает
blob Содержимое файла Ничего. Ни своего имени, ни пути, ни истории
tree Список содержимого каталога Имена, режимы и sha каждого дочернего блоба или дерева
commit Один снимок Своё дерево, своих родителей, автора, коммиттера, сообщение
tag Аннотированный тег Объект, на который указывает, кто его поставил, сообщение

Сюрприз для большинства — первая строка. У блоба нет имени. Два файла с одинаковым содержимым где угодно в вашей истории — это один и тот же блоб, сохранённый один раз. Имя живёт в дереве, которое на него указывает, — вот почему git отслеживает содержимое, а не файлы, и почему переименования определяются, а не записываются.

Ссылка — refs/heads/main, refs/tags/v1.0, HEAD — это просто файл с sha внутри. Вот и всё содержание фразы «ветки в git дёшевы».

Обход

Левая колонка перечисляет все ссылки репозитория, сгруппированные так же, как их группирует git. Кликните по одной — попадёте на объект, который она называет.

Дальше всё является ссылкой:

  • Коммит показывает своё tree и каждого parent — можно провалиться в снимок или уйти назад по истории по одному коммиту за раз.
  • Дерево перечисляет свои записи с режимом, типом, sha и размером. Клик по имени открывает потомка.
  • Блоб показывает свой текст (для больших — его начало) или прямо говорит, что он бинарный.
  • Аннотированный тег показывает, на что указывает, — кликом можно перейти к коммиту.

Назад отматывает ваши шаги.

Ввод ревизии

Поле принимает всё, что принимает git rev-parse, — и именно здесь это перестаёт быть браузером и становится способом научиться:

Наберите Чтобы получить
HEAD Текущий коммит
HEAD~3 Три коммита назад
HEAD^{tree} Дерево этого коммита, очищенное
HEAD:src/app.ts Блоб по этому пути, напрямую
v1.0^{} То, на что указывает аннотированный тег, а не сам объект тега
a1b2c3d Любой объект по sha — сокращения работают

Цифры режима в листинге дерева стоит знать: 100644 — файл, 100755 — исполняемый, 040000 — поддерево, 120000 — симлинк, 160000 — гитлинк сабмодуля; последнее и есть всё, что сабмодуль хранит.

Ограничения, о которых стоит знать

  • Только чтение, и это намеренно. Писать здесь нечем. Изготовление объектов руками — упражнение с git hash-object, и его место в терминале.
  • Большие блобы обрезаются после первых 200 КБ — достаточно, чтобы понять, что это, и недостаточно, чтобы повесить окно.
  • Размеры — это размер содержимого объекта в том виде, в каком его сообщает git cat-file -s, а не то, во что он обходится на диске после упаковки. Про это — обслуживание.
  • Недостижимые объекты — тоже объекты. Вставьте sha из отчёта git fsck о висячих объектах, и он откроется; часто это самый быстрый способ посмотреть, что было в потерянном коммите, прежде чем решать, восстанавливать ли его.

См. также: Граф · Обслуживание репозитория · Восстановление

Улучшить этот перевод на GitHub