О серии#
9 уроков от базовых операций до продвинутых инструментов. Каждый урок:
- проверен в sandbox (все bash-блоки исполняемы)
- даёт конкретный артефакт: алиас, конфиг, скрипт
- содержит мини-тест с ответами
- занимает 30–60 минут
Карта серии#
| Урок | Тема | Ключевой навык | SFIA |
|---|
| День 0: SSH | Ключи, агент, config | ssh -T git@github.com без пароля | 2 |
| День 1: Три состояния | working / staging / committed | git add -p вместо git add . | 2 |
| День 2: Восстановление | reflog, fsck, reset | Найти потерянный коммит за 2 команды | 2 |
| День 3: Ветки и merge | ff vs –no-ff, конфликты, diff3 | Читать git log --graph | 3 |
| День 4: Rebase | rebase vs merge, interactive, golden rule | Чистить коммиты перед PR через rebase -i | 3 |
| День 5: Hooks | pre-commit, commit-msg, core.hooksPath | Блокировать секреты до коммита | 3 |
| День 6: Bisect | Бинарный поиск, bisect run, skip | Найти регрессию среди 1000 коммитов за 10 шагов | 2–3 |
| День 7: Cherry-pick и rerere | Точечный перенос, память о конфликтах | Перенести hotfix между ветками | 2–3 |
| День 8: Worktree | Параллельные рабочие деревья | Hotfix без git stash | 2–3 |
| Challenge | 10 проблем в одном репозитории | Все навыки серии вместе | 3 |
Порядок прохождения#
Уроки выстроены последовательно: День 0 настраивает SSH, День 1 объясняет три состояния, День 2 показывает, как их восстановить. Дни 3–4 — ветвление. Дни 5–8 — продвинутые инструменты. Challenge проверяет всё вместе.
Можно начать с любого урока, но ссылки и мини-тесты предполагают знание предыдущих.
Артефакты серии#
После прохождения в вашем ~/.gitconfig будут:
[alias]
s = status -sb
d = diff
dc = diff --cached
l = log --oneline -10
tree = log --all --graph --decorate --oneline
graph = log --all --graph --decorate --oneline
undo = reset --soft HEAD~1
br = branch -vv
rb = rebase
rbi = rebase -i
rbc = rebase --continue
rba = rebase --abort
pick = cherry-pick --allow-empty --keep-redundant-commits
wt = worktree
wta = worktree add
wtl = worktree list
wtr = worktree remove
[merge]
conflictStyle = diff3
ff = false
[pull]
rebase = true
ff = only
[rebase]
autoStash = true
[rerere]
enabled = true
autoupdate = true
Плюс папка .githooks/ с pre-commit, commit-msg и pre-push.
Цель урока После урока вы умеете создать Ed25519 SSH-ключ, подключить его к ssh-agent с автозагрузкой, добавить публичную часть в GitHub и клонировать приватный репозиторий без паролей. Понимаете, почему один ключ работает на десятке сервисов и как через ~/.ssh/config держать рабочий и личный GitHub в одной системе.
Параметр Значение Bloom Применение SFIA Уровень 2 Время 30–40 минут Артефакт Рабочий ~/.ssh/id_ed25519 + ~/.ssh/config + автозагрузка агента Проверка ssh -T git@github.com → приветствие от GitHub Теория за 3 минуты Пароль от GitHub вы вводите на клавиатуре у всех на виду — и его украдёт shoulder-surfing, phishing, случайный скриншот. SSH-ключ этот механизм убирает.
...
Цель урока После урока вы понимаете, в каком из трёх состояний живёт каждый ваш файл (working / staging / committed), читаете git status как карту и используете git add -p для осознанных коммитов вместо git add .. Знаете, какой командой вернуть файл из каждого состояния.
Параметр Значение Bloom Понимание, Применение SFIA Уровень 2 Время 30–40 минут Артефакт ~/.gitconfig с алиасами s, d, dc + история из 5 осознанных коммитов Проверка git status → nothing to commit, working tree clean; git log --oneline показывает коммиты в формате type(scope): message Теория за 3 минуты У файла в Git три состояния, и каждая команда — это переход между ними.
...
Цель урока После урока вы умеете восстановить потерянный коммит через git reflog, восстановить staged-изменения через git fsck --lost-found и точно знаете, какие операции Git безвозвратно удаляют данные. Понимаете, как reset --hard действует на файл в каждом из трёх состояний (working / staging / committed).
Параметр Значение Bloom Применение, частично Анализ SFIA Уровень 2 Время 40–60 минут Артефакт ~/.gitconfig с алиасами safe-reset, recover-staged, tree, undo Проверка Мини-тест + восстановление потерянного коммита за 2 команды Теория: что такое «потеря данных» в Git В Дне 1 вы видели три состояния — working / staging / committed. Сегодня смотрим на них под углом reset’а.
...
Цель урока После урока вы умеете создать feature-ветку и слить её в main двумя разными способами (fast-forward и --no-ff), читаете git log --graph, понимаете разницу между тремя стратегиями merge (ff / no-ff / squash) и решаете merge-конфликт по маркерам <<<<<<< ======= >>>>>>>.
Параметр Значение Bloom Применение SFIA Уровень 3 Время 40 минут Артефакт ~/.gitconfig с merge.ff = false, merge.conflictStyle = diff3, alias graph Проверка git log --graph показывает два merge-коммита с разной формой; конфликт решён Теория за 3 минуты Ветка в Git — это указатель на коммит. Не копия, не папка, не «параллельный мир». Одна строчка в файле .git/refs/heads/main с SHA.
...
Цель урока После урока вы умеете перестроить feature-ветку поверх свежего main через git rebase, понимаете разницу между rebase и merge на уровне графа, используете rebase -i для чистки коммитов перед PR (squash / reword / drop) и знаете золотое правило: не ребейсить то, что уже запушено в публичную ветку.
Параметр Значение Bloom Применение, частично Анализ SFIA Уровень 3 Время 45 минут Артефакт ~/.gitconfig с pull.rebase = true, rebase.autoStash = true, alias rb, rbi Проверка Feature-ветка успешно ребейзнута поверх main; git log --graph показывает линейную историю Теория: rebase — это не merge git merge соединяет две ветки merge-коммитом, сохраняя факт ветвления:
...
Цель урока После урока вы умеете написать и установить pre-commit и commit-msg hook на чистом bash (без Husky / Node / Python), понимаете почему hooks живут локально и как распространить их на команду через core.hooksPath + папку в репозитории. Можете добавить проверку секретов, trailing whitespace, формата Conventional Commits.
Параметр Значение Bloom Применение SFIA Уровень 3 Время 40 минут Артефакт repo/.githooks/pre-commit + commit-msg + core.hooksPath = .githooks Проверка Коммит с секретом блокируется; коммит с кривым сообщением блокируется; git commit --no-verify обходит (и это ожидаемо) Теория: что такое git hook Hook — это исполняемый файл в папке .git/hooks/, который Git вызывает на определённое событие. Если файл есть и имеет бит +x — Git запустит его и смотрит на exit code: 0 — продолжить операцию, не 0 — отменить.
...
Цель урока После урока вы умеете найти коммит, внёсший регрессию, за log₂(N) шагов через git bisect; различаете bad, good, skip; умеете автоматизировать поиск через git bisect run с любым тест-скриптом.
Параметр Значение Bloom Применение, Анализ SFIA Уровень 2–3 Время 30–40 минут Артефакт test-bisect.sh — тест-детектор под bisect run Проверка Мини-тест + сценарий «найди виновника за 4 шага» Теория за 3 минуты Git-история — это DAG коммитов. Каждый коммит знает, от какого родителя он произошёл.
...
Цель урока После урока вы умеете переносить отдельные коммиты между ветками через cherry-pick, различаете случаи, когда это уместно, и когда правильнее merge/rebase. Включили rerere глобально и понимаете, как Git запоминает ваше решение конфликта, чтобы применить его автоматически в следующий раз.
Параметр Значение Bloom Применение, Анализ SFIA Уровень 2–3 Время 35–45 минут Артефакт rerere.enabled = true в ~/.gitconfig + алиас pick Проверка Мини-тест + сценарий с повторным конфликтом Теория за 3 минуты git cherry-pick <sha> берёт один коммит с одной ветки и применяет как новый коммит на текущую. Новый коммит имеет другой SHA, но тот же diff и то же сообщение.
...
Цель урока После урока вы умеете создавать параллельные рабочие деревья через git worktree, держать в них разные ветки одновременно, убирать их и чистить мёртвые ссылки через prune. Понимаете, что объекты и refs лежат в одном .git/, а HEAD и index — своё для каждого дерева.
Параметр Значение Bloom Применение, Анализ SFIA Уровень 2–3 Время 25–35 минут Артефакт Алиасы wta/wtl/wtr + конвенция ~/code/<repo>/ + <repo>-<ветка>/ Проверка Мини-тест + параллельная работа feature + hotfix без stash Теория за 3 минуты Обычный репозиторий выглядит так: один каталог my-repo/, внутри .git/ с объектами и refs, рядом ваши файлы. В каждый момент времени checked out одна ветка — это ваш HEAD.
...
Зачем 9 уроков серии дают навыки по одному за раз в стерильных sandbox-репозиториях. В реальности проблемы наваливаются слоями: мусорная история и утекший секрет и merge-конфликт и два worktree в разных состояниях — всё одновременно.
Challenge — один заранее сломанный репозиторий с 10 такими проблемами. Вы проходите его руками и проверяете прогресс автоматическим скриптом.
Что внутри Репозиторий собирается скриптом setup-challenge.sh из чистого состояния и содержит:
Грязная история коммитов — сообщения fix, oops, update stuff (урок 1) Потерянный коммит в reflog — кто-то сделал reset --hard, в рабочем дереве его нет (урок 2) Merge-конфликт в одном файле от трёх веток (урок 3, урок 4) Активная ребейс-цепочка, прерванная на конфликте — нужно продолжить или отменить (урок 4) API-ключ и приватный RSA в истории — нужно вычистить и подстраховаться хуком (урок 5) Серия из пяти WIP-коммитов перед merge — нужен rebase -i squash (урок 4) Регрессия в 20 коммитах — ищется bisect’ом за 5 шагов (урок 6) Коммит из чужой ветки нужен в вашей — cherry-pick с конфликтом + rerere запомнит решение (урок 7) Параллельная задача без потери WIP — решается worktree (урок 8) Старый хлам в .git/worktrees/ — осиротевшие записи, нужен worktree prune (урок 8) Задачи идут с нарастающей сложностью. P1–P6 покрывают базу (уроки 0–5), P7–P10 используют продвинутые инструменты (уроки 6–8).
...