Модуль 3 · Основы работы · урок 14 из 15
Git как страховка: ветки, коммиты, откат
Агент может за минуту поменять десять файлов. Это прекрасно, когда изменения правильные, и неприятно, когда нет. Git превращает любую попытку агента в эксперимент, который можно откатить одной командой. В этом уроке — минимальная дисциплина, которая позволяет давать агенту свободу и ничего не терять.
Перед началом: чистое дерево и ветка
Первое правило: агент начинает работу на чистом рабочем дереве в отдельной ветке.
git status # нет незакоммиченных изменений
git switch main && git pull
git switch -c task-1234-utm-crmПочему чистое дерево важно: если в рабочей копии уже лежат ваши незакоммиченные правки, после работы агента вы не отличите свои изменения от его. А откат «всего, что сделал агент» заденет и вашу работу. Есть незаконченное — закоммитьте во временную ветку или уберите в git stash.
Отдельная ветка на задачу даёт две вещи: изменения агента изолированы от основной линии, и по имени ветки понятно, что в ней. Если в команде принято называть ветки по ID задачи из трекера — следуйте этому и с агентом.
Коммиты как контрольные точки
Работайте шагами, и после каждого рабочего шага — коммит. Например, задача «передавать UTM-метки в CRM»:
- Агент добавил чтение меток и тесты — тесты зелёные — коммит.
- Агент изменил формат запроса к CRM — тесты зелёные — коммит.
- Агент взялся за рефакторинг соседнего класса и всё сломал — откат к шагу 2.
Без промежуточных коммитов шаг 3 пришлось бы распутывать вручную, отделяя хорошие правки от плохих. С коммитами — одна команда.
Не бойтесь мелких коммитов в рабочей ветке: перед MR их можно объединить, если в команде так принято.
Смотреть изменения
Прежде чем коммитить, смотрите, что изменилось. Внутри сессии Codex:
/diffКоманда показывает git diff — и проиндексированные, и непроиндексированные изменения, и новые файлы, которые git ещё не отслеживает. Последнее важно: агент часто создаёт новые файлы (тесты, миграции, вспомогательные классы), и обычный git diff их не покажет.
В терминале то же самое:
git status # какие файлы изменены и созданы
git diff # изменения в отслеживаемых файлах
git add -p # добавить в коммит по кускам, читая каждыйДля второго мнения есть /review — отдельный ревьюер проверит изменения и выдаст замечания, ничего не меняя. Подробно — урок «Ревью кода командой /review».
Откат
Самые нужные команды, от мягких к жёстким:
git restore path/to/file.php # вернуть файл к последнему коммиту
git restore . # вернуть все отслеживаемые файлы
git clean -n # ПОКАЗАТЬ, какие неотслеживаемые файлы будут удалены
git clean -fd # удалить их (только после -n!)
git reset --hard HEAD~1 # отменить последний коммит вместе с изменениямиДве предосторожности:
git clean -fdудаляет неотслеживаемые файлы безвозвратно, в том числе ваши, если они не в.gitignore. Всегда сначала-n.git reset --hardтеряет незакоммиченные изменения. Если сомневаетесь — сначалаgit stash, потом откат: из stash можно вернуть.
Помните из урока «Сессии»: возврат к раннему сообщению в Codex (двойной Esc) меняет историю разговора, но не файлы. Откат файлов — всегда через git.
Кто коммитит
На старте коммитьте сами: так вы точно читаете каждое изменение перед тем, как оно попадёт в историю.
Когда освоитесь, коммит можно поручать агенту. По умолчанию песочница держит каталог .git только для чтения даже в режиме Auto, поэтому git commit и другие команды, меняющие репозиторий, агенту придётся выполнять с вашего одобрения. Это не баг, а полезная пауза: вы видите, что именно коммитится.
Правила оформления коммитов запишите в AGENTS.md, чтобы агент им следовал:
## Git
- Ветка на задачу: `task-<ID задачи>` от `main`
- Сообщение коммита: `task-<ID> | что сделано и зачем`, по-русски
- Не делать `git push`, `git rebase` и `git reset --hard` без явной просьбы
- Не коммитить `.env`, дампы баз и файлы из `storage/`Что остаётся за человеком
Есть действия, которые меняют общий мир, а не вашу рабочую копию: git push, слияние в main, force-push, удаление веток на сервере. Их делаете вы — или агент только по вашей явной просьбе и после одобрения. Агент не должен работать прямо в main и не должен пушить туда.
Когда освоитесь с настройками, такие команды можно закрепить правилами, которые всегда требуют одобрения или запрещены, — урок «Rules».
И ещё раз о режиме полного доступа (--yolo): в нём песочница не защищает .git, и агент может выполнить любые команды git без спроса. На рабочем репозитории с настроенным доступом к серверу это прямой путь к случайному push. Полный доступ — только в изолированном окружении (урок «Песочница и одобрения»).
Параллельная работа: worktree
Когда захочется вести две задачи одновременно — например, агент чинит баг, а вы в это время смотрите другую ветку, — обычная рабочая копия станет тесной: два процесса начнут менять одни и те же файлы. Для этого есть git worktree — несколько рабочих копий одного репозитория в разных каталогах. Codex умеет создавать их сам: флаг --worktree при запуске или команда /worktree в сессии. Это тема урока «Несколько задач параллельно».
Попробуйте сами
10–15 мин на рабочем месте- Начните задачу с агентом в новой ветке. После первого рабочего шага закоммитьте, после второго — тоже.
- Попросите агента сделать заведомо лишнее изменение (например, «переименуй этот класс по всему проекту»), посмотрите
/diffи откатите его черезgit restore .иgit clean -n/git clean -fd. - Добавьте в AGENTS.md раздел «Git» с правилами веток, сообщений коммитов и запретами.
Коротко
- Агент начинает на чистом дереве в отдельной ветке.
- Коммит после каждого рабочего шага — контрольная точка для отката.
/diffпоказывает и новые файлы; перед коммитом читайте изменения.- Откат:
git restore,git clean -nперед-fd,git stashперед жёсткими командами. .gitзащищён песочницей: коммит от агента — с вашего одобрения.- Push и работа с
main— за человеком.