Как откатить непоследний коммит на production

«Как откатить непоследний коммит на production» — вопрос из категории DevOps, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для отката конкретного коммита в продовой ветке, не затрагивая последующие коммиты, я всегда использую git revert. Это безопасно и прозрачно для команды.

Процесс:

  1. Нахожу хеш коммита для отката.
    git log --oneline --graph
    # Например, вижу:
    # abc1234 (HEAD -> main) Fix typo in footer
    # def5678 Add new payment feature  <-- Этот коммит нужно откатить
    # ghi9012 Update dependencies
  2. Выполняю revert для этого коммита. Git попытается применить обратные изменения. Если возникнут конфликты (потому что код после этого коммита менялся), их нужно разрешить вручную.
    git revert def5678
  3. Коммичу и пущу изменения. 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 создает конфликт, который сложно разрешить (например, из-за множественных изменений в той же области), иногда проще вручную "зачеркнуть" проблемные изменения новым коммитом-фиксом, а затем продолжить разработку новой, исправленной версии функциональности в отдельной ветке.