Этот вопрос проверяет понимание различий между двумя важными командами Git для отмены изменений и их практического применения в рабочих процессах.
git reset перемещает указатель текущей ветки на конкретный коммит, потенциально удаляя более новые коммиты из истории, и может изменять индекс и рабочую директорию. git revert создает новый коммит, который отменяет изменения указанного коммита, сохраняя при этом всю историю проекта. Reset изменяет историю и опасен для опубликованных коммитов, mientras revert безопасен для общей истории и добавляет новую запись.
Reset и revert - две принципиально разные команды Git для управления историей изменений.
Reset перемещает указатель текущей ветки на указанный коммит.
bash
git reset --soft HEAD~1История - удаляет последний коммит
Индекс - изменения остаются в staged состоянии
Рабочая директория - файлы не изменяются
bash
git reset --mixed HEAD~1История - удаляет последний коммит
Индекс - изменения становятся unstaged
Рабочая директория - файлы сохраняют изменения
bash
git reset --hard HEAD~1История - удаляет последний коммит
Индекс - полностью очищается
Рабочая директория - все изменения удаляются
Revert создает новый коммит, который отменяет изменения указанного коммита.
bash
git revert HEADИстория - добавляет новый коммит
Безопасность - не перезаписывает существующую историю
Collaboration - безопасен для опубликованных коммитов
bash
# Локальная работа - сделали несколько коммитов, хотим переделать
git add .
git commit -m "WIP: incomplete feature"
git commit -m "More work"
# Решили объединить коммиты
git reset --soft HEAD~2
git commit -m "Complete feature implementation"bash
# Опубликовали коммит с ошибкой в master
git commit -m "Add feature X"
git push origin master
# Обнаружили ошибку - безопасно отменяем
git revert HEAD
git push origin masterReset - опасен для опубликованной истории
Revert - безопасен для общей работы
Reset - удаляет коммиты из истории
Revert - добавляет новые коммиты в историю
Reset - только для локальных, неопубликованных изменений
Revert - идеален для исправления ошибок в общей ветке
Для локальной работы - используйте reset для переписывания истории
Для исправления в master/main - всегда используйте revert
Для очистки неопубликованных изменений - reset --hard
Для отмены конкретного коммита - revert с указанием хеша
Вывод: Выбирайте reset для локальной переработки неопубликованной истории и revert для безопасного исправления ошибок в опубликованных коммитах. Reset изменяет историю, revert добавляет к ней.