Как откатиться с локального коммита, сделать изменения, закоммитить и запушить
Что проверяют
Понимаете ли вы разницу между переписыванием локальной истории и изменением уже опубликованной. Главный уточняющий вопрос почти всегда один: а если коммит уже запушен? Ещё проверяют, знаете ли вы, как вернуть потерянное.
Как отвечать
Сначала уточните состояние: коммит только локальный или уже на сервере. От этого зависит всё остальное.
Если коммит локальный, у git reset HEAD~1 три режима:
--soft: коммит убран, изменения остаются в индексе, можно поправить и сразу закоммитить заново;--mixed: режим по умолчанию, изменения остаются в рабочем каталоге, но выпадают из индекса;--hard: изменения выброшены. Только если правка точно не нужна.
Если нужно лишь поправить последний коммит, проще внести правку, добавить файлы через git add и выполнить git commit --amend. Дальше обычный git push: удалённая ветка этого коммита не видела, конфликта истории нет.
Если коммит уже запушен в общую ветку, историю не переписывают. Правильный путь здесь это git revert <sha>: он создаёт новый коммит с обратными изменениями, после чего вносится исправление и делается обычный пуш. Переписать историю через reset и git push --force-with-lease допустимо только в своей ветке, например в открытом PR. В отличие от --force, этот флаг откажет, если на сервере появились коммиты, которых вы не видели.
Страховка на случай ошибки: git reflog показывает, где был HEAD, и git reset --hard <sha> с хешем оттуда возвращает «удалённый» коммит.
Для .NET-проекта добавьте практическую деталь: перед коммитом смотрите git status и не добавляйте всё подряд, каталоги bin/, obj/ и .vs/ должны быть в .gitignore. В Visual Studio и Rider то же делается через окно Git, но на собеседовании лучше показать команды.
Где спотыкаются
Советуют git reset --hard как единственный способ отката и теряют незакоммиченные правки.
Делают reset уже запушенного коммита и push --force в main. История у коллег расходится, а их коммиты могут пропасть.
Путают revert и reset. revert ничего не удаляет из истории, он добавляет новый коммит, поэтому безопасен для общих веток.