Как применять git reset и git revert эффективно: отменяем коммиты в Git
При написании кода всегда есть риск сделать ошибку. Чтобы всегда иметь возможность быстро исправить любую оплошность, рекомендуем взять на вооружение Git — специальную программу для отслеживания истории версий кода проекта. Она позволяет в любой момент отменить изменения через ввод команд git reset и git revert. Чтобы разобраться, в каких ситуациях их применение будет наиболее эффективно, читайте эту статью.

Как откатить последний коммит в Git
Для отмены изменений чаще всего применяется команда git reset. Она инициирует перемещение указателя HEAD на заданное число коммитов назад в истории. В общем виде ее структура выглядит так:
git reset [--<режим>] [<коммит>]

Git reset можно применять в трех непосредственно связанных между собой зонах системы контроля версий: в самом пространстве работы с кодом, в индексе и в хранилище кода — репозитории. Если посмотреть на их взаимосвязь чуть детальнее, мы обнаружим, что:
сначала идет редактура в рабочем пространстве;
затем через применение команды git add изменения переносятся в Git Index — то есть в промежуточный слой между репозиторием и папкой, в которой ведется работа;
в итоге добавленные файлы фиксируются в хранилище файлов при помощи git commit.

Откат изменений с git reset
Чтобы отменить изменения в упомянутых выше зонах, git reset применяется с использованием с разными опциями: soft, mixed и hard.
Опция soft
Добавление опции soft передвигает указатель HEAD на заданное число коммитов назад. В индексе и рабочей директории ничего не меняется.
git reset --soft [<коммит>]
А что на практике? Представьте, что вы создали в директории файл new-file.txt. и индексировали его:
git add new-file.txt
После этого закоммитили с ошибкой:
git commit -m "wrong commit"
И решили его отменить при помощи git reset с опцией soft:
git reset --soft HEAD~1
Удостоверились в отмене коммита с помощью:
git status
Увидели, что изменения в файле test.txt вернулись в индекс:
Changes to be committed:
(use "git restore --staged
И сделали верный коммит:
git commit -m "correct commit"
В итоге история изменений репозитория осталась чистой, а проект был защищен от возможной путаницы в дальнейшей работе:

Опция mixed
Опция mixed применяется git reset по умолчанию. Она отменяет последние изменения в коммите и индексе, а рабочую директорию не редактирует.
Строится команда с опцией mixed следующим образом:
git reset –mixed [<коммит>]
А что на практике? Ситуация: вы сделали коммит с изменением, которое теперь хотите отменить. Поэтому вам нужно сбросить индекс, чтобы потом внести верные изменения.
Например, сейчас есть коммит, в котором вы хотите отменить добавление файла something.txt:
git add main_file.txt git add updates.txt git add something.txt git commit
Действуйте следующим образом. Внесите команду git reset без дополнительных элементов, ведь опция mixed используется по дефолту:
git reset HEAD~1
Вы увидите, что указатель переместился на один коммит назад, что отменило его и возвратило проиндексированные изменения в предыдущее состояние. Теперь добавьте только корректные файлы:
git add main_file.txt
git add updates.txt
И завершите действия:
git commit -m "Added files 1 and 2, excluding file 3"
Опция hard
Чтобы удалить все изменения после определенного коммита из всех рабочих зон Git, используется опция hard.
А что на практике? Представим, что вы закоммитили ненужный файл:
git add another_new_file.txt
git commit -m "Added incorrect file"
Теперь вам нужно удалить another_new_file.txt:
git reset --hard HEAD~1
В итоге указанный файл удалится из рабочего каталога вместе с ненужным изменением.
Отмена изменений с командой git revert
Кроме git reset в Git есть и другая команда для откатки — git revert. И если git reset производит отмену через перенос указателя HEAD к нужному коммиту, то git revert производит новый коммит без удаления предыдущих коммитов.
А что на практике? Итак, вы сделали ненужный коммит. Чтобы определить его идентификатор для отмены, введите git log:
git log
commit 2e3c670bfe46a5d7c5
Author: Ваше Имя <ваш.email@example.com>
Date: Sat Sep 26 15:32:46 2020 -0400
Ваш коммит
Далее вбейте git revert с идентификатором удаляемого изменения:
$ git revert 2e3c670bfe46a5d7c5
В итоге у вас будет новый коммит, который откатит изменения по указанному идентификатору, а еще откроет редактор. В нем можно указать причину отмены.
При этом важно учесть, что при использовании git revert могут возникать конфликты слияния. Возможно, их придется править вручную.
Виртуальная машина, хранилище данных и 4 000 бонусных рублей при регистрации
Дополнительные способы откатки в Git
Кроме команд, о которым подробно рассказали выше, в Git можно использовать и другие методы откатки закоммиченного.
Использование команды git checkout для отмены изменений
Изначально задумка команды git checkout заключалась в реализации возможности создавать ветки и осуществлять переключение между ними в Git. Однако ее тоже можно применять для отмены изменений в файлах, будь то один файл или несколько файлов одновременно.
А что на практике? Вы сделали коммит в файл test.sh, но потом поняли, что он вас не устраивает и нужно вернуться к предыдущему коммиту файла. Тогда используйте git checkout:
git checkout HEAD -- test.sh
git checkout HEAD -- test.sh
Это вернет состояние файла к тому, которое у него было до внесения ненужного коммита.
Если же вы хотите откатиться не к предыдущему, а к более раннему конкретному коммиту, то сперва нужно ввести команду git log, чтобы определить хэш-сумму требуемого коммита — она указывается в выдаче после слова commit. И далее вбить git checkout:
git checkout [<идентификатор коммита>] -- script.sh
Как отменить слияние коммитов
Слияние в Git — это объединение веток с изменениями в одну. С его помощью разработчики могут удобно работать в команде, интегрируя полезные изменения из других веток в свои.
Чтобы отменить слияние веток, нужно:
Проверить статус слияния через ввод команды git status, чтобы обнаружить признаки того, что процесс слияния продолжается.
Выполнить команду git merge --abort.
Нажать Enter.
В ответ на ввод команды git merge --abort Git прервет слияние и отобразит об этом сообщение. После чего можно будет снова ввести git status, чтобы убедиться в успехе операции.
Как поступить, если отменено слишком много изменений
В том случае, если откатка произошла слишком далеко, все изменения можно вернуть на место, используя журнал действий Git и команду git reflog. Она продемонстрирует произведенные действия с указанием индексов, которые можно использовать для отмены лишних изменений.
А что на практике? Чтобы увидеть список произведенных действий, введите:
git reflog
Обнаружив в выдаче нужный индекс, впишите:
git reset --hard HEAD@{индекс}
И наблюдайте примерно такую картину:

Изменение и исправление коммитов в истории
Бывает, нужно не только отменить коммит, а внести правки в саму историю коммитов в Git. Это может пригодится в том случае, если коммиты требуется правильно сгруппировать или изменить их порядок.
Как отредактировать текст последнего коммита
Изменить последний коммит в Git можно с помощью команды git commit --amend. Она соединяет изменения в Git Index с предыдущим коммитом, но не создает новый. А еще позволяет редактировать комментарии к предыдущему коммиту, не изменяя в нем код.

Как слить коммиты в один
Для слияния коммитов в Git пригодится команда git rebase -i. Чтобы ее использовать, сперва нужно определить коммиты, которые нужно объединить, при помощи команды git log. А потом ввести:
git rebase -i HEAD~3
Это отобразит три последних коммита в окне текстового редактора. Например:
pick hfdjhj23 что-то исправляем
pick 5556f9n классное изменение
pick egrhth1 последнее изменение
И далее нужно заменить команды pick двух последних комментов на squash:
pick hfdjhj23 что-то исправляем
squash 4133a5f классное изменение
squash e0ca1b1 последнее изменение
После этого сохраните то, что у вас получилось, прокомментировать этот коммит и проверить, что все корректно при помощи git log.
Что в итоге
Git — это мощный инструмент для управления версиями, который пригодится любому разработчику. Он дает возможность просматривать и отслеживать модификации кода. А еще значительно упрощает совместную работу, ведь с ним не нужно бояться, что какие-то данные или чужой код будут безвозвратно утеряны.
В начале знакомства с Git важно научиться использовать команды git reset и git revert — они обеспечивают простую отмену выполненных изменений в коммите или ветке кода.

Также, чтобы с удобством работать с Git-репозиториями, рекомендуем внедрить в работу GitLab — веб-приложение и систему управления репозиториями программного кода. Кстати, на Маркетплейсе Cloud.ru вы можете скачать образ виртуальной машины, с помощью которого можно за несколько кликов настроить профиль в GitLab с готовыми CI/CD-процессами для создания приложений.