Ответ
Для отката конкретного коммита в продовой ветке, не затрагивая последующие коммиты, я всегда использую git revert. Это безопасно и прозрачно для команды.
Процесс:
- Нахожу хеш коммита для отката.
git log --oneline --graph # Например, вижу: # abc1234 (HEAD -> main) Fix typo in footer # def5678 Add new payment feature <-- Этот коммит нужно откатить # ghi9012 Update dependencies - Выполняю revert для этого коммита. Git попытается применить обратные изменения. Если возникнут конфликты (потому что код после этого коммита менялся), их нужно разрешить вручную.
git revert def5678 - Коммичу и пущу изменения. Git автоматически создаст коммит с сообщением типа "Revert 'Add new payment feature'".
git push origin main
Почему не git reset или rebase?
git reset --hard def5678 удалит не только коммит def5678, но и все коммиты после него (abc1234). Это перезапишет историю, что вызовет проблемы у всех, кто уже забрал себе старую версию ветки main. Force-push (git push --force) в продовую ветку — крайне рискованная операция.
Если revert создает конфликт, который сложно разрешить (например, из-за множественных изменений в той же области), иногда проще вручную "зачеркнуть" проблемные изменения новым коммитом-фиксом, а затем продолжить разработку новой, исправленной версии функциональности в отдельной ветке.