Спосіб залежить від того, чи коміт уже відправлено в спільний репозиторій.
Коміт ще локальний - git reset пересуває гілку назад:
git reset --soft HEAD~1 # коміт скасовано, зміни лишилися в індексі (staged)
git reset HEAD~1 # (--mixed) зміни лишилися у файлах, але не staged
git reset --hard HEAD~1 # коміт і зміни видалено повністю
Найчастіше потрібен --soft чи --mixed: виправити повідомлення, додати забутий файл, розбити коміт. --hard знищує незбережену роботу.
Виправити лише останній коміт - git commit --amend: змінити повідомлення чи додати файли.
Коміт уже в спільній гілці - git revert створює новий коміт, що скасовує зміни старого. Історія не переписується, тож колегам нічого не ламається:
git revert a1b2c3d
git push
Головна відмінність: reset переписує історію (коміт ніби зник), revert додає до неї (коміт є, і є його скасування). Для main, з якого вже розгорнуто прод, - лише revert.
Для окремих файлів є git restore: git restore app/User.php - відкинути незакомічені зміни у файлі, git restore --staged app/User.php - прибрати з індексу.