Как отменить последний коммит git
Тут нужно понять, что именно необходимо сделать. Потому что под отменой часто понимают удаление последнего коммита. Удалить последний коммит можно очень просто с помощью команды git reset . Причём можно как сохранить изменения в рабочей директории, так и полностью удалить все изменения сделанные в последнем коммите.
# удаляем только коммит git reset --hard HEAD~ # удаляем коммит и изменения
А вот отменить изменения сделанные в последнем коммите можно с помощью команды git revert . Она делает еще один коммит, но с противоположными изменениями.
# нужно передать ей хеш коммита, который мы отменяем
28 декабря 2022
Обратите внимание, что команда git reset может быть опасна, поскольку она изменяет историю репозитория. Поэтому важно следить за тем, что вы делаете, и убедиться, что вы работаете над локальным репозиторием, а не с удаленным репозиторием, так как при изменении истории удаленного репозитория у других участников могут возникнуть проблемы с синхронизацией своих локальных репозиториев.
Как отменить последний коммит в git?
Для отмены последнего коммита, если изменения ещё не опубликованы на сервер (не сделан git push) воспользоваться командой:
git reset —soft HEAD^
При этом изменённый код удалён не будет (будет зелёным цветом в git status). Вы можете подправить код и повторить коммит.
Это работает, если вы не опубликовали свои изменения. Если же вы уже опубликовали изменения, то не остается ничего другого, как сделать коммит, который отменяет какой-то коммит (sha1 коммита можно посмотреть командой git log), например:
git revert sha1
ответил 9 лет назад
—soft — отменит коммит, но сохранит изменения в файлах
—hard — отменит коммит и удалит изменения, сделанные коммитом.
git reset —soft HEAD~2 — отменит 2 последних коммита, сохранив изменения. Будут видны в git status. – root 7 лет назад
Откатиться назад на 2 коммита:
git reset —hard HEAD~2
Другими словами, отменить 2 последних коммита. – anonymous 7 лет назад
Другой контент:
- Как удалить сабмодуль в git? Решено!
- Что значит git clone —depth Решено!
- git как перенести коммит из одной ветки в другую? Решено!
- Не открывает git remote 1 ответ
- Ошибка при деплое на gh-pages: Failed to get remote.origin.url 1 ответ
- git. Настройка git
- Полезные git aliases
- Доступ к bitbucket и github по ssh ключам
- Отправить Pull Request в чужой репозиторий на github
- Сказать git какой из ssh-ключей использовать
Как отменить коммит в Git
Система управления версиями git очень популярна среди разработчиков программного обеспечения. Она очень сильно облегчает работу в команде, разворачивание проектов на сервере, ну и конечно же управление историей изменений. Изменения в Git сохраняются порциями — коммитами. Каждый коммит содержит набор изменений, к которым в любой момент можно вернуться, и продолжить разработку с этого момента или же просто посмотреть что и когда было изменено.
Иногда случаются ситуации, что вы закомитили что-то не то, не туда или не так. Такой коммит надо удалить или отменить. В этой небольшой статье мы рассмотрим как отменить коммит Git. Обратите внимание, что если вам надо внести изменения, то коммит не обязательно отменять, можно его поправить. Но об этом в следующей статье.
Как отменить коммит в Git
Бывает, что вы что-то закомитили, а потом решили, что часть изменений вносить не надо было или в коммит попали лишние файлы. Тогда можно отменить коммит и сделать его уже заново, но без ненужных данных. Сначала желательно посмотреть историю коммитов и текущий коммит, для того чтобы не откатить ничего лишнего. Для этого выполните:
Команда вернет список коммитов с их описанием и идентификаторами (хешами), которые можно использовать для того чтобы посмотреть подробную информацию о коммите с помощью команды show. По умолчанию команда показывает изменения в последнем коммите:
Теперь можно использовать идентификатор коммита для того чтобы его отменить.
1. Отменить коммит, но оставить изменения
Для того чтобы отменить последний коммит git без удаления изменений используется команда reset с параметром —soft. Команде надо передать идентификатор коммита или его позицию относительно HEAD. В терминологии git термин HEAD — это самая последняя версия проекта в текущей ветке. С помощью HEAD можно ссылаться на коммиты в истории. Для этого используется символ ~. Таким образом ссылка на предыдущий коммит будет выглядеть как HEAD~ или HEAD~1, а на коммит перед ним — HEAD~2 и так далее. Для отмены последнего коммита достаточно выполнить команду:
git reset —soft HEAD~
Как видите, все файлы сохранились, а если посмотреть отличия HEAD и текущего состояния проекта, то будет видно, добавление файла file3:
Аналогичного результата можно добиться, передав идентификатор коммита, например, давайте отменим коммит, добавляющий file2. Для этого посмотрите идентификатор коммита перед ним, в данном случае, это «Inital Commit» с помощью следующей команды:
А затем передайте его в команду git reset. Например:
git reset —soft 887080eea5fd8bd3bc2503dcf043ac6f5c19a8e5
И снова все файлы на месте, а в HEAD теперь будет добавлено два файла: file2 и file3:
Таким образом вы можете отменить несколько коммитов за раз, надо только указать идентификатор самого раннего коммита.
Обратите внимание, что файлы, которые ранее были в коммите, сейчас всё ещё добавлены в индекс, поэтому вам не надо вызывать git add, можно сразу создавать новый коммит. Но у команды reset есть ещё одна опция: —mixed. Она используется по умолчанию. При использовании этой опции ваши изменения тоже сохраняются, но перед следующим коммитом их снова надо будет добавить в индекс с помощью git add. При выполнении команды git status эти файлы будут отображаться как не отслеживаемые:
2. Отменить коммит и удалить изменения
Отмена коммита git с удалением изменений работает аналогично. Только здесь необходимо вместо опции —soft указывать опцию —hard. Например, при той же структуре коммитов, можно удалить последний коммит с добавлением файла file3 вместе с этим файлом:
git reset —hard HEAD~
Теперь файла нет. Аналогично, вы можете указать идентификатор коммита, до которого надо отменить коммиты. Обратите внимание, что указывается не тот коммит, который надо отменить, а коммит перед ним. Ещё важно отметить, что это всё работает пока вы не отправили свои коммиты в удалённый репозиторий. Если коммиты уже отправлены, их идентификаторы сохранены там, а поэтому менять их нельзя, иначе могут возникнуть конфликты слияния, которые будет сложно решить. Теперь вы знаете отменить последний локальный коммит git.
3. Как вернуть отмененный коммит
Если вы всё же удалили что-то нужное с помощью команды reset —hard, и вовремя об этом вспомнили, то можно попытаться вернуть потерянные данные. Первый способ будет работать если вы ещё ничего не комитили после отмены комита. Для того чтобы посмотреть историю добавления/удаления коммитов используйте команду:
Затем, для того чтобы вернуться к нужному удалённому коммиту надо использовать ту же команду reset —hard со ссылкой на удалённый коммит, полученной из предыдущей команды, в виде HEAD . Например, для коммита c файлом file3 это будет выглядеть так:
git reset —hard HEAD@
Аналогично можно использовать адрес:
git reset —hard fc1f295
Срок хранения удалённых коммитов ограничен. Время от времени git удаляет мусор, так что если ждать слишком долго, то нужных данных уже может и не быть. Но найти удалённые коммиты, если git их ещё не удалил можно с помощью такой команды:
git fsck —lost-found
Затем просто используйте идентификатор коммита для того чтобы посмотреть какие в нём были изменения:
git show 8a996dd76fbacb05a2df91c0f2d19b1a3afd8451
Затем можно переключиться на этот коммит с помощью команды:
git rebase 8a996dd76fbacb05a2df91c0f2d19b1a3afd8451
Это всё тоже безопасно делать только с коммитами, ещё не отправленными в удалённый репозиторий.
4. Отменить изменения но не отменять коммит
Если вы уже отправили коммит в удалённый репозиторий, удалять его не желательно, потому что если кто-то успеет скачать репозиторий до отмены коммита, то потом у него возникнут проблемы. Однако изменения, сделанные в коммите можно отменить новым коммитом. Для того чтобы не делать это вручную существует специальная команда revert. Её уже нужно передать идентификатор именно того коммита, изменения из которого надо отменить. Для этого сначала найдите хэш коммита:
Затем выполните команду revert, например:
git revert 8a996dd76fbacb05a2df91c0f2d19b1a3afd8451
Команда предложит вам написать сообщение для отменяющего коммита, можно просто закрыть этот файл:
Затем изменения, которые были в коммите исчезнут и уже это можно будет снова пушить в удалённые репозиторий.
Выводы
В этой небольшой статье мы рассмотрели как отменить коммит git с сохранением изменений или без них. Как видите всё довольно просто. Будьте осторожны, и не сотрите ничего лишнего, чтобы не создать проблем коллегам и себе.
vorozhba / Как удалить commit в Github.txt
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters. Learn more about bidirectional Unicode characters
1. Получаем хэш-код коммита, к которому хотим вернуться. |
2. Заходим в папку репозитория и пишем в консоль: |
$ git reset —hard a3775a5485af0af20375cedf46112db5f813322a |
$ git push —force |
levosay commented Jul 7, 2021
alex-sansei commented Jul 15, 2021
JerryCash-x commented Jul 20, 2021
zose43 commented Aug 13, 2021
somefellahere commented Aug 21, 2021 •
be careful with: git reset —hard a3775a5485af0af20375cedf46112db5f813322a
it delete all your current changes, use that command without —hard , then git push —force
Fariarx commented Sep 20, 2021
ZodiacGP commented Sep 24, 2021
Sirena-byte commented Sep 29, 2021
огромное спасибо! помогло)
ghost commented Oct 1, 2021
Che-p-bot commented Nov 26, 2021
Спасибо, это очень помогло!
yurasts commented Nov 27, 2021
SlimDaddy228 commented Dec 12, 2021
Tim-Kids commented Dec 29, 2021
спасибо! все-таки русскоязычные запросы в Google тоже хорошо порой помагают.
KarimullinArthur commented Jan 17, 2022 •
Fobiya commented Mar 5, 2022
instasanjik commented Mar 24, 2022
Спасибо вам большое! Вы нас очень выручили!
Moon1706 commented Apr 17, 2022
@vorozhba
Хелло! А можно ли как-то удалить не последние коммиты путем перемещения HEAD назад, а точечно одни коммит из последовательности? Пример, [1,2,3,4] -> [1,3,4]
olek07 commented Apr 18, 2022
@vorozhba Хелло! А можно ли как-то удалить не последние коммиты путем перемещения HEAD назад, а точечно одни коммит из последовательности? Пример, [1,2,3,4] -> [1,3,4]
mpodaniev commented Apr 18, 2022
@vorozhba
Хелло! А можно ли как-то удалить не последние коммиты путем перемещения HEAD назад, а точечно одни коммит из последовательности? Пример, [1,2,3,4] -> [1,3,4]
Через Вебшторм можно, просто удаляешь нужные коммит и пушишь через force. А как с помощью консольных команд не знаю, но точно можно.
olek07 commented Apr 19, 2022
@vorozhba
Хелло! А можно ли как-то удалить не последние коммиты путем перемещения HEAD назад, а точечно одни коммит из последовательности? Пример, [1,2,3,4] -> [1,3,4]
Через Вебшторм можно, просто удаляешь нужные коммит и пушишь через force. А как с помощью консольных команд не знаю, но точно можно.
Разве так можно? Там же что-то вроде блокчейна. Следующий зависит от предыдущего. Разве нет?
mpodaniev commented Apr 19, 2022
@vorozhba
Хелло! А можно ли как-то удалить не последние коммиты путем перемещения HEAD назад, а точечно одни коммит из последовательности? Пример, [1,2,3,4] -> [1,3,4]
Через Вебшторм можно, просто удаляешь нужные коммит и пушишь через force. А как с помощью консольных команд не знаю, но точно можно.
Разве так можно? Там же что-то вроде блокчейна. Следующий зависит от предыдущего. Разве нет?
Не знаю на счет блокчейна, и думаю что такого нет в гите.
Но постоянно так делаю, когда в фичебранче что-то разрабатываю, а потом оказывается что в каком-то коммите что-то не нужное добавил, а это могло быть десять коммитов назад к примеру. Просто удалил его локально и через форс пуш обновил данные в удаленном репозитории.
Все, в удаленном репозитории больше нет этого коммита
SlimDaddy228 commented Apr 27, 2022
давно нашел, не раз выручало, красавчик
maxim-saharov commented May 28, 2022
@vorozhba
Хелло! А можно ли как-то удалить не последние коммиты путем перемещения HEAD назад, а точечно одни коммит из последовательности? Пример, [1,2,3,4] -> [1,3,4]
Через Вебшторм можно, просто удаляешь нужные коммит и пушишь через force. А как с помощью консольных команд не знаю, но точно можно.
Разве так можно? Там же что-то вроде блокчейна. Следующий зависит от предыдущего. Разве нет?
Не знаю на счет блокчейна, и думаю что такого нет в гите.
Но постоянно так делаю, когда в фичебранче что-то разрабатываю, а потом оказывается что в каком-то коммите что-то не нужное добавил, а это могло быть десять коммитов назад к примеру. Просто удалил его локально и через форс пуш обновил данные в удаленном репозитории.
Все, в удаленном репозитории больше нет этого коммита
при удалении и при переименовании названия комита — вебшторм там много что шаманит и делает rebase всякий — о чем потом показывает в своей консоле — но если будут конфликты то предложит сравнивать и можно наломать там что то — лучше всегда перед этим делайте бек ап и потом играйтесь)