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