[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"question-git-chto-takoe-git-reset-git-revert-i-git-checkout-v-chyom-raznitsa":3},{"id":4,"slug":5,"topicId":6,"topicSlug":7,"topicName":8,"topicEmoji":9,"question":10,"answer":11,"codeLang":12,"codeSrc":12,"important":12,"commonMistakes":12,"modernUsage":12,"difficulty":13,"tags":14,"related":17,"progress":18,"seo":19},1334,"chto-takoe-git-reset-git-revert-i-git-checkout-v-chyom-raznitsa",44,"git","Git","📦","Что такое git reset, git revert и git checkout? В чём разница?","git reset, git revert и git checkout — три команды для отмены изменений, работающие на разных уровнях: reset перемещает указатель ветки, revert создаёт коммит-отмену, checkout\u002Frestore восстанавливает файлы.\n\n### git reset\n\nПеремещает указатель HEAD (и ветки) на другой коммит. Изменяет историю.\n\n```bash\n# --soft: перемещает HEAD, изменения остаются в staging area (index)\ngit reset --soft HEAD~1\n\n# --mixed (по умолчанию): перемещает HEAD, сбрасывает index, рабочая директория не меняется\ngit reset --mixed HEAD~1\ngit reset HEAD~1          # то же самое\n\n# --hard: перемещает HEAD, сбрасывает index и рабочую директорию\ngit reset --hard HEAD~1\n# ОПАСНО: все незакоммиченные изменения ПОТЕРЯНЫ\n\n# Сбросить конкретный файл из staging area\ngit reset HEAD src\u002FMain.java\n```\n\n| Режим | HEAD | Index (staging) | Рабочая директория |\n|---|---|---|---|\n| `--soft` | Перемещается | Не меняется | Не меняется |\n| `--mixed` | Перемещается | Сбрасывается | Не меняется |\n| `--hard` | Перемещается | Сбрасывается | Сбрасывается |\n\n### git revert\n\nСоздаёт новый коммит, который отменяет изменения указанного коммита. Не изменяет историю — безопасен для shared-веток.\n\n```bash\n# Отменить последний коммит\ngit revert HEAD\n\n# Отменить конкретный коммит\ngit revert a1b2c3d\n\n# Отменить без автоматического коммита\ngit revert --no-commit a1b2c3d\n\n# Отменить merge-коммит (нужно указать, какого родителя сохранить)\ngit revert -m 1 \u003Cmerge-commit-hash>\n```\n\n```\nДо: C1 -- C2 -- C3\nПосле git revert C2:\n     C1 -- C2 -- C3 -- C2'  (C2' отменяет изменения C2)\n```\n\n### git checkout \u002F git restore (для файлов)\n\nВосстанавливает файлы из указанного коммита или ветки. В новых версиях Git для этого рекомендуется `git restore`.\n\n```bash\n# Отменить изменения в файле (вернуть к последнему коммиту)\ngit checkout -- src\u002FMain.java\n# Современный аналог:\ngit restore src\u002FMain.java\n\n# Восстановить файл из конкретного коммита\ngit checkout a1b2c3d -- src\u002FMain.java\n# Современный аналог:\ngit restore --source=a1b2c3d src\u002FMain.java\n\n# Убрать файл из staging area\ngit restore --staged src\u002FMain.java\n```\n\n### Когда что использовать\n\n| Сценарий | Команда | Безопасно для shared? |\n|---|---|---|\n| Отменить локальный коммит, сохранив изменения | `git reset --soft HEAD~1` | Нет |\n| Полностью стереть последний коммит и изменения | `git reset --hard HEAD~1` | Нет |\n| Отменить коммит в shared\u002Fpublic ветке | `git revert \u003Chash>` | Да |\n| Откатить файл к состоянию из коммита | `git restore --source=\u003Chash> file` | Да |\n| Убрать файл из staging area | `git restore --staged file` | Да |\n\n### Ключевые моменты\n\n- `reset` изменяет историю — безопасен только для локальных (не запушенных) коммитов\n- `revert` не изменяет историю — безопасен для shared-веток, создаёт новый коммит-отмену\n- `reset --hard` — деструктивная операция, незакоммиченные изменения будут потеряны безвозвратно\n- `git restore` (Git 2.23+) — рекомендуемая замена `git checkout` для операций с файлами\n\n### Частые ошибки\n\n- Использовать `reset --hard` на запушенных коммитах — другие разработчики потеряют синхронизацию\n- Путать `reset` и `revert` — reset переписывает историю, revert — нет\n- Забывать, что `reset --hard` уничтожает незакоммиченные изменения (используйте `git stash` перед этим)\n- Не знать про `git reflog` — позволяет восстановить потерянные коммиты после `reset --hard`\n\n### Как используется в 2026\n\n- `git restore` и `git switch` полностью заменили `git checkout` в ежедневной работе\n- IDE предоставляют удобный интерфейс для всех видов отмены (revert commit, rollback changes)\n- `git reflog` остаётся «страховочной сетью» — хранит историю перемещений HEAD в течение 90 дней\n- Защита веток (branch protection) не позволяет делать force push и тем самым предотвращает злоупотребление `reset`\n\n> **На собеседовании:** это вопрос-ловушка — многие путают три команды. Ключевое разделение: reset меняет историю (только для локальных коммитов), revert создаёт коммит-отмену (безопасен для shared), restore\u002Fcheckout восстанавливает файлы. Нарисуйте таблицу режимов reset (--soft, --mixed, --hard) — это впечатляет.","","middle",[7,15,16],"branching","commands",[],null,{"title":20,"description":21,"ogTitle":22,"ogDescription":23,"keywords":24,"schemaAnswer":34,"featuredSnippetReady":35},"Что такое git reset, git revert и git checkout? В чём разница — Gymterview","Сравнение git reset, revert и checkout: reset перемещает HEAD (меняет историю), revert создаёт коммит-отмену (безопасен), restore восстанавливает файлы.","Git reset vs revert vs checkout: когда что использовать — Gymterview","reset меняет историю (локальные коммиты), revert создаёт коммит-отмену (shared ветки), restore восстанавливает файлы. Три режима reset.",[25,26,27,28,29,30,31,32,33],"git reset","git revert","git checkout","git restore","soft","mixed","hard","отмена коммита","собеседование","reset перемещает HEAD и ветку (изменяет историю): --soft (сохраняет staging), --mixed (сбрасывает staging), --hard (сбрасывает всё). revert создаёт новый коммит-отмену (не изменяет историю, безопасен для shared-веток). checkout\u002Frestore восстанавливает файлы из коммита. Правило: reset — для локальных коммитов, revert — для запушенных. git reflog — страховочная сеть на 90 дней.",true]