Руководство · Cursor · Git
Git и Cursor: как работать безопасно
Ветка, маленькие коммиты и просмотр diff делают работу агента обратимой.

Зачем git-ветка перед Cursor Agent
Agent в Cursor умеет менять десятки файлов за один прогон: search, edit, terminal, иногда commit (overview). Checkpoints откатывают файлы внутри сессии, но не заменяют историю между вечерами и не спасают, если вы уже смержили хаос в main. Отдельная git ветка сужает blast radius до одной задачи: худший сценарий - удалить ветку и начать с чистого main.
Почему предприниматели боятся агента - не из-за «ИИ опасен», а из-за необратимости. Пока правки живут в main без commit и без diff, любая строка от модели ощущается как потеря CRM или бота. Когда есть ветка feat/lead-form и commit «до агента», паника падает: вы сравниваете с main, смотрите только scope задачи, merge только после verify.
Я разделяю три слоя страховки. Первая - ветка или worktree: изолированный checkout, main не трогается (worktrees). Вторая - маленькие git commit после каждого зелёного шага. Третья - git diff до Accept и Apply All. Cursor git в этом смысле не отдельный продукт: Source Control в боковой панели показывает те же staged и unstaged, что и git status в терминале.
На новостных разборах всплывает отдельный риск: публичные логи агента, куда случайно попали пароли из промпта или из файла, который агент прочитал через terminal. Угол простой - не кормить секретами ни чат, ни rules, ни сырые trajectory наружу. Cloud Agent умеет redact runtime secrets (security), но это не отменяет здравый смысл: ключ в промпте уже ушёл в историю сессии.
Пять причин завести ветку до первого промпта:
- 01
Откат =
git switch mainи удаление ветки, а не ручной поиск по backup. - 02
Diff с main виден в Source Control и через
@Branch (Diff with Main)в промпте (prompting). - 03
Параллельные задачи не перемешиваются в одной рабочей копии.
- 04
Worktree в Cursor держит main checkout нетронутым до Apply после ревью.
- 05
Правила и команды в git переживают сессию - агент не «забывает» запреты (agent best practices).
Соло-разработчику ветка нужна не ради команды ревьюеров, а ради эксперимента. Агент может уверенно ошибаться - ветка делает ошибку локальной. Подробный вечерний сценарий с Plan и checkpoint - в первом проекте в Cursor.
Git новая ветка: шаги для CRM, бота или сайта

Правило, которое я даю на наставничестве: одна задача агента = одна ветка. Не «починим всё в main», а feat/telegram-webhook или fix/landing-hero от актуального main. Имя короткое, по смыслу задачи, без пробелов - так проще искать в истории и в PR.
Через терминал
Минимальный сценарий перед Agent:
git switch main
git pull --ff-only
git checkout -b feat/lead-form-validation
git statusgit checkout -b создаёт ветку и сразу переключается на неё - классический способ завести git новую ветку от свежего main. Если main локально устарел, сначала pull, иначе ветка отойдёт от remote и merge потом будет больнее.
Commit «до агента» фиксирует чистое состояние:
git add -A
git commit -m "checkpoint: before agent session"Теперь любой сбой агента отсекается сравнением с этим commit, а не с памятью «как было вчера».
Через Source Control в Cursor
Не обязательно помнить все флаги. В боковой панели Source Control: клик по имени ветки внизу статус-бара или в шапке SCM → Create new branch → введите feat/короткое-имя → переключиться. Stage изменений кнопкой +, Commit с сообщением. UI git checkout здесь делает то же, что git switch -c в shell.
Для CRM-бота я обычно именую ветку по handler или экрану: fix/bot-lead-handler, для лендинга - feat/hero-cta. Для WordPress child-темы - fix/contact-form-template. Scope в имени ветки напоминает, зачем открывали Agent.
Worktree: когда main вообще не трогать
Cursor умеет запускать агента в отдельном worktree - второй checkout того же репо в другой папке (worktrees). Main checkout остаётся на месте; после ревью - /apply-worktree, после отказа - /delete-worktree. Удобно, если вы параллельно правите hotfix в main и эксперимент с агентом в изоляции.
Типичный порядок для бизнес-репо:
| Тип проекта | Имя ветки (пример) | Что не трогать в этой задаче |
|---|---|---|
| Telegram-бот | fix/webhook-retry | deploy/, prod-токены |
| CRM на React | feat/kanban-filter | auth, billing |
| Лендинг Vite | feat/pricing-block | api/, .env* |
| WordPress тема | fix/header-menu | плагины, uploads |
Перед промптом проверяю: git branch --show-current не показывает main. Если показывает - стоп, сначала ветка. Агенту в rules можно явно написать: «работаем только в текущей feature-ветке, не merge в main без моего OK».
Git commit и git diff после каждого шага агента
Agent закончил прогон - не жму Accept All сразу. Сначала открываю Source Control или git diff в терминале. git diff показывает построчные изменения: что добавил агент, что удалил, не попали ли в diff .env или package.json без согласования. Только после просмотра - Accept по файлам или группам.
Маленький git commit после каждого зелёного verify лучше одного гигантского «агент сделал всё». История превращается в лестницу отката: три коммита по одной фиче проще откатить, чем один ком на сорок файлов. На разборе типичный сценарий: агент поменял двенадцать файлов, я принял восемь, четыре откатил через git restore - и только потом commit принятого.
Порядок, который держу сам и даю ученикам:
- 01
Agent завершил шаг - пауза перед Apply.
- 02
git diff --stat- ширина изменений в одну строку на файл. - 03
Пофайловый diff в UI или
git diff path/to/file. - 04
Accept только файлов из scope задачи.
- 05
npm run lintиnpm testиз вашего package.json - вручную, не по словам чата. - 06
git addточечно, неgit add -Aвслепую, если агент задел лишнее. - 07
git commit -m "feat: описание одного шага".
Перед Accept All полезен жёсткий smoke на секреты в diff:
git diff | grep -E '\.env|SECRET|TOKEN|password|api[_-]?key' \
&& echo "STOP: проверьте diff на секреты" && exit 1 || trueЭто грубый фильтр, не замена secret scanner, но на разборе ловит «временный ключ в config.ts». Полный чеклист ревью - в как проверять код от ИИ.
Таблица «когда коммитить»:
| Ситуация | Коммитить? | Почему |
|---|---|---|
| lint/test зелёные, diff в scope | да | точка отката |
| Агент добавил зависимость без OK | нет | сначала git restore package.json |
В diff есть .env | нет | ротация ключа, убрать из индекса |
| Часть правок ок, часть нет | частично | git add только нужные файлы |
| Verify упал | нет | промпт с логом ошибки, не commit хаоса |
Checkpoints в Agent - быстрый undo внутри сессии. git commit - постоянная история. Оба слоя полезны, но не взаимозаменяемы: checkpoint не спасёт после закрытия редактора, если вы не закоммитили принятое.
Если агент предлагает сам выполнить git commit через terminal - смотрю diff до выполнения. В rules можно запретить автокоммит без вашего подтверждения. Человек остаётся на этапе «что попало в историю».
.gitignore и секреты: что не отдавать агенту

Файл gitignore в корне репо говорит Git не отслеживать перечисленные пути - но только неотслеживаемые файлы (gitignore). Если .env уже попал в commit раньше, одна строка в ignore не вытащит его из истории. Нужен git rm --cached .env, ротация секрета и при утечке - чистка истории или смена ключей.
До первого коммита в новом репо я проверяю шаблон ignore:
.env
.env.*
.env.local
secrets/
*.pem
*.key
credentials.json
config.local.*
node_modules/
dist/
coverage/
.DS_StoreДублирую чувствительные пути в .cursorignore - тогда Agent, Tab и @ не подтянут файл в контекст (ignore-file). Важная оговорка из доки: .cursorignore не security boundary. Terminal и MCP теоретически могут прочитать игнорированный файл, если агент выполнит shell-команду. Нужны approvals на команды и не просить cat .env в задаче.
Что не отдавать агенту ни в чат, ни в rules, ни во вложения:
- значения
TELEGRAM_BOT_TOKEN,DATABASE_URL, API-ключи; - содержимое
credentials.json, приватные ключи; - production-дампы БД и логи с PII;
- сырые agent transcripts и trajectory, если там могли оказаться секреты из скрытых блоков reasoning.
В промпт - имена переменных, не значения. В репо - .env.example с пустыми или фейковыми строками. Если агент «для примера» вставил токен в src/config.ts - это не «временно», это утечка в diff.
Чеклист до первого Agent в новом репо:
- 01
.gitignoreи.cursorignoreсозданы доgit add. - 02
git statusне показывает.envв untracked, который вы собираетесь закоммитить. - 03
Нет tracked секретов - если есть,
git rm --cachedи ротация. - 04
В rules строка: не читать и не коммитить
.env*. - 05
GitHub push protection включена для public - страховка против push с ключами (push protection), не 100% защита.
- 06
Проверка
git diffперед каждым commit.
На разборе видел типичный сценарий: ученик вставил токен бота в промпт «чтобы заработало», потом запушил ветку. Откат - ротация ключа и удаление из истории, не «удали строку в Cursor». Профилактика дешевле лечения.
Если секрет уже в истории - ignore постфактум не спасает. План: отозвать ключ, git rm --cached, при публичном репо - BFG или support GitHub, новый ключ в vault, не в коде. Агенту не поручаю «почисти историю git» без вашего контроля - слишком легко снести лишнее.
Что ломается, если агент коммитит в main или без ветки

Работа в main без ветки превращает каждый прогон Agent в русскую рулетку для продакшена. Агент может закоммитить, запушить, смешать полуфабрикат с рабочим кодом - и вы узнаете об этом только после деплоя или падения тестов у клиента. Ниже не абстрактные советы, а пары симптом-причина-фикс с разборов.
| Симптом | Вероятная причина | Что сделать |
|---|---|---|
| Деплой с main сломал форму заявок | commit агента прямо в main | откат к последнему хорошему tag/commit; дальше только feature-ветки |
| В GitHub светится API-ключ | .env не был в ignore до add | ротация ключа; git rm --cached; не пушить снова до фикса |
| «Merge conflict» после Agent | агент сделал rebase/merge без вас | git merge --abort или git rebase --abort; вернуться на checkpoint commit |
| Десятки файлов вне scope | нет rule на max файлов | откат ветки; сузить промпт и globs в rules |
| Push rejected с secret | push protection сработала | убрать секрет из commit, rotate key; не disable protection «чтобы прошло» |
Прод на main перезаписан
Сценарий: сайт на Vite, вы работали в main «потому что один человек». Agent обновил роутинг, сломал сборку, закоммитил. Деплой с GitHub Actions ушёл на хостинг. Симптом - 404 на странице оплаты. Причина - прямой commit в main без preview и без verify. Фикс: git log на один-два коммита назад, git revert для плохого commit на shared main или git reset --hard только если main ещё не пушили. Дальше - жёсткое правило: main только через merge после review, локально агент только в ветке.
Если main уже на remote и другие тянут репо - не force-push без согласования. Revert создаёт обратный commit, история остаётся честной для команды.
Секреты попали в историю коммитов
Сценарий: агент прочитал .env через terminal, скопировал строку в config.ts «для теста», вы закоммитили вместе с фичей. Симптом - ключ в git log -p или сработал secret scanner. Причина - секрет был доступен агенту и не был в ignore до сессии; tracked-файл ignore не скрывает. Фикс: немедленная ротация ключа; удаление из рабочей копии; git rm --cached; для публичного репо - очистка истории. .gitignore после утечки - только профилактика на будущее.
Публичные логи агента - отдельный канал утечки: не выкладывайте trajectory, если в промпт попадали пароли. Даже если в чате их не видно, в скрытых блоках reasoning они могут остаться - проверьте, что не светите сырые логи.
Непонятный merge или rebase от Agent
Сценарий: агент «помог» с git, выполнил git pull --rebase, конфликты в пяти файлах, половина с маркерами <<<<<<<. Симптом - проект не собирается, статус «rebase in progress». Причина - автономный terminal без вашего контроля ветки. Фикс: git rebase --abort или git merge --abort, вернуться на commit «до агента»; запретить в rules произвольный rebase/merge; ветка изолирована от main до вашего merge вручную.
Если агент уже запушил испорченную ветку - не мержите PR. Удалите remote-ветку, локально пересоздайте от чистого main, повторите задачу с узким scope.
Как откатить изменения git и последний коммит
Когда Agent ушёл не туда, git откатить изменения можно на разных уровнях - от «не принял в UI» до «убрать commit из истории». Главное - на какой ветке вы стоите и пушили ли уже на shared remote.
Непринятые правки в рабочей копии
Если Agent предложил diff, но вы ещё не нажали Accept - отклоните в UI или закройте без сохранения. Если файлы уже изменены на диске, но не в commit:
git restore path/to/file.ts
# или все unstaged:
git restore .git restore откатывает рабочую копию к последнему commit (git-restore). Для staged, но не закоммиченных:
git restore --staged path/to/file.ts
git restore path/to/file.tsОткат последнего commit на своей ветке
Если агент закоммитил, но вы ещё не пушили - на локальной feature-ветке допустим git reset:
git log --oneline -3
git reset --hard HEAD~1HEAD~1 снимает один последний commit. Все изменения из него исчезнут из ветки - убедитесь, что там не было нужного вручную. Мягкий вариант - git reset --soft HEAD~1: commit исчезает, изменения остаются staged.
Как откатить коммит, который уже ушёл на GitHub и main общий с коллегой - через git revert <hash>, не через force-push. Revert создаёт новый commit, отменяющий плохой. Так безопаснее для shared main.
Сценарий «12 файлов, часть принял»
Типичный recovery с разбора: агент изменил двенадцать файлов, восемь полезны, четыре - мусор. Я смотрю git diff, Accept только нужные в UI, для остальных git restore . по путям или откат к commit «до агента» и ручной перенос хороших hunks. Занимает около пяти минут при дисциплине ветки - не часы на восстановление main.
Таблица отката:
| Цель | Команда / действие | Осторожно |
|---|---|---|
| Убрать правки в файле | git restore file | перезапишет локальные изменения |
| Unstage | git restore --staged file | commit ещё не тронут |
| Убрать последний локальный commit | git reset --hard HEAD~1 | только своя ветка, не pushed |
| Отменить pushed commit на main | git revert <hash> | не force-push на shared |
| Всё сломалось | git switch main; удалить ветку; начать заново | main должен быть чистым |
На shared main без согласования не делаю reset --hard и не force-push - только revert или откат через админа репо. Solo на своей ветке - reset допустим, пока не открыли PR.
Чек-лист безопасного старта с Git и Cursor
Ниже чеклист, который я прохожу сам перед сессией с Agent в клиентском репо. Не курс Git на двадцать часов - минимум, чтобы агент не превратил вечер в восстановление продакшена.
До открытия Agent:
- 01
git switch mainиgit pull- база актуальна. - 02
git checkout -b feat/задача-дня- не работать в main. - 03
Commit «checkpoint: before agent» на чистом дереве.
- 04
.gitignoreи.cursorignoreзакрывают.env*, ключи,node_modules. - 05
В rules или
AGENTS.md: scope путей, verify-команды, запрет автокоммита в main. - 06
Промпт сузить: задача + 1-3
@на entrypoint (как ставить задачи Cursor Agent).
Во время сессии:
- 01
Diff после каждого крупного шага - до Apply All.
- 02
lint/test вручную в терминале.
- 03
Маленькие commit только после зелёного verify.
- 04
Не вставлять секреты в чат и не публиковать сырые логи сессии.
После сессии:
- 01
Финальный
git diff main- ширина изменений ожидаема. - 02
Merge в main только локально или через PR после вашего review.
- 03
При Cloud Agent - draft PR и ревью человека (security).
Код-напоминание для терминала в одну строку после сессии:
git diff --stat && npm run lint && npm test && git statusЕсли что-то красное - не merge, не push. Сначала фикс или откат.
Когда репозиторий чужой и процесс под ключ - смотрю разработку проектов как отдельный трек; для своего вечернего цикла достаточно ветки и diff. По теме в блоге: первый проект в Cursor - вечер с нуля; как проверять код от ИИ - после diff; как ставить задачи агенту - узкий промпт.
Три возражения, которые слышу чаще всего:
| Возражение | Короткий ответ |
|---|---|
| «Агент всё равно сломает» | сломает ветку, не необратимо main; есть restore и reset |
| «Я не умею git» | три действия: ветка, commit, restore; diff смотрит человек |
| «Зачем ветка, я один» | песочница для эксперимента; worktree не трогает main |
Частые вопросы
Нужна ли git новая ветка перед каждым запуском Agent?
Да, если задача меняет код. Одна сессия агента - одна ветка с понятным именем вроде feat/задача. Так вы не смешиваете эксперимент с main и можете удалить ветку, если прогон неудачный. В Cursor можно создать ветку через Source Control или git checkout -b в терминале.
Как git откатить изменения после Agent, если уже нажал Accept?
Для незакоммиченных правок - git restore path/to/file или git restore . для всех unstaged. Если файлы уже в staged - git restore --staged, затем restore рабочей копии. Если был commit на своей ветке и вы не пушили - git reset --hard HEAD~1. На shared main без согласования - revert, не force-push.
Как откатить коммит, если агент сам закоммитил через terminal?
На локальной feature-ветке без push: git log --oneline, затем git reset --hard HEAD~1 или --soft, если нужно сохранить изменения staged. Если commit уже на GitHub и main общий - git revert <hash> создаёт обратный commit. Перед reset убедитесь, что не потеряете нужные ручные правки.
Нужен ли cursor git отдельно от обычного Git?
Нет отдельного движка. Cursor показывает тот же репозиторий в Source Control и даёт агенту terminal для git-команд. Безопасность - в вашем процессе: ветка, diff, commit, rules в репо. Cloud Agent добавляет draft PR и ревью человека, но локально это обычный git в папке проекта.
Что обязательно положить в gitignore до первого коммита?
Минимум: .env и .env., secrets/, .pem, *.key, credentials.json, node_modules, dist, coverage. Дублируйте те же пути в .cursorignore, чтобы Agent не тащил секреты в контекст. Если файл уже tracked, gitignore не поможет - нужен git rm --cached и ротация секрета.
Worktree в Cursor или обычная ветка - что выбрать?
Обычная ветка git checkout -b достаточна для большинства solo-задач. Worktree удобен, когда нужно параллельно держать чистый main и изолированный прогон агента в другой папке checkout. После ревью - apply-worktree, при отказе - delete-worktree. Main checkout при worktree не трогается до вашего Apply.
Можно ли доверять Agent, что он не закоммитит в main?
Не полагайтесь на обещания в чате. Зафиксируйте в rules: работа только в feature-ветке, запрет merge и push в main без вашего OK. Перед сессией проверьте git branch --show-current. Checkpoints в Agent не заменяют git-историю - ветка и commit до агента остаются базой.
Что делать, если секрет попал в commit из-за агента?
Сразу ротируйте ключ или токен - отзыв важнее красоты истории. Удалите секрет из рабочей копии, git rm --cached для tracked файла. На публичном репо - очистка истории или поддержка GitHub. Push protection может заблокировать push, но не отменяет утечку, если ключ уже светился локально или в логах.
Связанные страницы

Обсудить вашу задачу
Напишите в Telegram цель, что уже сделано и где стопор.
Отвечаю сам — без бота и «оставьте заявку».




