Как откатить изменения в Claude Code: /rewind, git и 5 способов в 2026
Claude сломал код - откатись за секунды. Внутри сессии выручает /rewind, до коммита git checkout, после деструктивного reset --hard спасает git reflog. Разбираем все уровни отката, что /rewind не ловит, и как правилом в CLAUDE.md запретить Claude ронять проект.
Claude Code сломал тебе код - и это чинится за секунды, если знать, каким инструментом откатывать. Внутри сессии выручает встроенная команда /rewind: мгновенный возврат файлов и диалога к нужной точке. Если правки уже вышли за пределы сессии, откатывает git checkout до последнего коммита. А если кто-то снёс работу деструктивной командой, последняя страховка - git reflog, в нём остаются хэши даже уничтоженных коммитов.
Три уровня, и каждый ловит свой класс аварий. /rewind не заменяет git, git не заменяет reflog. Знать только /rewind - значит остаться без защиты в первый же серьёзный косяк, когда Claude тронет не только файлы. Ниже разберём каждый уровень со своими командами и ограничениями, покажем реальную историю потери четырёх часов работы и настроим проект так, чтобы откатывать было почти нечего.
Откат в Claude Code работает на трёх уровнях: `/rewind` (мгновенный возврат внутри сессии), `git checkout` (отмена незакоммиченных правок), `git reflog` (спасение после `git reset --hard`). Каждый уровень покрывает свой тип ошибки и ничего за своими границами. `/rewind` видит только правки Claude через его тулы, а bash, миграции БД и push не ловит. Лучшая привычка: `git commit` на каждой вехе и одно правило в `CLAUDE.md`, которое запрещает Claude выполнять разрушающие git-команды.
отката: /rewind, git checkout, git reflog
на сессию хранит /rewind, до 30 дней
в меню отката, чаще берут Restore code and conversation
работы потерял разработчик из-за одной команды reset --hard
Что такое откат в Claude Code и почему трёх уровней мало
Откат тут устроен слоями, и это важно понять сразу, иначе будешь давить одну кнопку там, где нужна другая. Уровень первый - встроенный /rewind, возврат внутри текущей сессии. Уровень второй - git checkout, восстановление незакоммиченных правок средствами системы контроля версий. Уровень третий - git reflog, катастрофическая страховка на случай, если ветку переписали через git reset --hard.
Разберём на трёх типичных ситуациях, они хорошо показывают границы каждого уровня.
Возьмём эксперта, который включил /rewind в первую же неделю: Claude за пару промптов поломал auth-логику, человек откатился одним движением и пошёл дальше. Через месяц другая история - писал миграцию схемы, закоммитил, переключил ветку и понял, что забыл шаг. Тут /rewind уже бессилен, сессия другая. Спас git checkout на предыдущий коммит. Ещё через месяц он случайно дал агенту команду «откати всё к последнему пушу», агент выполнил git reset --hard и снёс три часа работы. Вытащил только git reflog, в нём остались хэши уничтоженных коммитов.
Три ситуации - три уровня защиты. Работают по-разному, ловят разные ошибки, и нужны все три.
Снимки для `/rewind` инкрементальные: Claude запоминает разницу между состояниями файлов, а не файл целиком. По умолчанию хранится до 100 снимков на сессию до 30 дней. В большинстве реальных проектов это значит полную историю правок Claude за весь рабочий день.
Вот три уровня одной таблицей: что покрывает каждый и чего не умеет.
| Уровень | Команда | Покрывает | НЕ покрывает |
|---|---|---|---|
| 1. Внутри сессии | /rewind или Esc Esc | Файлы, изменённые Claude через свои тулы; историю диалога | Bash-команды, внешние редакторы, миграции БД |
| 2. До коммита | git checkout . или git stash | Все незакоммиченные правки в файлах | Закоммиченные коммиты |
| 3. Катастрофа | git reflog + git reset --hard <hash> | Коммиты, снесённые reset —hard или force-push | Деструктивные bash-команды (rm, миграции БД) |
Дальше по каждому уровню отдельно: что именно делать, где подводные камни и как настроить проект, чтобы откатываться было нечего, потому что ничего не сломалось.
Как вызвать /rewind в Claude Code: команда или Esc Esc
Открыть меню отката можно двумя способами. Первый - напечатать /rewind в поле ввода. Второй - дважды нажать Esc, когда поле пустое. Если в поле уже есть текст, первое двойное Esc сначала очистит его и сохранит в историю, а меню откроет только повторное двойное нажатие. У команды /rewind есть алиас /checkpoint, он ведёт туда же.
Работает это потому, что после каждого своего ответа Claude автоматически делает снимок всех файлов, которые редактировал в этой сессии. Снимки лежат в ~/.claude/file-history/{sessionId}/ и держатся до 30 дней. Ты в любой момент можешь отмотать на любую точку своего рабочего дня.
Чтобы открыть меню, нажми Esc дважды при пустом поле. Появляется список сообщений с количеством изменённых файлов у каждого:
[поле ввода пустое]
> _
[нажми Esc, Esc]
Rewind to which message?
1. Сделай миграцию для User-таблицы (3 файла изменены)
2. Добавь поле lastLoginAt (1 файл изменён)
3. Перепиши логику авторизации (5 файлов изменены)
...
Момент про непустое поле полезен на практике: ты уже начал печатать новый промпт и вдруг понял, что надо откатиться. Жмёшь Esc Esc, текст улетает в историю ввода, повторное Esc Esc открывает меню. После отката вернёшь набранное стрелкой вверх. Так это описано в официальной документации Anthropic.
Если в поле prompt есть текст, двойной Esc сначала очистит его, а не откроет меню. Очищенный текст сохраняется в истории ввода, поэтому после меню отката его можно вернуть стрелкой вверх.
- Anthropic Docs, Checkpointing
Какой способ удобнее - дело привычки. Печатать /rewind нагляднее, если ты забыл про хоткей. Esc Esc быстрее, руки не уходят с клавиатуры.
Какие 6 режимов есть в Rewind-меню и какой выбрать
Выбрал точку отката - открывается второе меню, уже с шестью режимами. Три отвечают за восстановление состояния, два за сжатие истории, один просто закрывает меню. Самый частый режим - Restore code and conversation, вернуть и файлы, и диалог. Его и берёшь в девяти случаях из десяти.
Полная таблица, что делает каждый режим и когда он твой:
| Режим | Что делает | Когда выбирать |
|---|---|---|
Restore code and conversation | Возвращает и файлы, и историю диалога к выбранной точке | Самый частый сценарий: Claude пошёл не туда, хочешь начать заново с правильной формулировкой |
Restore conversation | Откатывает только диалог, файлы остаются как сейчас | Код хороший, но беседа уехала в сторону; переформулируешь с этой точки, а текущие правки сохранишь |
Restore code | Откатывает файлы, беседа остаётся как есть | Часть правок Claude была лишней, но контекст разговора ещё нужен (например, договорились о следующих шагах) |
Summarize from here | Сжимает в сводку всё ПОСЛЕ выбранной точки, файлы не трогает | Долгая отладка съела контекст, надо освободить место, но начальные инструкции оставить целиком |
Summarize up to here | Сжимает в сводку всё ДО выбранной точки, файлы не трогает | Был длинный стартовый брифинг, потом конкретная задача: брифинг сжимаешь в одно сообщение, недавнюю работу оставляешь |
Never mind | Закрывает меню без изменений | Передумал |
Режим Summarize up to here появился в Claude Code v2.1.139-v2.1.142, релиз пришёлся на 11-15 мая 2026, двадцатую неделю года.
Через меню отката можно сжать ранний контекст пунктом Summarize up to here.
- Anthropic What's new, Changelog
Разница между Restore и Summarize принципиальная, её стоит держать в голове. Restore возвращает состояние, то есть отменяет всё, что случилось после выбранной точки. Summarize ничего не отменяет, он только сжимает: оригинальные сообщения остаются в транскрипте сессии для справки, но в активном контексте живёт лишь сводка. Restore бери, когда хочешь «как будто этого вообще не было». Summarize - когда нужно «оставить, но не занимать место в контексте».
После `Restore conversation` или `Summarize from here` исходный текст выбранного промпта возвращается в поле ввода - можешь поправить формулировку и отправить заново. После `Summarize up to here` поле пустое, и ты остаёшься в конце разговора. Мелочь, но экономит время: не надо перепечатывать промпт, который почти подошёл.
Если хочешь глубже разобраться, как режимы отката вписаны в общую иерархию управления Claude Code, посмотри разбор 7 уровней Claude Code.
Какие изменения /rewind не откатывает
Это главная ловушка, на которую натыкаются почти все. /rewind отслеживает только правки, сделанные Claude через его собственные тулы редактирования файлов. Всё остальное он не видит и вернуть не может. Три класса невидимых изменений: bash-команды (rm, mv, cp), внешние правки (твоя ручная правка в IDE, правки от других сессий) и операции за пределами файлов (миграции БД, push в git, удалённые вызовы API).
Выглядит это коварно: /rewind показывает зелёную галочку и рапортует «откат успешен», а проект всё равно сломан, потому что Claude трогал не только файлы. Разберём три случая по очереди.
Что /rewind вернёт
- файлы, которые Claude правил своими тулами редактирования
- историю диалога к выбранной точке
- состояние в пределах текущей сессии, до 30 дней назад
Что /rewind НЕ вернёт
- bash-команды Claude: rm, mv, cp
- твои ручные правки в IDE и правки от других сессий
- миграции БД, git push, удалённые вызовы API
1. Bash-команды не отслеживаются. Если Claude в своём ходе выполнил rm file.txt или mv old.txt new.txt, эти изменения в снимок не попадут. Документация Anthropic говорит об этом прямым текстом.
Контрольные точки не отслеживают файлы, изменённые через bash-команды. Например, если Claude Code запустит rm file.txt, mv old.txt new.txt, cp source.txt dest.txt - эти изменения файлов через откат вернуть нельзя.
- Anthropic Docs, Checkpointing
То есть если Claude по своей инициативе через bash-тул удалил, переместил или скопировал файл, /rewind назад всё не откатит. Спасёт git checkout или восстановление из бэкапа, но это уже не нажатие двух кнопок.
2. Внешние правки не ловятся. Открыл файл руками в VS Code и что-то поправил, или вторая сессия Claude параллельно меняла те же файлы - первая сессия этих изменений не видит. Снимок сделан на момент завершения хода Claude в текущей сессии. Что произошло между ходами, снаружи его зоны ответственности.
3. Операции вне файлов не охватываются совсем. Миграция Prisma через npx prisma migrate dev изменила схему базы - /rewind её не откатит, потому что база живёт за пределами файловой системы проекта. Force-push в origin/main - та же история: коммит уехал на удалённый сервер, контрольная точка его не вернёт. Удалённый вызов API, который списал деньги или удалил запись, откатывается только средствами самого API.
Правило, которое бережёт нервы: если задача затрагивает что-то за пределами файлов проекта - миграции БД, `git push`, удалённые API - готовь отдельную стратегию отката под каждый внешний эффект. `/rewind` это только локальная история файлов текущей сессии. Он честно говорит «готово», но за границы файлов не отвечает, и проект после его галочки бывает всё ещё сломан.
/rewind vs git: чем отличаются и зачем нужны оба
/rewind - это локальный откат внутри одной сессии Claude Code. Хранит снимки до 30 дней, до 100 на сессию, инкрементально. Git - долгосрочная история всего проекта: коммиты, ветки, merge-конфликты, удалённый репозиторий, общий для команды. Один не заменяет другой. Практика простая: делаешь git commit на каждой логической вехе, а между коммитами полагаешься на /rewind.
В документации Anthropic эта связка зафиксирована прямо.
Контрольные точки сделаны для быстрого восстановления на уровне сессии. Для коммитов, веток и долгой истории продолжай пользоваться системой контроля версий (например, Git). Они дополняют, но не заменяют нормальный version control. Думай о контрольных точках как о local undo, а о Git как о permanent history.
- Anthropic Docs, Checkpointing
Различия удобнее смотреть в таблице:
| Параметр | /rewind | git |
|---|---|---|
| Гранулярность | На каждый ход в диалоге | На каждый коммит |
| Хранение | До 30 дней, до 100 на сессию, локально в ~/.claude/file-history/ | Постоянно, в .git/ репозитория и на удалённом сервере |
| Что отслеживает | Правки Claude через свои тулы | Все закоммиченные изменения |
| Что НЕ отслеживает | Bash, внешние правки, миграции, push | Незакоммиченные изменения |
| Команда | Команда внутри Claude | Внешняя система контроля версий |
| Откатывает беседу | Да | Нет |
| Работает между сессиями | Только в той же сессии | Везде |
Связка на практике такая. Каждый раз, когда дошёл до состояния «вот это уже работает, терять не хочу», делаешь git commit. Между коммитами полагаешься на /rewind: он мгновенный, не требует писать сообщение, не засоряет git-историю промежуточными состояниями. Работа закончена - коммит, желательно осмысленный и атомарный.
Откат - это частный случай контекст-инжиниринга. Когда ты управляешь контекстом сессии (когда коммитить, когда жать /rewind, какие правила в CLAUDE.md), Claude становится предсказуемым и перестаёт ронять проект. Сам по себе навык узкий: уметь вернуть состояние, когда оно сломалось. Но в связке с планированием и правилами проекта он даёт стабильную работу вместо ежедневной борьбы с галлюцинациями.
Откат - лишь один кирпич из системы, которая делает Claude предсказуемым. Пройди мини-курс «Claude за вечер»: от установки до первых результатов на твоих задачах, чтобы собрать вокруг Claude рабочий процесс, где откатывать почти не приходится.
Пройти мини-курс →Как разработчик потерял 4 часа из-за git reset —hard
Показательная история, задокументированная в трекере Claude Code. 9 января 2026 разработчик Jeff Kelling попросил Claude Code «сохранить текущее состояние и откатиться к последнему пушу». Claude сделал git stash (правильно), а следом git reset --hard 35eb731 (деструктивно). Около четырёх часов работы исчезли. Три урока из этого: «откатить» в естественном языке означает «посмотреть историю», а не «уничтожить её»; Claude по умолчанию должен предлагать git checkout, а не reset --hard; защита ставится в CLAUDE.md.
Случай зафиксирован в GitHub Issue #17190 репозитория anthropics/claude-code, закрыт как дубликат, но описан подробно. Версия Claude Sonnet 4.5, формулировка пользователя была такой:
Хочу сохранить, где мы сейчас, и ОТКАТИТЬСЯ к последнему push.
- Jeff Kelling, GitHub Issue #17190
Claude выполнил последовательно две команды:
git stash save "WIP: Tracker enter/leave disabled + fsSyncModule fix" # сохранил незакоммиченные правки
git reset --hard 35eb731 # уничтожил коммиты d63695e..882e618
Первая команда правильная, она спрятала незакоммиченные изменения в stash. Вторая деструктивная: переписала ветку на коммит 35eb731, и все коммиты между ним и 882e618 стали orphaned, сиротами. По умолчанию такие коммиты живут в .git/objects/ до запуска git gc, который обычно срабатывает автоматически в течение двух недель. Но если в этот момент ты не знаешь, что делать, время работает против тебя.
Главный урок сам пострадавший сформулировал в комментарии к issue:
НИКОГДА не используй git reset —hard, пока я явно не произнесу именно эти слова.
- Jeff Kelling, GitHub Issue #17190
Логика тут прямая. В живой речи «roll back», «go back», «restore», «revert», «undo» значат «посмотреть назад» или «вернуться в безопасное место». Они не про уничтожение истории. А git reset --hard именно уничтожает: переписывает ветку и убирает коммиты из достижимых через HEAD. Безопасная альтернатива - git checkout <commit>, она создаёт detached HEAD и даёт посмотреть старое состояние, не трогая ветки.
Практический вывод один: перед любой ёмкой задачей, особенно перед рефакторингом нескольких файлов, делай git commit текущего состояния. Один коммит превращает любой косяк Claude в одну команду git checkout . без потери работы.
Как git reflog спасает после деструктивного reset
git reflog показывает локальную историю всех движений HEAD в репозитории, включая те коммиты, которые снесли через git reset --hard или force-push. Каждое движение хранится 90 дней по умолчанию. Если Claude (или ты сам, или коллега) уничтожил коммиты деструктивной командой, git reflog покажет их хэши, и ты восстановишь ветку через git reset --hard <reflog-hash>.
История из прошлого раздела закончилась бы хорошо, запусти Jeff git reflog сразу:
git reflog
Вывод выглядит примерно так:
35eb731 HEAD@{0}: reset: moving to 35eb731
882e618 HEAD@{1}: commit: middleware refactoring complete
d63695e HEAD@{2}: commit: leaveRemove method finalized
1f9c8a3 HEAD@{3}: commit: tracker enter/leave disabled
35eb731 HEAD@{4}: pull origin main
Строки HEAD@{1} - HEAD@{3} и есть те самые «уничтоженные» коммиты. Из локального хранилища объектов git они никуда не делись, просто стали недоступны через ветку. Чтобы вернуть:
# Создать ветку из последнего «уничтоженного» коммита
git branch recovered-work 882e618
# Или переключиться напрямую
git reset --hard 882e618
После этого ветка снова содержит всю историю до катастрофы.
У reflog есть ограничения, про которые стоит знать заранее:
- Только локально. Reflog лежит в
.git/logs/HEAD, на удалённом репозитории его нет. Сделал force-push и потом удалил локальную копию репо - reflog ушёл вместе с папкой. - 90 дней по умолчанию. Старше -
git gcможет их вычистить. Настраивается черезgit config gc.reflogExpire 200.days.ago. - Не покрывает то, чего никогда не было в HEAD. Если коммит был только в stash и stash уничтожили, reflog покажет лишь последнее состояние stash, а не его внутреннюю историю.
Никогда не запускай `git gc --aggressive` сразу после катастрофы. Сначала разберись через reflog, восстанови ветку, и только потом всё остальное. И не удаляй локальный клон репозитория, пока не уверен, что всё нужное запушено, - вместе с папкой уйдёт единственный шанс на восстановление.
Как защитить проект от разрушающих git-команд через CLAUDE.md
В CLAUDE.md твоего проекта добавляешь блок с инструкцией: какие git-команды Claude может выполнять сам, какие требуют явного подтверждения, какие запрещены без точной фразы. Claude уважает CLAUDE.md как системный промпт проекта и по умолчанию этим правилам следует. Один такой блок превращает опасный промпт «откати всё» в две безопасных команды с вопросом к тебе.
Корень проблемы из issue #17190 в том, что у Claude по умолчанию нет защитного контекста. Он трактует «roll back» как git reset --hard, потому что технически это валидный способ. Защиту мы переносим в CLAUDE.md, файл с системным промптом проекта.
Минимальное правило, вставляешь в свой CLAUDE.md:
## Git Safety Protocol - NEVER run destructive git commands (push --force, reset --hard, checkout ., restore ., clean -f, branch -D) unless I explicitly request these actions. Taking unauthorized destructive actions is unhelpful and can result in lost work. - When I say "roll back", "go back", "restore", "revert", "undo" - interpret as REVIEW commands: use `git log`, `git diff`, `git checkout <commit>` (creates detached HEAD), or `git stash` (preserves changes). - ALWAYS ask for confirmation before ANY command that: - Changes HEAD position to a different commit on a branch - Modifies commit history - Could lose uncommitted work - Includes flags --hard, --force, --aggressive - Before any destructive command, output a numbered comparison: - SAFE: use `git checkout <commit>` to view temporarily - DESTRUCTIVE: use `git reset --hard` to permanently destroy - Wait for my explicit choice before executing.
Расширенное правило для командной работы, добавляешь в CLAUDE.md корня репозитория:
## Git Workflow Rules - Commit на каждой логической вехе. Если задача длиннее 30 минут и ты ещё не коммитил - сначала `git add . && git commit -m "wip: [что сделано]"`, потом следующий шаг. - Никогда `git add .` или `git add -A` для коммитов от Claude. Только конкретные файлы по имени, после `git status` и `git diff`. - Перед `git push --force` в main - стоп, спроси меня. В feature-ветках force-push с осторожностью, только если уверен, что я готов потерять предыдущую версию. - При merge-конфликтах никогда не выбирай "ours" или "theirs" сразу - сначала покажи мне обе версии, потом я решу. - `.gitignore` обязан содержать `.env*`, `.claude/personal/`, `node_modules/`, `dist/`. Если их нет - добавь.
После этих блоков следующая фраза «откати к последнему пушу» приведёт уже к другому ответу Claude:
Вижу 3 незакоммиченных файла и 4 коммита впереди последнего пуша. Два варианта. SAFE: создать ветку view-last-push через git checkout последнего пуш-хэша, сохраню всю работу и временно покажу состояние пуша. DESTRUCTIVE: git reset —hard на этот хэш, уничтожу 4 коммита и незакоммиченные правки навсегда, восстановить можно будет только через git reflog в течение 90 дней. Что выбираешь?
Полминуты диалога вместо четырёх часов потерянной работы. Про то, как CLAUDE.md вообще устроен и что ещё в него зашивают, есть отдельный разбор про каркас проекта для вайб-кодинга.
Какие 5 способов отката есть в Claude Code и как выбрать нужный
Когда что-то пошло не так, у тебя пять уровней отчаяния: /rewind (внутри сессии), git checkout . (незакоммиченные правки), git checkout <commit> (вернуться на старый коммит без потери истории), git reset --hard <commit> (вернуть ветку, потеряв коммиты впереди), git reflog с восстановлением (катастрофа, всё пропало). Каждый следующий уровень тяжелее и опаснее предыдущего.
Сценарий «Claude сломал, надо срочно вернуть» проходят снизу вверх по этой лестнице. Начинай всегда с первого уровня.
Уровень 1. /rewind - мгновенный откат внутри сессии. Жми Esc Esc или печатай /rewind. Выбирай точку до момента слома, выбирай режим (обычно Restore code and conversation). Через секунду ты в прошлом и можешь начать заново. Закрывает 80% случаев «Claude сделал не то».
Уровень 2. git checkout . - отмена всех незакоммиченных правок.
git diff # сначала посмотри, что вообще изменилось
git checkout . # отменить все незакоммиченные правки во всех файлах
# или избирательно:
git checkout -- path/to/file.ts # только один файл
Полезно, когда /rewind не сработал (Claude трогал файлы через bash) или когда нужна отмена в обход истории сессии. Все незакоммиченные изменения исчезнут безвозвратно. Жалко - сначала git stash.
Уровень 2.5. git stash - сохранить правки на полку.
git stash save "может, ещё понадобится"
# вернуться к чистому состоянию, поработать
# передумал - вернуть из stash:
git stash pop
Компромисс между «потерять навсегда» и «оставить как есть». Stash живёт локально до явной чистки.
Уровень 3. git checkout <commit> - вернуться на старый коммит без потери истории.
git log --oneline # найди хэш нужного коммита, например abc1234
git checkout abc1234 # detached HEAD - смотришь, ничего не меняешь
# понравилось состояние - создай ветку из него:
git checkout -b recovery abc1234
# вернуться обратно:
git checkout main
Безопасный «временный возврат». Detached HEAD не меняет ветку, текущая работа в main остаётся целой. Хочешь поработать с этим состоянием - делай ветку.
Уровень 4. git reset --hard <commit> - вернуть ветку на точку. Деструктивно, коммиты впереди указанного хэша станут orphaned.
git reflog # запомни хэш текущего состояния
git reset --hard abc1234 # переписать ветку
# обнаружил ошибку - вернись через reflog:
git reset --hard HEAD@{1} # туда, где был до reset
Используй только если уверен, что коммиты впереди тебе не нужны. И всегда смотри git reflog ДО reset, чтобы знать, куда возвращаться, если передумаешь.
Уровень 5. git reflog с восстановлением - катастрофический сценарий. Кто-то уже снёс работу через git reset --hard или force-push.
git reflog # ищи последний хэш до катастрофы
git branch recovered HEAD@{N} # создай ветку оттуда
git checkout recovered # переключись
git diff main # сверь с текущим состоянием
git checkout main && git merge recovered # вернуть в main, если уверен
Если reflog уже почистился (90 дней по умолчанию), последний шанс - git fsck --lost-found, он покажет «болтающиеся» коммиты в .git/objects/. Почти археология, но иногда выручает.
Таблица выбора уровня, чтобы не думать в панике:
| Что произошло | Уровень |
|---|---|
| Claude переписал 3 файла не туда | 1. /rewind |
| Попробовал, не нравится, сессия не помогает | 2. git checkout . |
| Сломал руками, жаль терять, может верну | 2.5. git stash |
| Закоммитил, надо вернуть на коммит назад | 3. git checkout <commit> |
| Уверен, что коммиты впереди не нужны | 4. git reset --hard |
| Уже снёс деструктивной командой | 5. git reflog |
Как защитить проект, чтобы откатывать было нечего
Лучший откат - тот, который не понадобился. Три базовых правила защиты: коммит каждые 30 минут даже на черновом коде; .gitignore с обязательными строками для .claude/personal/ и .env*; крупные эксперименты в отдельной ветке через git checkout -b. С такой настройкой даже катастрофическая ошибка Claude обойдётся максимум в полчаса потерянной работы.
Правило 1. Коммит каждые 30 минут. Не жди «когда задача готова». Любой промежуточный шаг, который работает, коммитится. Сообщения могут быть любыми, главное - чтобы ты (или Claude) мог откатиться на рабочее состояние одним git checkout.
# в начале задачи
git status # проверь, что нет лишнего
git add .
git commit -m "wip: начинаю миграцию схемы User"
# через 30 минут или после первой рабочей итерации
git add .
git commit -m "wip: User-схема готова, миграция применена локально"
# в конце задачи - осмысленный коммит
git reset --soft HEAD~2 # объединить wip-коммиты в один
git commit -m "feat(auth): добавлено поле lastLoginAt в User-таблицу"
Это можно даже автоматизировать хуком Claude Code: в .claude/settings.json добавляешь PostToolUse-хук, который раз в N минут делает авто-коммит.
Правило 2. .gitignore минимум. В корне проекта обязательны строки:
# секреты
.env
.env.local
.env.*.local
# локальные настройки Claude Code (не пушим в командный репозиторий)
.claude/personal/
.claude/sessions/
.claude/file-history/
# зависимости и сборка
node_modules/
dist/
.next/
build/
Папку .claude/personal/ держишь для своих экспериментов и заметок, которым не место в общем репо. .claude/sessions/ и .claude/file-history/ - локальное хранилище Claude Code, оно много весит и привязано к конкретной машине, в репозитории ему делать нечего.
Правило 3. Эксперименты в отдельной ветке. Задача большая (рефакторинг на 10+ файлов, миграция на новую базу, переписывание модуля) - не делай её в основной ветке.
git checkout -b experiment/auth-rewrite
# работаешь, коммитишь каждые 30 минут
# получилось:
git checkout main
git merge experiment/auth-rewrite
# не получилось:
git checkout main
git branch -D experiment/auth-rewrite # удалить ветку
# основная ветка целая
Эта привычка превращает «Claude разнёс проект» в «Claude разнёс одну ветку, я её удалил, начинаем заново».
Правило про запас: перед опасными операциями ставь тег. Перед миграцией БД, массовым рефакторингом или обновлением зависимостей - `git tag pre-prisma-migration-v2`. Тег это именованный указатель на коммит, который переживёт даже чистку reflog. Что-то пошло не так - `git reset --hard pre-prisma-migration-v2` или просто `git checkout` на тег, чтобы посмотреть.
Куда откат встроен: план, правила и память проекта
Откат - не отдельный трюк, а часть управления контекстом сессии Claude Code. Когда ты знаешь, когда жать /rewind, когда git commit, когда git stash, ты управляешь целым потоком работы, а не одной командой. И тогда откатываться приходится редко, потому что рядом стоят ещё четыре рубежа защиты.
Первый рубеж - Plan Mode. Он не даёт сразу писать код: сначала план, потом твоё подтверждение, потом исполнение. Это превентивный откат, ты просто не пишешь то, что придётся откатывать, потому что план просмотрен заранее.
Второй - CLAUDE.md с правилами, которые Claude уважает по умолчанию, включая тот самый Git Safety Protocol. Превентивная защита от деструктивных команд.
Третий - память проекта между сессиями: Claude знает твой код, твою бизнес-логику, прежние договорённости. Чем больше памяти, тем меньше шансов, что он сделает не то.
Четвёртый - скиллы и субагенты, твоя методология в коде. Если в скилл зашит правильный git-workflow, ни один субагент не выполнит git reset --hard без подтверждения.
Формула безопасного отката: Plan Mode (не пишем лишнего) + `CLAUDE.md` с git-правилами (не разрешаем деструктив) + память проекта (Claude понимает контекст) + `git commit` на каждой вехе. Когда эти четыре настроены, откат становится редким и быстрым. Когда нет - превращается в ежедневный ритуал.
Если ты только начинаешь и хочешь поставить всё это с чистого листа, разбор Claude Code с нуля из России проведёт от установки до первого рабочего проекта.
Чек-лист: что у тебя теперь есть
- Понимание трёх уровней отката:
/rewindвнутри сессии,git checkoutдо коммита,git reflogпосле катастрофы - Умение вызвать меню отката двумя способами (
/rewindиEsc Esc) и выбрать один из шести режимов - Ясность, что
/rewindне ловит: bash-команды, внешние правки, миграции БД, push - Готовый рецепт восстановления коммитов после
git reset --hardчерезgit reflog - Блок Git Safety Protocol для
CLAUDE.md, который запрещает Claude деструктивные команды без твоей явной фразы - Таблица выбора уровня отката под любую аварию
- Четыре правила защиты, чтобы откатывать было почти нечего: коммит каждые 30 минут,
.gitignore, ветки под эксперименты, теги перед опасными операциями
Рассылка
Подпишись на еженедельную рассылку
Полезные материалы и скиллы, которые усилят твою работу с нейросетями и помогут больше зарабатывать. Раз в неделю, без воды и спама.
человек уже подписались
Готово! Ты в списке.
Первое письмо придёт в ближайшую рассылку. Отписка в один клик.
Частые вопросы
Как быстро откатить изменения в Claude Code?
Нажми Esc дважды при пустом поле ввода или напечатай /rewind. Откроется меню контрольных точек. Выбери сообщение до момента слома, режим Restore code and conversation - и файлы с диалогом вернутся к тому состоянию. Это мгновенно, ничего в терминал вбивать не нужно. Покрывает почти все случаи, когда Claude пошёл не туда.
Какие изменения /rewind не откатывает?
Только то, что Claude правил своими тулами редактирования файлов. Bash-команды (rm, mv, cp), твои ручные правки в IDE, правки от параллельных сессий, миграции базы данных, git push, удалённые вызовы API - всё это /rewind не видит и не вернёт. По документации Anthropic контрольные точки не отслеживают файлы, изменённые через bash. Для такого нужен git или отдельная стратегия отката.
Чем /rewind отличается от git?
/rewind - это локальный откат внутри одной сессии Claude Code: снимки хранятся до 30 дней, до 100 на сессию, умеет вернуть и код, и диалог. Git - долгосрочная история проекта с коммитами, ветками и удалённым репозиторием, общая для команды. Одно не заменяет другое. Практика: git commit на каждой рабочей вехе, между коммитами полагаешься на /rewind.
Как восстановить коммиты после git reset --hard?
Запусти git reflog - он показывает все движения HEAD, включая коммиты, снесённые деструктивной командой. Найди хэш последнего состояния до катастрофы и восстанови ветку: git branch recovered <hash> или git reset --hard <hash>. Reflog хранит записи 90 дней по умолчанию. Работает только локально, на удалённом репозитории reflog нет.
Как запретить Claude выполнять git reset --hard?
Добавь в CLAUDE.md блок Git Safety Protocol: запрет на деструктивные команды (reset --hard, push --force, clean -f) без твоей явной фразы, и правило трактовать слова откатись, верни, отмени как команды просмотра (git log, git diff, git checkout). Claude уважает CLAUDE.md как системный промпт проекта и по умолчанию следует этим правилам.