Что делает команда git reset —hard?

Ответ

git reset --hard <commit> — это команда, которая принудительно сбрасывает состояние репозитория до указанного коммита. Она затрагивает три ключевые области Git:

  1. HEAD (указатель ветки): Перемещает указатель текущей ветки на <commit>.
  2. Индекс (Staging Area): Полностью очищает индекс и приводит его в точное соответствие с состоянием <commit>.
  3. Рабочая директория (Working Directory): Перезаписывает все файлы в рабочей директории, чтобы они соответствовали состоянию <commit>. Все незакоммиченные изменения будут безвозвратно утеряны.

Пример:

Предположим, у вас есть коммиты A-B-C (где C — последний) и локальные изменения в файле main.py.

# Сбросить состояние до коммита B
git reset --hard HEAD~1

Результат:

  • Последний коммит C удален из истории ветки.
  • Все изменения, внесенные в коммите C, исчезли из файлов.
  • Все локальные, незакоммиченные изменения в main.py также удалены.

⚠️ Предостережение: Используйте эту команду с особой осторожностью. Это один из немногих случаев в Git, когда можно потерять данные. Если вы случайно сбросили коммиты, их еще можно попытаться восстановить с помощью git reflog.

Ответ 18+ 🔞

Давай разберём эту штуку, которая выглядит как обычная команда, а на деле — термоядерная дубина для твоего репозитория. git reset --hard <commit>.

Представь, что твой проект — это мультик, который ты рисуешь на плёнке. Каждый коммит — это новый кадр поверх старого. А эта команда — это когда ты берёшь ножницы, находишь нужный кадр в ленте и БАЦ! — отрезаешь всё, что было после. И не просто отрезаешь, а ещё и берёшь ластик и стираешь все свои сегодняшние карандашные наброски на столе, которые ты ещё не успел сфоткать (закоммитить).

Что она делает, по пунктам, без соплей:

  1. Голову (HEAD) переставляет. Указывает твоей ветке: «Забудь всё после вот этого коммита, теперь наш последний — он».
  2. Сцену (Staging Area) очищает дочиста. Всё, что ты приготовил к коммиту, — нахуй.
  3. Рабочую папку перезаписывает. Все файлы на диске приводятся в точное состояние, как в том самом целевом коммите. ВСЁ, что ты не закоммитил, — стирается нахуй навсегда. Сохранил? Нет? Ну и пизда тебе.

Пример, чтобы въехать:

Была история: ABC. C — последний. И ты ещё наваял какую-то хуйню в main.py, но не коммитил.

# Откатываемся на один коммит назад, к B
git reset --hard HEAD~1

Что будет, ёпта:

  • Коммит C испарится из истории ветки. Как будто его не было.
  • Все изменения из коммита C пропадут из файлов.
  • А та твоя незакоммиченная хуйня в main.py? Да пошла она нахуй, её тоже нет. Вообще. Безвозвратно.

⚠️ Внимание, ебаный в рот! Это одна из тех команд, после которой можно реально охренеть. Данные теряются нахуй. Это не git checkout, который просто посмотреть даёт. Это уничтожение.

Если обосрался и сделал это случайно — не паникуй сразу. Беги, как ошпаренный, делать git reflog. Там, может, ещё твой потерянный коммит болтается, и его можно будет откачать, как утопленника. Но лучше просто трижды подумать, прежде чем жать Enter на этой команде.