Gernar
Frontend DeveloperGit, сборка и DevOps

Интервью-вопрос

Что такое cherry-pick в Git

Cherry-pick нужен, когда вы хотите взять конкретное изменение из другой ветки без полного слияния. На практике важно проверить зависимости коммита, конфликты, сборку и затронутый UI-сценарий.

Добавлен
Редакция

Подготовьте короткий ответ и пару деталей на случай уточняющих вопросов.

🐰0
🥚0

Мини-квиз

Проверка перед разбором

Несколько быстрых вопросов перед разбором. Так проще поймать места, которые только кажутся понятными.

Вопрос 1 из 50 правильно

Как лучше объяснить cherry-pick на интервью?

Вы хотите дать короткое и точное определение без лишних деталей.

Варианты ответа

Разбор

Разобраться, а не зазубрить

Дальше разбираем суть, типичные уточнения и места, где легко сказать лишнее или перепутать термины.

Базовая идея

Cherry-pick отвечает на задачу: взять одно конкретное изменение из другой ветки и применить его здесь. Вы не сливаете всю ветку, не переносите весь ее контекст и не делаете ветку линейной. Вы просите Git взять diff выбранного коммита и наложить его на текущую ветку.

Базовый пример:

git switch release
git cherry-pick abc123

После этого в ветке release появится новый коммит с теми же изменениями, что были в abc123. Hash будет другим, потому что у нового коммита другой родитель и другое место в истории.

Когда это полезно фронтенд-разработчику

Самый понятный сценарий на фронтенде: вы исправили баг в feature-ветке, но feature еще не готова к релизу. Например, в ней есть большой редизайн, а маленький fix формы нужен в production уже сегодня. Тогда cherry-pick позволяет перенести только fix, не подтягивая весь незавершенный код.

Хорошая формулировка на интервью:

Я использую cherry-pick для точечных переносов, например hotfix или backport в release-ветку. Но сначала проверяю, что коммит не зависит от других изменений, иначе можно перенести только половину решения.

Это звучит сильнее, чем просто назвать команду, потому что вы сразу показываете границы инструмента.

Как выбрать между cherry-pick, merge и rebase

Как выбрать подход

1Нужно перенести один независимый fix?
Используйте `git cherry-pick <hash>` и проверьте сборку.
2Нужна вся feature-ветка с историей?
Выбирайте merge или pull request, а не набор cherry-pick.
3Коммит зависит от предыдущих изменений?
Перенесите зависимые коммиты в правильном порядке или не дробите цепочку.
4Конфликт выглядит слишком большим?
Сделайте `git cherry-pick --abort` и обсудите более безопасный способ переноса.

Cherry-pick не лучше и не хуже merge сам по себе. Это инструмент для другой задачи. Если вы хотите интегрировать всю ветку, сохранить контекст review и не потерять связанные изменения, обычно нужен merge или pull request. Если вы хотите взять один самостоятельный fix, cherry-pick может быть быстрее и чище.

Rebase тоже решает другую задачу. Он переносит цепочку коммитов на новую базу и переписывает историю этой цепочки. Cherry-pick копирует выбранные изменения в текущую ветку. На интервью полезно прямо проговорить эту разницу.

Безопасный порядок действий

Безопасный перенос
  1. 1Перейти в целевую ветку и обновить ее
  2. 2Проверить, что нужный коммит самодостаточен
  3. 3Выполнить `git cherry-pick <hash>`
  4. 4Решить конфликты или отменить перенос
  5. 5Запустить тесты, линтер или хотя бы локальную сборку
Опасный перенос
  1. 1Копировать случайный hash из другой ветки
  2. 2Игнорировать зависимые коммиты
  3. 3Разрешать конфликты без понимания кода
  4. 4Не проверять результат в UI
  5. 5Пушить fix в release без проверки истории

Перед командой стоит убедиться, что вы находитесь в целевой ветке. Частая практическая ошибка: разработчик cherry-pick-ит fix не туда, потом получает лишний коммит в рабочей ветке и тратит время на откат.

Плохой сценарий:

# Плохо: вы не проверили текущую ветку
git cherry-pick abc123
git push

Так можно отправить fix не в ту ветку, запустить лишний deploy или оставить release без нужного исправления. Безопаснее сначала проверить ветку, посмотреть состав коммита и прогнать минимальные проверки.

Безопаснее так:

git status
git switch release
git pull --ff-only
git show --stat abc123
git cherry-pick abc123
npm test

Набор проверок зависит от проекта. Если тестов нет, все равно проверьте хотя бы сборку или конкретный пользовательский сценарий в браузере. Для фикса формы это ввод, submit, disabled-состояние, сообщение об ошибке и повторная отправка. Для сетевого фикса это один запрос вместо лишних дублей, корректная отмена или игнорирование устаревшего ответа.

Конфликты и откат

Конфликт при cherry-pick означает, что Git не смог автоматически применить изменения к текущей ветке. Это нормальная ситуация, особенно если ветки давно разошлись или один и тот же файл менялся в разных местах.

Если вы понимаете конфликт, исправьте файлы, добавьте их в индекс и продолжите операцию:

git status
# исправить файлы
git add src/Form.tsx
git cherry-pick --continue

Если конфликт слишком большой или вы поняли, что коммит зависит от других изменений, лучше отменить перенос:

git cherry-pick --abort

На интервью не стоит говорить, что вы просто удаляете конфликтные куски. Лучше сказать, что проверяете смысл изменений и выбираете между корректным продолжением и безопасным откатом.

Главные риски

Риск cherry-pick не в самой команде, а в ложном ощущении точности. Коммит может выглядеть маленьким, но зависеть от нового API, обновленного типа, CSS-переменной, миграции или изменения в общей утилите. В Git операция пройдет, но приложение может сломаться позже: форма отправит лишний запрос, компонент покажет неверное состояние, SSR получит mismatch или обработка ошибки исчезнет.

Еще один риск связан с дублированием. Если похожие изменения уже попали в ветку другим путем, повторный cherry-pick может дать пустой перенос, конфликт или почти одинаковый код в двух местах. Поэтому полезно смотреть историю через git log, git show и проверять pull request, откуда взят коммит.

Практический вывод

Короткий сильный ответ должен быть таким: cherry-pick переносит не ветку, а выбранное изменение, создает новый коммит и требует проверки зависимостей. Для frontend это особенно важно, потому что ошибка может проявиться не сразу в Git, а в сборке, роутинге, UI-сценарии или интеграции с API.

Если хотите звучать уверенно, добавьте пример из рабочего процесса: hotfix в release, backport исправления или перенос маленького исправления без незавершенной feature-ветки. Затем назовите команды для конфликта: --continue и --abort.

Частые ошибки

Где обычно ошибаются

Проверьте формулировки, которые звучат уверенно, но на интервью быстро выдают пробелы.

  1. 1

    Считать cherry-pick полноценным слиянием

    Cherry-pick не переносит всю ветку и не сохраняет ее историю как merge. Он применяет изменения выбранного коммита к текущей ветке. Если сказать иначе, вас легко поймают вопросом про новый hash и родителей коммита.
  2. 2

    Переносить зависимый коммит отдельно

    Коммит может использовать типы, компоненты, CSS или API-контракт из соседних коммитов. Если перенести только часть, проект может пройти Git-операцию, но упасть на сборке или дать баг в UI. Перед cherry-pick проверьте diff и связанные изменения.
  3. 3

    Не проверять результат после успешной команды

    Успешный git cherry-pick означает только то, что Git применил изменения. Он не гарантирует, что приложение собирается, тесты проходят и сценарий работает в браузере. После переноса нужен минимум локальной проверки.
  4. 4

    Путать abort, continue и quit

    git cherry-pick --abort откатывает незавершенный перенос, --continue завершает его после решения конфликтов, а --quit прекращает режим операции, оставляя изменения в рабочем дереве. На интервью лучше уверенно назвать хотя бы --abort и --continue.
  5. 5

    Использовать cherry-pick вместо нормального процесса

    Если команда постоянно переносит большие куски работы cherry-pick, история быстро становится запутанной. Для обычной интеграции feature-ветки лучше pull request, merge или rebase по правилам команды. Cherry-pick хорош как точечный инструмент, а не как основной workflow.

Follow-up

Что могут спросить дальше

Короткие ответы на вопросы, которыми проверяют понимание Git-операций и рисков переноса изменений.

Живые ответы

Видео с похожим вопросом

Если найдем публичные интервью с таким вопросом, добавим их сюда. Их удобно смотреть после теории, чтобы свериться с живыми ответами.

Пока видео нет. Когда появятся подходящие публичные интервью, добавим их в этот блок, чтобы можно было сравнить разбор с тем, как отвечают реальные кандидаты.

Содержание