Обзор раздела — Git под капотом
Git есть в каждом проекте, и почти каждый разработчик умеет в нём работать на уровне пяти команд: add, commit, push, pull, checkout. Этого хватает для счастливого пути. Но стоит однажды зайти в detached HEAD, получить конфликт при rebase или «потерять» коммит после жёсткого reset — и начинается паника: пересоздание репозитория, копирование файлов руками, мольбы о помощи в чате команды. Всё это лечится одним: пониманием того, как Git устроен внутри.
Зачем отдельный глубокий раздел по Git
Заголовок раздела «Зачем отдельный глубокий раздел по Git»Git — это не «облако с кнопками», а файловая система с адресацией по содержимому (content-addressable storage; фундамент — Pro Git, глава «Git изнутри»). Каждый коммит, файл, директория и тег — объект в базе, у каждого объекта уникальный SHA-1-хэш. Когда ты понимаешь эту модель, 90% «магии» растворяется: ветка — это 41-байтовый текстовый файл со строкой хэша, HEAD — ещё один файл, staging area — бинарный индекс рядом с ними. Нет скрытого состояния — всё лежит в .git/ и читается обычными средствами.
В продакшене это понимание бьётся ежедневно. Код-ревью требует чистой истории — нужен интерактивный rebase (см. git-rebase(1)). CI ломается из-за force-push в защищённую ветку — нужно понимать golden rule. Тиммейт «сломал» main, и нужно вернуть «исчезнувший» коммит — без reflog (см. git-reflog(1)) это гадание, с reflog это три команды. Разработчик, который знает внутреннее устройство, не боится Git: он чинит ситуации, за которые другие пересоздают репозиторий. А на собеседованиях вопросы «что происходит при merge», «чем reset --hard отличается от checkout .», «что такое detached HEAD» встречаются почти на каждом интервью уровня middle+ — их задают, чтобы проверить: работал ли человек с Git по-настоящему или просто нажимал кнопки в GUI.
Ключевой принцип раздела
Заголовок раздела «Ключевой принцип раздела»Во всех главах мы рисуем схемы: деревья коммитов, стрелки между областями, содержимое файлов в .git/. Когда ты видишь картинку «ветка — это файлик со строкой хэша, а HEAD — файлик со строкой ref: refs/heads/main» — переключение веток перестаёт быть магией. Все-все-все схематично: каждый механизм — с диаграммой до/после.
Что внутри раздела
Заголовок раздела «Что внутри раздела»Раздел идёт от внутренностей к практике: сначала фундамент (объекты, ссылки, индекс), потом ежедневный рабочий цикл, затем ветвление и слияния, после — работа с сервером и командные стратегии. Не перескакивай главы: термины накапливаются.
1. Git под капотом: объекты, хэши, refs, индекс — фундамент раздела. Content-addressable storage, четыре типа объектов (blob, tree, commit, tag), вычисление SHA-1, содержимое .git/objects, packfiles и git gc (см. git-gc(1)), refs (HEAD, ветки, теги, remote-refs), формат index-файла. После главы ты откроешь .git/ руками и найдёшь любой коммит.
2. Рабочий цикл: staging, commit, diff, status — три области Git (рабочая директория → staging → репозиторий) и весь путь изменения между ними. git add в деталях и построчный режим -p, .gitignore во всех правилах с примерами, git commit --amend, философия атомарных коммитов, conventional commits, чтение git status и git diff (staged/unstaged) без единой непонятной строки.
3. Ветвление: указатели, HEAD, switch и чтение истории — ветка как указатель на коммит (да, это 41-байтовый файл), HEAD как «указатель на указатель», detached HEAD: схема, опасности и спасение, разница switch/restore/старый checkout, управление ветками и навигация по истории: git log --oneline --graph --all и чтение ASCII-графов.
4. Слияние и перебазирование глубоко — fast-forward против three-way merge с пошаговыми схемами, конфликты: чтение conflict-markers, --ours/--theirs, rerere, --abort; механика rebase как «пересадки коммитов», интерактивный rebase (pick/squash/fixup/reword/drop/reorder), golden rule of rebase, cherry-pick, revert против reset (soft/mixed/hard) и reflog как спасательный круг.
5. Удалённые репозитории и PR — устройство распределённой части Git: что реально скачивает clone, чем fetch отличается от pull, почему отказывает push (non-fast-forward), tracking-ветки и upstream, форк-воркфлоу, цикл code review и релизы через теги.
6. Стратегии ветвления — Git Flow, GitHub Flow и Trunk-Based Development: как двигаются ветки, чем стратегии отличаются по размеру команды и релизному циклу, environment-ветки против feature flags.
7. Продвинутый Git — инструменты инженера, который живёт в Git: stash как стек, worktree, бинарный поиск багов через bisect, хирургия истории rebase --onto, submodules и LFS, хуки и husky, подпись коммитов и защита секретов.
Как работать с разделом
Заголовок раздела «Как работать с разделом»- Руки в
.git/. В первой главе мы буквально открываем файлы внутри репозитория (cat .git/HEAD,find .git/objects). Повторяй всё у себя — это главное упражнение раздела. - Рисуй деревья. Перед каждым merge или rebase нарисуй дерево коммитов и предскажи результат. Сверь с
git log --graph. Несовпало — разберись, почему. - Практика из глав. В конце каждой главы — задания с критериями результата. Делай их в «песочном» репозитории, который не жалко ломать.
Минимальный инструментарий
Заголовок раздела «Минимальный инструментарий»Для раздела достаточно Git 2.40+ и любого терминала:
git --version # проверь версию, нужна 2.40+ для современных switch/restoregit init песочница && cd песочница # отдельный репозиторий для экспериментов