Главная страница / Блог / Git / Как можно откатить изменения к последнему коммиту

Как можно откатить изменения к последнему коммиту

Необходимость откатить изменения к определенному коммиту возникает достаточно часто. Git предоставляет широкий набор инструментов для устранения ошибок, возникающих в процессе работы. Все зависит от того, в какую точку истории вы хотите вернуться. В зависомости от ваших целей вам может пригодится команда git reset или git-revert, о них поговорим ниже.

Откатить добавленные изменения вплоть до последнего коммита

В ходе работы с Git нередко возникают ситуации, когда необходимо отменить все изменения и вернуть рабочий каталог к состоянию последнего коммита. Для этой задачи используется команда git reset --hard HEAD. Давайте рассмотрим, как эта команда работает и в каких случаях ее применение оправдано.

git reset --hard HEAD

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

Когда применять?

В случае отмены экспериментов. Если вы внесли серию изменений, но решили, что хотите начать с чистого листа и вернуться к изначальному состоянию, команда git reset --hard HEAD поможет быстро и безопасно вернуться к последнему коммиту.

В случае исправления ошибок. В случае, если вы сделали ошибочные изменения и хотите отменить их, эта команда позволит вернуть рабочий каталог к состоянию последнего коммита и начать заново.

Важно!

Следует помнить, что применение этой команды бездумно может привести к потере важных изменений. Поэтому, прежде чем использовать git reset --hard HEAD, убедитесь, что вы готовы потерять все несохраненные изменения.

Откатить последний коммит

В случае же когда проблемный коммит был опубликован в удаленном репозитории, просто удалять его небезопасно, ведь ваши коллеги могли добавить свои изменения поверх него в своих локальных репозиториях. В этом случае более безопасным вариантом будет создание нового коммита, с обратными изменениями. То есть если мы в проблемном комите присвоили переменной test значение два, которое прежде равнялось единице, то в новом коммите мы присваиваем переменной старое значение — единицу. Так, по факту, код остался прежним, на самом деле за этим кодом стоит серия изменений, которую можно посмотреть в истории коммитов. Сама история в данном случае нас не интересует, главное, что проблемные изменения были “откачены”.

Для реализации описанной выше задумки применяется команда git-revert. Еще раз, при использовании git-revert, Git создает новый коммит, который автоматически отменяет изменения, внесенные в выбранный коммит. Этот новый коммит, называемый обратным коммитом, содержит изменения, направленные на отмену эффектов выбранного коммита. Таким образом, вы можете исправить ошибки, внесенные в прошлые коммиты, не затрагивая историю репозитория.

Например, если известно, что последний коммит внес в программу сбой и его нужно убрать, достаточно выполнить следующую команду:

git revert HEAD

В процессе выполнения команды откроется редактор, в котором можно будет отредактировать описание нового коммита. 

Откатить определенный коммит или серию коммитов

Если коммит, нуждающийся в откате, не последний, достаточно просто указать в команде его хэш, например:

git revert 0dd263

Если нужно обратить (сделать revert) несколько коммитов, можно указать GIT промежуток истории, например:

git revert 0dd263..HEAD

В процессе выполнения этой команды будут сделаны обратные коммиты, начиная с коммита 0dd263, не включая его и до крайнего (на который указывает HEAD). Например, если в этот промежуток попало два коммита, будут сделаны два обратных коммита, поочередно отменяющие изменения каждого из исходных. Как и в предыдущих случаях, для каждого из коммитов будет открыт редактор, в котором можно будет изменить текст коммита (commit message).

Команда git revert имеет набор опций, расширяющих ее возможности, например —no-commit или если кратко, то -n. Эта опция останавливает GIT на этапе добавления изменения в индекс, после чего автор может сделать коммит самостоятельно. Это может быть полезным в случае, если делается revert нескольких коммитов и мы хотим поместить весь фикс в один обратный коммит, а не в несколько. То есть переписав предыдущий пример следующим образом, будет создан один обратный коммит, а не 2:

git revert --no-commit 0dd263..HEAD
git commit -m "revert last 2 features"

С другими опциями этой команды вы можете ознакомиться на этой страничке документации. Команда git revert — это безопасный и простой способ возврата репозитория к предыдущему состоянию. так как история не изменяется, а дополняется, что позволяет делать правки ранее опубликованных коммитов.

Russian
Прокрутить вверх