Оба инструмента отменяют изменения, но делают это по-разному. Путаница между ними приводит к потере коммитов или конфликтам в общей ветке.
Что делает git reset
git reset перемещает указатель ветки назад. Он буквально переписывает историю коммитов — те коммиты, которые были после указанной точки, исчезают.Три режима работы:
•
git reset --soft HEAD~1 — отменяет коммит, но сохраняет изменения в индексе. Файлы готовы к новому коммиту.•
git reset --mixed HEAD~1 — отменяет коммит и убирает файлы из индекса. Изменения остаются в рабочей директории. Это режим по умолчанию.•
git reset --hard HEAD~1 — удаляет коммит и все изменения без возможности восстановления.Пример: написали коммит с опечаткой в сообщении или забыли добавить файл.
git reset --soft HEAD~1
git add forgotten-file.js
git commit -m "правильное сообщение"
Что делает git revert
git revert создаёт новый коммит, который отменяет изменения из указанного коммита. История не переписывается — в ней появляется дополнительная запись об отмене.git revert a1b2c3d
Git создаст коммит вида
Revert "название вашего коммита". В нём будут обратные изменения — то, что было добавлено, удалится, и наоборот.Если нужно отменить несколько коммитов подряд:
git revert HEAD~3..HEAD
В чём принципиальная разница
git reset меняет историю. Если вы уже отправили ветку на сервер и потом сделали reset, вам придётся делать git push --force. Это создаёт проблемы для всех, кто работает с этой веткой — их локальные копии окажутся не синхронизированы с удалённой.git revert историю не трогает. Новый коммит просто добавляется поверх. Это безопасно для общих веток.Как выбрать
Работаете в локальной ветке, которую ещё не пушили — используйте
git reset. Он чище, не засоряет историю лишними коммитами.Нужно отменить изменения в ветке, с которой работает команда — только
git revert. Даже если очень хочется сделать reset и force push, это плохая идея.Что делать, если всё сломалось
Если случайно сделали
git reset --hard и потеряли коммиты — не паникуйте. Git хранит ссылки на все объекты в reflog ещё 30 дней.git reflog
git reset --hard HEAD@{2}
reflog покажет историю всех перемещений HEAD. Найдите нужный коммит и восстановитесь на него.git reset — для локальной правки истории до того, как она ушла на сервер. git revert — для безопасной отмены в общих ветках. Правило простое: если ветка уже запушена и её видят другие, используйте revert.📍 Навигация: Вакансии • Задачи • Собесы
🐸 Библиотека Go-разработчика
#GoToProduction