Ответ
Для отмены коммита в Git есть две основные команды, выбор зависит от того, опубликован ли коммит.
1. git revert — безопасный способ для опубликованных коммитов.
Он создает новый коммит, который инвертирует изменения указанного коммита, не переписывая историю.
# Отменить конкретный коммит по его хешу
git revert <commit-hash>
# Отменить последний коммит
git revert HEAD
2. git reset — для локальных, неопубликованных коммитов.
Эта команда перемещает указатель ветки, фактически "стирая" коммиты из истории. Используйте ее осторожно.
# --soft: отменяет коммит, оставляя изменения в staged (индекс)
git reset --soft HEAD~1
# --mixed (по умолчанию): отменяет коммит, оставляя изменения в рабочей директории
git reset HEAD~1
# --hard: полностью удаляет коммит и все связанные с ним изменения
git reset --hard HEAD~1
Ключевое правило: Используйте git revert для коммитов, которые уже были отправлены в общий репозиторий (например, в main). Используйте git reset только для локальных экспериментов, которые еще никуда не пушились.
Ответ 18+ 🔞
Э, слушай, давай разберемся с этим, пока не натворил делов. Тут, бля, два главных пути, и выбор — это пиздец как важен, зависит от того, выложил ты свою писанину на всеобщее обозрение или нет.
1. git revert — это наш тихий, безопасный самурай. Для тех коммитов, что уже улетели в общий репозиторий.
Он не стирает историю, а делает вид, что так и было задумано, создавая новый коммит, который откатывает всё назад. Хитрая жопа, но работает. Доверия к нему — ноль, но метод рабочий.
# Хочешь отменить какой-то конкретный коммит? Да вот его хеш и подставь.
git revert <commit-hash>
# Последний коммит зассал? Легко.
git revert HEAD
2. git reset — это наш огнемёт. Только для локального бардака, который ещё никуда не отправил.
Вот эта команда, ёпта, реально переписывает историю, будто этих коммитов и не было. Пользоваться — только если ты один и твои эксперименты ещё никому не насолили.
# `--soft`: Отменяет коммит, но оставляет все твои изменения уже готовыми к следующему коммиту (в staged). Как будто и не коммитил.
git reset --soft HEAD~1
# `--mixed` (стоит по умолчанию): Отменяет коммит, изменения остаются в рабочей папке, но не подготовлены. Ну, типа, "переделывай, мудак".
git reset HEAD~1
# `--hard`: А вот это, бля, полный пиздец. Стирает коммит и ВСЕ изменения из него нахуй. Безвозвратно. Сам от себя охуеешь, если не понимал, что делаешь.
git reset --hard HEAD~1
Главное правило, которое запомни, а то будет тебе хиросима: Если коммит уже в общей ветке (в main, например) — только git revert. Если это твои личные, никому не нужные костыли, которые ещё не пушил — тогда уже git reset. Перепутаешь — гомосеки налетят и взъебут.