В проекте с микросервисной архитектурой обнаружена критическая уязвимость безопасности, внесенная коммитом abc123 два месяца назад. Этот коммит затрагивает общую библиотеку аутентификации, используемую во всех сервисах. Ситуация осложняется следующими факторами:

Оптимальная стратегия — создать единый исправляющий коммит с помощью git revert abc123 в основной ветке и затем выполнить cherry-pick этого коммита во все релизные ветки.

Короткий ответ

Что ответить на собеседовании

Оптимальная стратегия — создать единый исправляющий коммит с помощью git revert abc123 в основной ветке и затем выполнить cherry-pick этого коммита во все релизные ветки.

Подробный разбор

Ответ с пояснениями

Условие

В проекте с микросервисной архитектурой обнаружена критическая уязвимость безопасности, внесенная коммитом abc123 два месяца назад. Этот коммит затрагивает общую библиотеку аутентификации, используемую во всех сервисах. Ситуация осложняется следующими факторами:

  1. После проблемного коммита было сделано более 200 коммитов в основной ветке.
  2. От основной ветки было создано пять релизных веток, в которых также есть этот коммит.
  3. Несколько команд разработчиков создали feature-ветки от разных точек истории.
  4. Некоторые последующие коммиты в основной ветке частично исправляют проблему, но не полностью.
  5. Все затронутые ветки уже развернуты в различных средах (тестовой, препродакшен, продакшен).

Какая стратегия будет эффективной для устранения уязвимости во всех ветках с минимальным риском нарушения работы проекта?

  • Создать серию revert-коммитов для проблемного коммита и всех коммитов, которые частично его исправляли, затем создать новый коммит с полным исправлением
  • Создать hotfix-ветку от точки до проблемного коммита, внести исправления и выполнить слияние этой ветки со всеми затронутыми ветками
  • Создать единый исправляющий коммит с помощью git revert abc123 в основной ветке и затем выполнить cherry-pick этого коммита во все релизные ветки
  • Использовать git bisect для точного определения проблемного кода, создать патч и применить его ко всем веткам с помощью git am
  • Использовать git rebase -i для редактирования проблемного коммита в каждой ветке, с последующим принудительным обновлением (force-push)

Ответ

Оптимальная стратегия — создать единый исправляющий коммит с помощью git revert abc123 в основной ветке и затем выполнить cherry-pick этого коммита во все релизные ветки.

Обоснование:

  • git revert создаёт новый коммит, отменяющий изменения проблемного коммита, что безопасно и не ломает историю.
  • Cherry-pick позволяет аккуратно перенести исправление в релизные ветки без необходимости сложных слияний или перебазирования.
  • Это минимизирует риск конфликтов и нарушений работы, так как не требует переписывания истории (в отличие от rebase -i и force-push).
  • Создание серии revert-коммитов для всех частичных исправлений усложнит историю и может привести к ошибкам.
  • Создание hotfix-ветки от точки до проблемного коммита и слияние во все ветки — сложный и рискованный процесс из-за большого количества веток и коммитов.
  • Использование git bisect здесь не нужно, так как проблемный коммит уже известен.

Таким образом, последовательность действий:

# В основной ветке
git revert abc123
# Полученный коммит cherry-pick в релизные ветки
git checkout release-branch-1
git cherry-pick <revert-commit-hash>
# Повторить для всех релизных веток

Это позволит быстро и безопасно устранить уязвимость во всех ветках.

Практика в реальном времени

Подготовьтесь к следующему собеседованию

Interview Boost учитывает вакансию, резюме и технологии и помогает сформулировать ответ прямо во время интервью.

Начать подготовку