Ответ
Команда git reset перемещает указатель текущей ветки (HEAD) на указанный коммит, при этом изменяя состояние индекса (staging area) и рабочей директории. Это основной инструмент для отмены изменений в истории Git.
Основные режимы работы:
-
git reset --soft <commit>- Действие: Перемещает HEAD на указанный коммит, но оставляет все изменения из отменённых коммитов в индексе (как проиндексированные).
- Использование: Для перекоммита истории (объединения нескольких коммитов в один).
-
git reset --mixed <commit>(режим по умолчанию)- Действие: Перемещает HEAD и сбрасывает индекс до состояния указанного коммита, но сохраняет все изменения в рабочей директории как неиндексированные (modified).
- Использование: Чтобы отменить коммит, но оставить изменения в файлах для доработки — самый частый сценарий.
-
git reset --hard <commit>- Действие: Полностью сбрасывает состояние репозитория (HEAD, индекс и рабочую директорию) к состоянию указанного коммита. Все последующие изменения безвозвратно удаляются.
- Использование: Для полного отката к предыдущему состоянию. Требует крайней осторожности, так как данные не попадают в корзину.
Практические примеры:
# Отменить последний коммит, оставив его изменения проиндексированными
git reset --soft HEAD~1
# Отменить последний коммит, оставив изменения в рабочей папке (неиндексированными)
git reset HEAD~1 # аналог git reset --mixed HEAD~1
# Полностью удалить последний коммит и все связанные с ним изменения в файлах
git reset --hard HEAD~1
# Откатить изменения до коммита с определённым хэшем
git reset --hard a1b2c3d
Важно: git reset --hard — опасная команда. Её стоит использовать, только если вы уверены, что изменения больше не понадобятся, или они сохранены в другой ветке.
Ответ 18+ 🔞
Давай разберём эту штуку, которая у всех новичков вызывает священный ужас, а у опытных — злорадную ухмылку. git reset. Ну, типа, сброс. Сейчас объясню, как не отправить в пизду всю свою работу.
Представь, что твой коммит — это кирпичик в стене. А HEAD — это твоя голова, которая смотрит на самый верхний кирпич. Так вот, git reset — это когда ты берёшь свою же башку и хуяк! — тыкаешь её в какой-то другой, более старый кирпич. А дальше начинается магия, в зависимости от того, с каким пинком ты это делаешь.
Три главных режима, а то запутаешься:
-
git reset --soft <commit>(Мягкий, как жопа младенца)- Что делает: Башку (HEAD) переставил на старый коммит, а все изменения, которые были в тех, что "отменились" — они такие стоят рядом, аккуратно упакованные и готовые к коммиту. Как будто ты их уже
git addсделал. - Зачем: Хочешь переписать историю, как блядь Толстой. Сделал три коммита, а надо один красивый.
--soft— твой выбор. Потом просто закоммитишь всё разом.
- Что делает: Башку (HEAD) переставил на старый коммит, а все изменения, которые были в тех, что "отменились" — они такие стоят рядом, аккуратно упакованные и готовые к коммиту. Как будто ты их уже
-
git reset --mixed <commit>(Обычный, дефолтный. Им все и пользуются)- Что делает: Башку переставил, и эти упаковки с изменениями — р-раз! — распаковал обратно в рабочую папку. Теперь они просто изменённые файлы, как будто ты их только что поредактировал. Ничего не проиндексировано.
- Зачем: О, это классика! "Накосячил в коммите, блядь". Отменяешь его, а изменения остаются у тебя в файлах, чтобы поправить и закоммитить заново, уже без косяков.
-
git reset --hard <commit>(ЖЁСТКИЙ. Тот самый, от которого волнение ебать)- Что делает: Берешь башку, хуяк в старый коммит, и начинаешь всё вокруг себя ломать. Индекс, рабочие файлы — всё, что было после того коммита — нахуй стирается. Всё. Как будто этого и не было. Никакой корзины, никакого "ой".
- Зачем: Только если ты на 146% уверен, что эти изменения — говно, которое не нужно даже в виде черновика. Или они уже сохранены в другой ветке. Иначе — пиши пропало. Серьёзно, чувак.
Примеры из жизни, чтобы не быть мудаком:
# Ой, в коммите опечатка в сообщении. Давай переделаем, но изменения оставим.
git reset --soft HEAD~1
# Стандартная ситуация: закоммитил какую-то хуйню, нужно откатить, но файлы оставить для правок.
git reset HEAD~1 # То же самое, что и --mixed, можно не писать
# Пиздец. Я только что нахуй снёс половину проекта экспериментальным кодом. Хочу всё, как было вчера.
# (ГЛУБОКО ВДОХНИ. ПРОВЕРЬ, ЧТО ТЫ В НУЖНОЙ ВЕТКЕ. ЕЩЁ РАЗ ПРОВЕРЬ.)
git reset --hard a1b2c3d
Запомни главное: --hard — это как кнопка "Вы уверены?", которая не спрашивает, уверен ли ты. Она просто делает. Используй её с чувством, с толком, с расстановкой, а лучше — пока не станешь гуру, обходи стороной, ебать мои старые костыли.