Можно ли локально отменить предыдущий коммит, чтобы изменения попали в staging
Что проверяют
Понимаете ли вы, что делает git reset с тремя областями: историей ветки, индексом и рабочей копией. Почти всегда следом спрашивают, чем --soft отличается от --mixed и --hard и что делать, если коммит уже запушен.
Как отвечать
Да, можно: git reset --soft HEAD~1. Команда переносит указатель ветки на родителя последнего коммита, а индекс и файлы не трогает. Изменения из отменённого коммита оказываются в staging, git status показывает их как готовые к коммиту. Дальше можно поправить код и закоммитить заново.
Три режима стоит назвать сразу:
--soft: двигает только ветку, изменения остаются в индексе;--mixed: режим по умолчанию, дополнительно сбрасывает индекс. Правки остаются в файлах, но их нужно заново добавить черезgit add;--hard: сбрасывает и индекс, и рабочую копию. Незакоммиченные правки теряются.
Полезные дополнения. Если нужно просто дописать в последний коммит пару файлов, быстрее git commit --amend. Если из staging надо убрать один файл, например бинарник после go build или случайно обновлённый go.sum, есть git restore --staged <файл>. Если отменили не то, коммит не пропал: он виден в git reflog, а вернуться можно через git reset --soft ORIG_HEAD или HEAD@{1}. Тем же приёмом git reset --soft HEAD~3 склеивает три последних коммита в один перед пушем.
С опубликованным коммитом правило другое: историю общей ветки не переписывают, делают git revert, который создаёт обратный коммит. Если это своя ветка под ревью и переписать всё же нужно, пушат через --force-with-lease, а не голый --force.
Где спотыкаются
Путают HEAD~1 и HEAD. HEAD~1 это родитель последнего коммита, а не сам последний коммит, поэтому команда и отматывает ровно одну ступень.
Отвечают git reset --hard HEAD~1, не задумываясь о режиме. Изменения исчезают из рабочей копии, и вместо «вернуть в staging» получается «выбросить».
Делают reset уже запушенного коммита в общей ветке и пушат с силой. У коллег, успевших подтянуть ветку, история расходится, и чинить это приходится всем.