Что делает команда git reset и какие у неё есть режимы?

Ответ

Команда git reset перемещает указатель текущей ветки (HEAD) на указанный коммит, при этом изменяя состояние индекса (staging area) и рабочей директории. Это основной инструмент для отмены изменений в истории Git.

Основные режимы работы:

  1. git reset --soft <commit>

    • Действие: Перемещает HEAD на указанный коммит, но оставляет все изменения из отменённых коммитов в индексе (как проиндексированные).
    • Использование: Для перекоммита истории (объединения нескольких коммитов в один).
  2. git reset --mixed <commit> (режим по умолчанию)

    • Действие: Перемещает HEAD и сбрасывает индекс до состояния указанного коммита, но сохраняет все изменения в рабочей директории как неиндексированные (modified).
    • Использование: Чтобы отменить коммит, но оставить изменения в файлах для доработки — самый частый сценарий.
  3. 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 — это когда ты берёшь свою же башку и хуяк! — тыкаешь её в какой-то другой, более старый кирпич. А дальше начинается магия, в зависимости от того, с каким пинком ты это делаешь.

Три главных режима, а то запутаешься:

  1. git reset --soft <commit> (Мягкий, как жопа младенца)

    • Что делает: Башку (HEAD) переставил на старый коммит, а все изменения, которые были в тех, что "отменились" — они такие стоят рядом, аккуратно упакованные и готовые к коммиту. Как будто ты их уже git add сделал.
    • Зачем: Хочешь переписать историю, как блядь Толстой. Сделал три коммита, а надо один красивый. --soft — твой выбор. Потом просто закоммитишь всё разом.
  2. git reset --mixed <commit> (Обычный, дефолтный. Им все и пользуются)

    • Что делает: Башку переставил, и эти упаковки с изменениями — р-раз! — распаковал обратно в рабочую папку. Теперь они просто изменённые файлы, как будто ты их только что поредактировал. Ничего не проиндексировано.
    • Зачем: О, это классика! "Накосячил в коммите, блядь". Отменяешь его, а изменения остаются у тебя в файлах, чтобы поправить и закоммитить заново, уже без косяков.
  3. git reset --hard <commit> (ЖЁСТКИЙ. Тот самый, от которого волнение ебать)

    • Что делает: Берешь башку, хуяк в старый коммит, и начинаешь всё вокруг себя ломать. Индекс, рабочие файлы — всё, что было после того коммита — нахуй стирается. Всё. Как будто этого и не было. Никакой корзины, никакого "ой".
    • Зачем: Только если ты на 146% уверен, что эти изменения — говно, которое не нужно даже в виде черновика. Или они уже сохранены в другой ветке. Иначе — пиши пропало. Серьёзно, чувак.

Примеры из жизни, чтобы не быть мудаком:

# Ой, в коммите опечатка в сообщении. Давай переделаем, но изменения оставим.
git reset --soft HEAD~1

# Стандартная ситуация: закоммитил какую-то хуйню, нужно откатить, но файлы оставить для правок.
git reset HEAD~1  # То же самое, что и --mixed, можно не писать

# Пиздец. Я только что нахуй снёс половину проекта экспериментальным кодом. Хочу всё, как было вчера.
# (ГЛУБОКО ВДОХНИ. ПРОВЕРЬ, ЧТО ТЫ В НУЖНОЙ ВЕТКЕ. ЕЩЁ РАЗ ПРОВЕРЬ.)
git reset --hard a1b2c3d

Запомни главное: --hard — это как кнопка "Вы уверены?", которая не спрашивает, уверен ли ты. Она просто делает. Используй её с чувством, с толком, с расстановкой, а лучше — пока не станешь гуру, обходи стороной, ебать мои старые костыли.