Не часто, но бывает необходимо отменить последний выполненный коммит. В зависимости от того, насколько все плохо можно действовать по-разному.
Ситуация 1: Коммит плох, но не безнадежен
Ваши изменения еще не отправлены на сервер, но локально вы уже выполнили команду commit. Нужно как то отменить операцию и продолжить редактирование, чтобы потом все таки закоммитить.
1 |
git reset --soft HEAD^ |
Коммит будет отменен в локальной ветке, а файлы данного коммита окажутся в статусе «ожидают коммита» (to be commited).
Можете вносить правки.
Ситуация 2: Коммит безнадежен
Рассмотрим следующую ситуацию, когда последний коммит совсем никуда не годится, и лучше бы его вообще не было. Изменения были выполнены локально.
Следующая команда отменит операцию commit, а файлы вернет в состояние к моменту до того как файлы были изменены.
1 |
git reset --hard HEAD^ |
Ситуация 3: Безнадежный коммит уже на сервере (в origin)
Если всё зашло совсем далеко, и коммит уже оказался на сервере, то при попытке откатится локально и выполнить команду push вы получите следующий ответ:
Смысл ответа в том, что локальная ветка старее, чем на сервере (вы ведь отменили коммит) и потому, наверное, вы делаете что то не так с точки зрения GIT.
Придется немного приложить силы (force), и заставить сервер принять ваши изменения:
1 |
git push --force |
Полностью алгоритм выглядит так (покажу на примере ветки develop):
1 2 3 4 5 6 7 8 9 10 11 |
# перейдем в ветку и синхронизируем её с origin git checkout develop git pull # случай 1: отменим последний коммит git reset --hard HEAD^ # случай 2: если нужно перейти к определенному коммиту # смотрим его в истории ветки и переключаемся к нему git log git reset --hard abcdef0104938745498374897043 # дальше требуется заставить сервер принять это изменение git push --force |