git reset
git reset: сбросить HEAD и текущую ветку на другой коммит.
Команда git reset используется в основном для перемещения указателя HEAD и текущей ветки назад, на конкретный коммит. По сути, это позволяет «отмотать» историю проекта в прошлое. Она незаменима, когда нужно отменить коммиты, уже сделанные в текущей ветке.
С git reset Git словно забывает, что какие-то изменения вообще происходили, и считает текущим состоянием проекта один из прошлых этапов. Это суперполезно для отмены изменений, упрощения сложной истории или даже для объединения нескольких коммитов в один перед их отправкой в удалённый репозиторий.
Исторически git reset использовалась для самых разных задач, включая сброс рабочего дерева и области подготовки. И ветераны разработки до сих пор применяют git reset для этих целей. Но с появлением команды git restore в версии Git 2.23.0 для управления рабочим деревом и областью подготовки рекомендуется использовать именно её, а git reset оставить для перемещения HEAD и указателя текущей ветки.
Используя git restore, сломать что-то гораздо сложнее, так как она более точечная и менее разрушительная по сравнению с git reset. Тем, кто привык к старой команде git reset, может потребоваться время, чтобы переучиться. Но если ты только знакомишься с Git, лучше сразу разобраться в разнице и стараться использовать git restore везде, где это уместно.
Примеры
Переместить указатель текущей ветки на определённый коммит. При этом изменения останутся в рабочей директории, так что их можно будет подправить и закоммитить заново. Полезно для редактирования уже существующего коммита:
git reset a1b2c3d4Переместить указатель текущей ветки на определённый коммит и сбросить область подготовки до этого же состояния, не трогая рабочую директорию. Полезно, если нужно сохранить проделанные изменения, но сделать новый коммит:
git reset --soft a1b2c3d4Переместить указатель текущей ветки на определённый коммит и полностью удалить все изменения в области подготовки и рабочей директории. Полезно, если нужно полностью избавиться от незакоммиченных изменений. Осторожно: это действие нельзя отменить!
git reset --hard a1b2c3d4Вместо хеша коммита можно использовать относительные ссылки: откинуть указатель текущей ветки на один коммит назад:
git reset HEAD~1Будь осторожнее с git reset, особенно с флагом --hard, так как он может безвозвратно удалить изменения. Всегда перепроверяй, на правильный ли коммит делается сброс, и возьми за правило использовать git stash для сохранения незакоммиченных изменений перед сбросом, если есть подозрение, что они ещё могут пригодиться.
Обрати внимание, что git reset не удаляет коммиты целиком; команда лишь двигает указатель ветки. «Удалённые» коммиты по-прежнему остаются в истории репозитория (к ним можно обратиться по хешу), но они больше не связаны с текущей веткой. Это значит, что их можно восстановить при необходимости, просто они больше не будут отображаться в истории ветки.
.gitignoregit checkoutgit configgit taggit worktree