yandex

Как применять git reset и git revert эффективно: отменяем коммиты в Git


    Дарим 20 000 бонусов <br/>
    <span class="bold">для юрлиц и ИП</span>
Дарим 20 000 бонусов
для юрлиц и ИП
Подробнее
Avatar icon

Александра Гонтарева

Редактор блога

Статья

Время чтения

6 минут

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

Как откатить последний коммит в Git

Для отмены изменений чаще всего применяется команда git reset. Она инициирует перемещение указателя HEAD на заданное число коммитов назад в истории. В общем виде ее структура выглядит так:

git reset [--<режим>] [<коммит>]

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

  • сначала идет редактура в рабочем пространстве;

  • затем через применение команды git add изменения переносятся в Git Index — то есть в промежуточный слой между репозиторием и папкой, в которой ведется работа;

  • в итоге добавленные файлы фиксируются в хранилище файлов при помощи git commit.


Ключевые зоны в Git-системе на схеме
Ключевые зоны в системе Git

Откат изменений с 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 ..." to unstage) new file: new-file.txt

И сделали верный коммит: 

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 могут возникать конфликты слияния. Возможно, их придется править вручную.

Облачные ресурсы в Evolution free tier бесплатно и навсегда

Виртуальная машина, хранилище данных и 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 можно с помощью команды git commit --amend. Она соединяет изменения в Git Index с предыдущим коммитом, но не создает новый. А еще позволяет редактировать комментарии к предыдущему коммиту, не изменяя в нем код. 

Измененный коммит в Git
Для Git измененный коммит будет выглядеть, как новый. На схеме он отмечен *

Как слить коммиты в один

Для слияния коммитов в 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 — они обеспечивают простую отмену выполненных изменений в коммите или ветке кода.

ВМ с преднастроенным GitLab в облаке
Скачивайте виртуальную машину с преднастроенным GitLab в облаке Cloud.ru

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

Содержание

  • Как откатить последний коммит в Git
  • Откат изменений с git reset
  • Дополнительные способы откатки в Git
  • Изменение и исправление коммитов в истории
  • Что в итоге

Вам может понравиться