[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"/ru/kb/how-to/services/git-reset-i-git-revert-otmena-kommitovKbData":3},{"page":4,"pages":133,"recommendedPages":134,"category":77,"categoryTree":77,"total":15,"currentOrder":162,"activeManualCategoryId":77,"tag":-1},{"route":5,"uuid":8,"title":9,"excerpt":10,"content":11,"view_count":12,"published_at":13,"modified_at":13,"like":14,"category":17,"hero_image":70,"seo_metadata":71,"schema_org_metadata":75,"open_graph_metadata":78,"sections":79,"tags":124,"breadcrumbs":125,"images":132},{"language":6,"path":7},"ru","/kb/how-to/services/git-reset-i-git-revert-otmena-kommitov","470021c9-aa42-6939-30bd-e831d8a872c7","Git-инструменты отмены коммитов: как использовать git reset и git revert","Ошибки при разработке – не редкость. Можно закоммитить не тот файл, забыть про опечатку в коде или случайно смешать несколько задач в одном коммите.","\n\u003Cp>Ошибки при разработке – не редкость. Можно закоммитить не тот файл, забыть про опечатку в коде или случайно смешать несколько задач в одном коммите. Git – система контроля версий, которая хранит полную историю изменений проекта и позволяет откатить практически любую оплошность буквально одной командой.\u003C/p>\n\n\n\n\u003Cp>В этой статье разберем, как отменять коммиты с помощью \u003Ccode>git reset\u003C/code> и \u003Ccode>git revert\u003C/code> и чем они отличаются друг от друга, а также рассмотрим дополнительные инструменты отката – \u003Ccode>git checkout\u003C/code>, \u003Ccode>git restore\u003C/code>, \u003Ccode>git merge --abort\u003C/code>, \u003Ccode>git reflog\u003C/code> и \u003Ccode>git commit --amend\u003C/code>.\u003C/p>\n\n\n\n\u003Ch2 id=\"tri-zony-git\">Три зоны Git\u003C/h2>\n\n\n\n\u003Cp>Прежде чем переходить к работе с командами, полезно вспомнить, как устроен Git изнутри. Любой файл в проекте последовательно проходит через три области:\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Cstrong>Рабочая директория\u003C/strong> (working directory) – папка на диске, где вы редактируете файлы.\u003C/li>\u003Cli>\u003Cstrong>Индекс\u003C/strong> (staging area) – промежуточный буфер, в который попадают файлы после команды \u003Ccode>git add\u003C/code>. Именно из индекса Git берет данные для следующего коммита.\u003C/li>\u003Cli>\u003Cstrong>Репозиторий\u003C/strong> – хранилище, куда изменения фиксируются окончательно командой \u003Ccode>git commit\u003C/code>.\u003C/li>\u003C/ul>\n\n\n\n\u003Cp>Таким образом, путь файла выглядит так: сначала правки вносятся в рабочей директории, затем \u003Ccode>git add\u003C/code> переносит их в индекс, а \u003Ccode>git commit\u003C/code> записывает их в историю репозитория в виде нового коммита.\u003C/p>\n\n\n\n\u003Ch2 id=\"git-reset\">git reset\u003C/h2>\n\n\n\n\u003Cp>Разберем, что делает \u003Ccode>git reset\u003C/code>. Эта команда умеет откатывать состояние сразу в одной, двух или во всех трех зонах Git, в зависимости от того, какой режим вы укажете.\u003C/p>\n\n\n\n\u003Cp>Общий вид команды:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git reset [--&lt;режим&gt;] [&lt;коммит&gt;]\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Где:\u003C/p>\n\n\n\n\u003Cul>\u003Cli>\u003Ccode>&lt;коммит&gt;\u003C/code> – это точка в истории, к которой нужно вернуться. Например, \u003Ccode>HEAD~1\u003C/code> – на один коммит назад, \u003Ccode>HEAD~3\u003C/code> – на три коммита назад либо конкретный хэш коммита.&nbsp;\u003C/li>\u003Cli>\u003Ccode>&lt;режим&gt;\u003C/code> – определяет, что именно произойдет с индексом и рабочей директорией. Всего есть три режима: \u003Ccode>soft\u003C/code>, \u003Ccode>mixed\u003C/code> и \u003Ccode>hard\u003C/code>.\u003C/li>\u003C/ul>\n\n\n\n\u003Ch3 id=\"rezhim-soft-otkat-tolko-ukazatelya-head\">Режим soft: откат только указателя HEAD\u003C/h3>\n\n\n\n\u003Cp>\u003Ccode>git reset --soft\u003C/code> двигает указатель \u003Ccode>HEAD\u003C/code> (то есть текущую точку истории) на нужное число коммитов назад, но не трогает ни индекс, ни рабочую директорию. Все изменения, которые были в отмененном коммите, останутся проиндексированными – их не придется заново добавлять командой \u003Ccode>git add\u003C/code>.\u003C/p>\n\n\n\n\u003Cp>Синтаксис:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git reset --soft [&lt;коммит&gt;]\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Допустим, вы создали файл \u003Ccode>new-file.txt\u003C/code>, добавили его в индекс и закоммитили с некорректным сообщением:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git add new-file.txt\ngit commit -m \"wrong commit\"\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Чтобы отменить этот коммит, но сохранить изменения в индексе, выполните:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git reset --soft HEAD~1\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Проверить результат можно командой \u003Ccode>git status\u003C/code> – она покажет, что файл \u003Ccode>new-file.txt\u003C/code> снова находится в состоянии «Changes to be committed», то есть готов к коммиту. Осталось сделать коммит с правильным сообщением:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git commit -m \"correct commit\"\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>История репозитория остается чистой: вместо ошибочного коммита появляется корректный, а сами изменения при этом никуда не пропадают.\u003C/p>\n\n\n\n\u003Ch3 id=\"rezhim-mixed-povedenie-po-umolchaniyu\">Режим mixed: поведение по умолчанию\u003C/h3>\n\n\n\n\u003Cp>Если запустить \u003Ccode>git reset\u003C/code> без указания режима, Git применит \u003Ccode>mixed\u003C/code> – это поведение по умолчанию. Оно отменяет последний коммит и сбрасывает индекс, но не изменяет файлы в рабочей директории: правки остаются на месте, просто перестают быть проиндексированными.\u003C/p>\n\n\n\n\u003Cp>Синтаксис:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git reset --mixed [&lt;коммит&gt;]\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Допустим, вы закоммитили сразу три файла, хотя один из них, \u003Ccode>something.txt\u003C/code>, добавлять было не нужно:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git add main_file.txt\ngit add updates.txt\ngit add something.txt\ngit commit -m \"добавил файлы\"\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Отменяем коммит:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git reset HEAD~1\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>\u003Ccode>HEAD\u003C/code> переместится на коммит назад, а все три файла снова окажутся в статусе неотслеживаемых/непроиндексированных изменений. Теперь в индекс можно добавить только нужные файлы:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git add main_file.txt\ngit add updates.txt\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>И зафиксировать новый корректный коммит:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git commit -m \"Added files 1 and 2, excluding file 3\"\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch3 id=\"chto-delaet-git-reset-hard-polnyy-otkat-izmeneniy\">Что делает git reset hard: полный откат изменений\u003C/h3>\n\n\n\n\u003Cp>\u003Ccode>git reset --hard\u003C/code> – самый радикальный вариант, предназначенный для отмены изменений. Он отменяет коммит, очищает индекс и полностью возвращает файлы в рабочей директории к состоянию указанного коммита. Все несохраненные изменения будут безвозвратно потеряны, поэтому пользоваться этим режимом стоит осторожно.\u003C/p>\n\n\n\n\u003Cp>Вы случайно закоммитили ненужный файл:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git add another_new_file.txt\ngit commit -m \"Added incorrect file\"\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Чтобы полностью удалить этот коммит вместе с файлом из рабочего каталога:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git reset --hard HEAD~1\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>После выполнения команды файл \u003Ccode>another_new_file.txt\u003C/code> исчезнет не только из истории, но и с диска.\u003C/p>\n\n\n\n\u003Ch2 id=\"git-revert\">git revert\u003C/h2>\n\n\n\n\u003Cp>В отличие от \u003Ccode>git reset\u003C/code>, который перемещает \u003Ccode>HEAD\u003C/code> и может стирать коммиты из истории, \u003Ccode>git revert commit\u003C/code> работает иначе: он создает новый коммит, который отменяет изменения указанного коммита, но при этом ничего не удаляет из истории. Это делает \u003Ccode>git revert\u003C/code> более безопасным инструментом, что особенно важно для отмены изменений в публичных ветках, с которыми уже работают другие участники команды.\u003C/p>\n\n\n\n\u003Cp>Сначала нужно найти идентификатор коммита, который требуется отменить:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git log\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Пример вывода:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>commit 2e3c670bfe46a5d7c5\nAuthor: Ivanov Ivan &lt;ivivanov@example.com&gt;\nDate:   Fri Jul 24 15:32:46 2026 -0400\n    Test commit\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Далее выполняем отмену по хэшу коммита:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git revert 2e3c670bfe46a5d7c5\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Git создаст новый коммит, откатывающий указанные изменения, и откроет редактор для ввода сообщения – там можно указать причину отката. Стоит учитывать, что при отмене может возникнуть конфликт слияния, если после нужного коммита файл менялся еще раз – в этом случае конфликт придется разрешить вручную.\u003C/p>\n\n\n\n\u003Cp>Если нужно отменить сразу несколько коммитов подряд одним итоговым коммитом, а не по одному, можно указать диапазон и добавить флаг \u003Ccode>--no-commit\u003C/code> (сокращенно \u003Ccode>-n\u003C/code>): он применит все отмены к рабочей директории и индексу, но не будет создавать коммит после каждой из них, оставив это на ваше усмотрение:&nbsp;\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git revert --no-commit HEAD~3..HEAD\ngit commit -m \"Откат трех последних коммитов\" \u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Ch2 id=\"git-reset-ili-git-revert-chto-vybrat\">git reset или git revert: что выбрать\u003C/h2>\n\n\n\n\u003Cp>\u003Ccode>git reset\u003C/code> подходит для локальной, еще не опубликованной работы. Он передвигает \u003Ccode>HEAD\u003C/code> назад и, в зависимости от режима, освобождает индекс (\u003Ccode>mixed\u003C/code>) и рабочую директорию (\u003Ccode>hard\u003C/code>) или оставляет их нетронутыми (\u003Ccode>soft\u003C/code>). \u003Cstrong>Все три режима переписывают историю\u003C/strong>. Отмененные коммиты перестают быть частью текущей ветки, а публиковать такую переписанную историю в общий репозиторий, где уже работают другие, небезопасно.\u003C/p>\n\n\n\n\u003Cp>\u003Ccode>git revert\u003C/code> подходит, когда коммит уже отправлен в общую ветку и его видят другие участники команды. Вместо того чтобы стирать или двигать историю, \u003Ccode>git revert\u003C/code> добавляет новый коммит, который отменяет изменения старого. История остается линейной и полной, поэтому \u003Ccode>git revert\u003C/code> – \u003Cstrong>более безопасный выбор для командной работы\u003C/strong> и публичных веток.\u003C/p>\n\n\n\n\u003Ch2 id=\"git-checkout-i-git-restore\">git checkout и git restore\u003C/h2>\n\n\n\n\u003Cp>Изначально команда \u003Ccode>git checkout\u003C/code> создавалась для переключения между ветками, но ее также можно использовать, чтобы вернуть отдельный файл к состоянию последнего коммита.\u003C/p>\n\n\n\n\u003Cp>Например, вы внесли и закоммитили правки в \u003Ccode>test.sh\u003C/code>, но результат вас не устроил:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git checkout HEAD -- test.sh\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Файл вернется к состоянию, в котором был до последнего коммита. Если нужно откатиться не к предыдущему, а к конкретному более раннему коммиту, сначала найдите его хэш через \u003Ccode>git log\u003C/code>, а затем укажите его вместо \u003Ccode>HEAD\u003C/code>:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git checkout [&lt;идентификатор коммита&gt;] -- script.sh\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Начиная с версии Git 2.23, для восстановления файлов рекомендуется использовать более новую и однозначную по смыслу команду \u003Ccode>git restore\u003C/code> – она была выделена из \u003Ccode>git checkout\u003C/code> специально для отмены изменений в файлах, тогда как за переключением веток теперь закреплена отдельная команда \u003Ccode>git switch\u003C/code>. Тот же результат, что и в примере выше, можно получить так:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git restore --source=HEAD -- test.sh\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>А для отката к более раннему коммиту:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git restore --source=[&lt;идентификатор коммита&gt;] -- script.sh\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>\u003Ccode>git checkout\u003C/code> по-прежнему работает и встречается в старых инструкциях, но для новых проектов рекомендуется использовать \u003Ccode>git restore\u003C/code> (для файлов) и \u003Ccode>git switch\u003C/code> (для веток) – так меньше риска перепутать назначение команды.\u003C/p>\n\n\n\n\u003Ch2 id=\"git-merge-abort\">git merge --abort\u003C/h2>\n\n\n\n\u003Cp>Слияние (merge) объединяет изменения из одной ветки в другую. Если в процессе что-то пошло не так и слияние нужно прервать, выполните следующие шаги:\u003C/p>\n\n\n\n\u003Col>\u003Cli>Проверьте, идет ли сейчас слияние: \u003Ccode>git status\u003C/code> покажет соответствующее сообщение.\u003C/li>\u003Cli>Прервите операцию: \u003Ccode>git merge --abort\u003C/code>.\u003C/li>\u003Cli>Снова выполните \u003Ccode>git status\u003C/code>, чтобы убедиться, что репозиторий вернулся в исходное состояние.\u003C/li>\u003C/ol>\n\n\n\n\u003Ch2 id=\"git-reflog\">git reflog\u003C/h2>\n\n\n\n\u003Cp>Если в процессе работы с \u003Ccode>git reset\u003C/code> вы отменили больше, чем нужно, все действия можно восстановить с помощью команды \u003Ccode>git reflog\u003C/code>. Она хранит полный журнал перемещений указателя \u003Ccode>HEAD\u003C/code> – переключения веток, коммиты, сбросы. Это позволяет вернуться к любому из этих состояний.\u003C/p>\n\n\n\n\u003Cp>Смотрим журнал:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git reflog\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>В выводе каждая строка отмечена своим индексом вида \u003Ccode>HEAD@{N}\u003C/code>. Найдя нужную точку, возвращаемся к ней:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git reset --hard HEAD@{индекс}\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Таким образом можно «отменить отмену» и восстановить коммиты, которые казались потерянными.\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-alert alert-block alert-block-warning\">\u003Cdiv class=\"alert-block-title\">Обратите внимание!\u003C/div>\u003Cdiv class=\"alert-block-content\">Записи в \u003Ccode>git reflog\u003C/code> хранятся не бесконечно: по умолчанию Git удаляет их примерно через 90 дней для коммитов, которые еще достижимы из текущих веток, и через 30 дней – для тех, которые уже ничем не удерживаются. Поэтому \u003Ccode>git reflog\u003C/code> – это подстраховка на ближайшее время, а не постоянный архив, и восстанавливать нужные коммиты стоит как можно быстрее после ошибки.&nbsp;\u003C/div>\u003C/div>\n\n\n\n\u003Ch2 id=\"redaktirovanie-istorii-kommitov\">Редактирование истории коммитов\u003C/h2>\n\n\n\n\u003Ch3 id=\"izmenenie-teksta-poslednego-kommita\">Изменение текста последнего коммита\u003C/h3>\n\n\n\n\u003Cp>Если нужно поправить только сообщение последнего коммита (или добавить в него забытые изменения из индекса), используется команда:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git commit --amend\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Она не создает новый коммит, а объединяет содержимое индекса с предыдущим коммитом и позволяет отредактировать его сообщение. Для Git такой измененный коммит выглядит как совершенно новый – у него меняется хэш.\u003C/p>\n\n\n\n\u003Ch3 id=\"obedinenie-neskolkih-kommitov-v-odin\">Объединение нескольких коммитов в один\u003C/h3>\n\n\n\n\u003Cp>Для склеивания нескольких последних коммитов в один применяется интерактивный режим перебазирования:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>git rebase -i HEAD~3\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Команда откроет в текстовом редакторе список последних трех коммитов, например:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>pick hfdjhj23 что-то исправляем\npick 5556f9n классное изменение\npick egrhth1 последнее изменение\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>Чтобы объединить второй и третий коммит с первым, замените команду \u003Ccode>pick\u003C/code> на \u003Ccode>squash\u003C/code> у тех коммитов, которые нужно слить:\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-code code-block\">\u003Cpre data-options=\"{&quot;mode&quot;:&quot;&quot;}\">\u003Ccode>pick hfdjhj23 что-то исправляем\nsquash 5556f9n классное изменение\nsquash egrhth1 последнее изменение\u003C/code>\u003C/pre>\u003C/div>\n\n\n\n\u003Cp>После сохранения файла Git предложит объединить сообщения коммитов в одно – его можно отредактировать. Проверить результат удобно командой \u003Ccode>git log\u003C/code>.\u003C/p>\n\n\n\n\u003Ch2 id=\"zaklyuchenie\">Заключение\u003C/h2>\n\n\n\n\u003Cp>Git – незаменимый инструмент для контроля версий, который избавляет от страха потерять код или чужие правки: практически любое действие можно отменить или исправить.&nbsp;\u003C/p>\n\n\n\n\u003Cp>Освоив команды из данной статьи, вы сможете уверенно исправлять ошибки в истории проекта и не бояться экспериментировать с кодом, а о том, как установить и настроить Git на сервере Ubuntu 22.04, вы можете узнать из отдельной \u003Ca href=\"https://beget.com/ru/kb/how-to/vps/ustanovka-git-na-ubuntu-22-04?utm_source=kb&amp;utm_medium=article&amp;utm_campaign=git_reset_revert&amp;utm_content=kb_git_ubuntu\">инструкции\u003C/a>.\u003C/p>\n\n\n\n\u003Cdiv class=\"wp-block-beget-alert alert-block alert-block-warning\">\u003Cdiv class=\"alert-block-title\">Обратите внимание!\u003C/div>\u003Cdiv class=\"alert-block-content\">Часть команд – \u003Ccode>git reset\u003C/code>, \u003Ccode>git commit --amend\u003C/code> и \u003Ccode>git rebase\u003C/code> – \u003Cstrong>переписывают историю коммитов\u003C/strong>. У измененных коммитов меняется хэш, а старые версии как будто исчезают из истории. Если такие коммиты уже отправлены (запушены) в общий репозиторий и с ними мог начать работать кто-то из команды, переписывать их не стоит, так как локальная история разойдется с удаленной, что приведет к конфликтам и потере чужих изменений.\u003C/div>\u003C/div>\n\n\n\n\u003Cp>Если возникнут вопросы, напишите нам, пожалуйста, тикет из панели управления аккаунта (раздел “\u003Ca href=\"https://cp.beget.com/support?utm_source=kb&amp;utm_medium=article&amp;utm_campaign=git_reset_revert&amp;utm_content=cp_support\">Помощь и поддержка\u003C/a>”), а если вы захотите обсудить эту статью или наши продукты с коллегами по цеху и сотрудниками Beget – ждем вас в нашем \u003Ca href=\"https://t.me/beget_chat\">сообществе\u003C/a> в Telegram.&nbsp;\u003C/p>\n",6,"2026-08-13T14:24:33.000Z",{"count":15,"liked":16},0,false,{"route":18,"title":20,"tags":21,"breadcrumbs":62,"uuid":63,"parent_uuid":64,"default_page_path":26,"seo_metadata":65},{"language":6,"path":19},"/kb/how-to/services","Сервисы",[22,27,31,35,39,43,47,50,54,58],{"id":23,"title":24,"seo_metadata":25},"virtualnyj-hosting","Виртуальный хостинг",{"title":26,"description":26,"header":26,"keywords":26},"",{"id":28,"title":29,"seo_metadata":30},"perenos-sajta","Перенос сайта",{"title":26,"description":26,"header":26,"keywords":26},{"id":32,"title":33,"seo_metadata":34},"podderzhka","Поддержка",{"title":26,"description":26,"header":26,"keywords":26},{"id":36,"title":37,"seo_metadata":38},"bitrix","Bitrix",{"title":26,"description":26,"header":26,"keywords":26},{"id":40,"title":41,"seo_metadata":42},"cms","CMS",{"title":26,"description":26,"header":26,"keywords":26},{"id":44,"title":45,"seo_metadata":46},"sphinx","Sphinx",{"title":26,"description":26,"header":26,"keywords":26},{"id":48,"title":20,"seo_metadata":49},"servisy",{"title":26,"description":26,"header":26,"keywords":26},{"id":51,"title":52,"seo_metadata":53},"redis","Redis",{"title":26,"description":26,"header":26,"keywords":26},{"id":55,"title":56,"seo_metadata":57},"docker","Docker",{"title":26,"description":26,"header":26,"keywords":26},{"id":59,"title":60,"seo_metadata":61},"memcached","Memcached",{"title":26,"description":26,"header":26,"keywords":26},[],"5b6de027-fb8f-0979-48cc-569ce5b06d0c","fa9a1354-631a-4206-df34-291f0db8f42a",{"title":66,"description":67,"header":68,"keywords":69},"Сервисы. Полезные статьи – Beget","Полезные статьи о Сервисах на сайте Beget","Сервисы. Полезные статьи","сервисы, бегет",{"src":26,"text":26},{"title":72,"description":73,"keywords":74},"Отмена коммитов в Git: разбор git reset и git revert","Подробный разбор по отмене коммитов в Git. Руководство по применению команды reset и revert: в чем разница, когда использовать каждую из них и как избежать типичных ошибок","инструкция по git reset и git revert, как удалить коммиты в git, операции отмены в гит",{"faq":76,"how_to":77,"product":77},[],null,{},[80,84,87,91,94,97,100,103,106,109,112,115,118,121],{"level":81,"name":82,"anchor":83},1,"Три зоны Git","tri-zony-git",{"level":81,"name":85,"anchor":86},"git reset","git-reset",{"level":88,"name":89,"anchor":90},2,"Режим soft: откат только указателя HEAD","rezhim-soft-otkat-tolko-ukazatelya-head",{"level":88,"name":92,"anchor":93},"Режим mixed: поведение по умолчанию","rezhim-mixed-povedenie-po-umolchaniyu",{"level":88,"name":95,"anchor":96},"Что делает git reset hard: полный откат изменений","chto-delaet-git-reset-hard-polnyy-otkat-izmeneniy",{"level":81,"name":98,"anchor":99},"git revert","git-revert",{"level":81,"name":101,"anchor":102},"git reset или git revert: что выбрать","git-reset-ili-git-revert-chto-vybrat",{"level":81,"name":104,"anchor":105},"git checkout и git restore","git-checkout-i-git-restore",{"level":81,"name":107,"anchor":108},"git merge --abort","git-merge-abort",{"level":81,"name":110,"anchor":111},"git reflog","git-reflog",{"level":81,"name":113,"anchor":114},"Редактирование истории коммитов","redaktirovanie-istorii-kommitov",{"level":88,"name":116,"anchor":117},"Изменение текста последнего коммита","izmenenie-teksta-poslednego-kommita",{"level":88,"name":119,"anchor":120},"Объединение нескольких коммитов в один","obedinenie-neskolkih-kommitov-v-odin",{"level":81,"name":122,"anchor":123},"Заключение","zaklyuchenie",[],[126,130],{"route":127,"title":129},{"language":6,"path":128},"/kb/how-to","Полезные статьи",{"route":131,"title":20},{"language":6,"path":19},[],[],[135,144,153],{"route":136,"uuid":138,"title":139,"excerpt":26,"content":26,"view_count":15,"published_at":26,"modified_at":26,"like":77,"category":77,"hero_image":77,"seo_metadata":77,"schema_org_metadata":77,"open_graph_metadata":77,"sections":140,"tags":141,"breadcrumbs":142,"images":143},{"language":6,"path":137},"/kb/how-to/services/video-cms-joomla-zagruzka-sitemap-xml","f7051bd2-e8a0-95c7-d66d-887c86f80823","Видео: Загружаем sitemap.xml в CMS Joomla",[],[],[],[],{"route":145,"uuid":147,"title":148,"excerpt":26,"content":26,"view_count":15,"published_at":26,"modified_at":26,"like":77,"category":77,"hero_image":77,"seo_metadata":77,"schema_org_metadata":77,"open_graph_metadata":77,"sections":149,"tags":150,"breadcrumbs":151,"images":152},{"language":6,"path":146},"/kb/how-to/services/video-nastrojka-polnotekstovogo-poiska-v-sphinx-v-1s-bitrix","558f6e15-7f2a-5ac8-f7da-ece7ab246c58","Видео: Настройка поиска Sphinx в 1С-Bitrix",[],[],[],[],{"route":154,"uuid":156,"title":157,"excerpt":26,"content":26,"view_count":15,"published_at":26,"modified_at":26,"like":77,"category":77,"hero_image":77,"seo_metadata":77,"schema_org_metadata":77,"open_graph_metadata":77,"sections":158,"tags":159,"breadcrumbs":160,"images":161},{"language":6,"path":155},"/kb/how-to/services/videoinstrukciya-po-zagruzke-sitemap-na-cms-wordpress","cd0ac1c2-362a-32a0-6233-648c3abd3d99","Видео: WordPress Как загрузить sitemap.xml",[],[],[],[],"popularity-desc"]