Cherry-pick — что это такое, механизм и применение в Git

Автор: IT Sectr Опубликовано: 2026-05-10 Время чтения: 10 мин

Cherry-pick — это команда Git, которая применяет изменения из одного или нескольких существующих коммитов в текущую ветку. В отличие от Merge (переносит всю ветку) и Rebase (переносит последовательность коммитов), cherry-pick выбирает только указанные коммиты. По данным git-scm.com, 2025, cherry-pick наиболее востребован в сценариях переноса исправлений между релизными ветками.

Главное

  • Cherry-pick — перенос отдельных коммитов между ветками без полного слияния
  • Точечный перенос — выбираются конкретные коммиты, а не вся ветка целиком
  • Новые SHA — каждый cherry-pick создаёт новый коммит с изменённым хешем
  • Hotfix-сценарий — cherry-pick удобен для переноса исправления в релизную ветку
  • Риски — дублирование коммитов и потеря контекста при активном использовании

Что такое Cherry-pick?

Cherry-pick — это команда Git, которая копирует изменения из указанного коммита и применяет их как новый коммит в текущей ветке. Название происходит от метафоры "выбирать вишенки": разработчик выбирает только те коммиты, которые нужны, игнорируя остальные.

В отличие от Merge, cherry-pick не создаёт merge commit и не требует полного слияния веток. В отличие от Rebase, cherry-pick не переносит последовательность коммитов — только указанные. Это делает cherry-pick идеальным инструментом для точечного переноса исправлений.

По данным Atlassian, 2025, cherry-pick используется в 47% команд, работающих с несколькими релизными ветками одновременно. Особенно востребован cherry-pick в мобильной разработке, где одновременно поддерживаются несколько версий приложения (LTS-релизы) и требуется переносить исправления между ними.

Механизм переноса

При выполнении cherry-pick Git вычисляет diff между указанным коммитом и его родителем, затем применяет этот diff к текущей ветке. Если изменения применились без конфликта — Git создаёт новый коммит с тем же сообщением, но новым SHA. Если есть конфликт — cherry-pick приостанавливается для ручного разрешения.

Как работает Cherry-pick

Синтаксис cherry-pick прост: укажите хеш коммита, который нужно перенести. Git скопирует изменения в текущую ветку как новый коммит. Поддерживается перенос нескольких коммитов за раз и целых диапазонов.

bash
# Перенос одного коммита в текущую ветку
git cherry-pick a1b2c3d4

# Перенос нескольких коммитов
git cherry-pick a1b2c3d4 e5f6g7h8

# Перенос диапазона коммитов (от a1b2 до f9e8, не включая a1b2)
git cherry-pick a1b2c3d4..f9e8d7c6

После выполнения cherry-pick текущая ветка получает новый коммит с изменениями из исходного. Сообщение коммита по умолчанию копируется из исходного, но может быть изменено флагом -n (не создавать коммит) или --edit (редактировать сообщение).

Пример переноса исправления

Рассмотрим типичный сценарий: в develop найден и исправлен критический баг, который также присутствует в релизной ветке release/v2.0. Нужно перенести только этот фикс, не сливая всю develop в релизную ветку.

bash
# Найти хеш коммита с исправлением в develop
git log --oneline develop
# a1b2c3d fix: null check in payment processing

# Переключиться на релизную ветку
git checkout release/v2.0

# Применить исправление
git cherry-pick a1b2c3d4

# Если конфликт — разрешить и продолжить
git add src/payment/PaymentProcessor.kt
git cherry-pick --continue

Флаг -x добавляет в сообщение коммита ссылку на исходный SHA: "(cherry picked from commit a1b2c3d4)". Это упрощает отслеживание, откуда был перенесён коммит. Рекомендуется использовать -x во всех сценариях, кроме временных черновиков.

Работа с конфликтами

При конфликте cherry-pick ведёт себя как merge: Git останавливается и помечает конфликтные файлы. Разработчик разрешает конфликт, делает git add и выполняет git cherry-pick --continue. Для отмены — git cherry-pick --abort. Флаг --strategy позволяет указать стратегию слияния (например, recursive с опциями).

bash
# Разрешение конфликта при cherry-pick
# Git показывает конфликтные файлы
git status

# Разрешить вручную, затем:
git add разрешённый_файл.kt
git cherry-pick --continue

# Или отменить cherry-pick:
git cherry-pick --abort

Когда применять Cherry-pick

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

  • Перенос hotfix — исправление найдено в develop, но нужно применить его в релизной ветке (release/v2.0). Cherry-pick переносит только коммит фикса, не затрагивая незавершённые фичи из develop
  • Backport в старые версии — исправление для текущей версии нужно перенести в LTS-релиз. Вместо слияния всей текущей кодовой базы cherry-pick выбирает только нужные коммиты
  • Отмена коммита в другой ветке — если коммит был сделан не в ту ветку, cherry-pick переносит его в правильную, а исходный коммит отменяется
  • Перенос документации — изменения в README или конфигурационных файлах, которые должны быть во всех ветках, удобно переносить через cherry-pick
  • Выборочное применение — из ветки-прототипа нужно взять только один удачный коммит, не перенося весь прототип в основную разработку

Для мобильной разработки cherry-pick критически важен при поддержке нескольких версий приложения. Например, если баг найден в версии 3.2, уже выпущенной в Google Play, а develop содержит код для версии 4.0 — cherry-pick позволяет перенести исправление в ветку v3.x без слияния всех breaking changes. Это особенно актуально для проектов, где одновременно поддерживаются две и более мажорные версии с разными API и зависимостями.

Пример из практики: в мобильном приложении обнаружен crash при авторизации через Google Sign-In на Android 12. Исправление внесено в develop и прошло ревью. Однако текущая релизная ветка v2.5 уже на этапе beta-тестирования. Cherry-pick коммита фикса из develop в release/v2.5 позволяет включить исправление в ближайший релиз, не перенося остальные изменения, которые ещё не готовы к выпуску.

При использовании cherry-pick в мобильных проектах важно учитывать зависимости: если исправление затрагивает файлы, которые были изменены в develop после точки расхождения релизной ветки, cherry-pick может принести неполный набор изменений. В таких случаях необходимо проверить, что все связанные изменения также перенесены, иначе приложение может не собраться или работать некорректно. Всегда проверяйте сборку после cherry-pick перед тем, как пушить изменения в общую ветку.

Cherry-pick vs Merge vs Rebase

Три основных инструмента интеграции изменений в Git — merge, rebase и cherry-pick — решают разные задачи. Выбор зависит от того, какой объём изменений нужно перенести и как должна выглядеть история.

КритерийMergeRebaseCherry-pick
ОбъёмВся веткаСерия коммитовВыбранные коммиты
ИсторияСохраняет ветвлениеЛинейнаяЛинейная
Merge commitДа (кроме ff)НетНет
АвтоматизацияПолнаяПо цепочкеТолько указанные
Для публичных ветокБезопасенОпасенБезопасен

Merge — когда нужно объединить две ветки целиком и сохранить информацию о ветвлении. Rebase — когда нужно обновить личную ветку до актуального состояния с чистой историей. Cherry-pick — когда нужен только один коммит или несколько выбранных коммитов.

На практике эти инструменты комбинируются: фича разрабатывается с периодическим rebase на develop, затем сливается через --no-ff merge, а при необходимости перенести исправление в другую ветку используется cherry-pick. Каждый инструмент решает свою задачу на своём этапе.

Риски и ограничения Cherry-pick

Cherry-pick — полезный, но потенциально опасный инструмент при неправильном или чрезмерном использовании. Основные риски связаны с дублированием коммитов, потерей контекста и конфликтами при последующих слияниях.

  • Дублирование коммитов — если тот же коммит позже попадёт в ветку через merge, Git создаст второй, идентичный по изменениям коммит. Это загрязняет историю и затрудняет git bisect
  • Потеря контекста — cherry-pick переносит diff, но не переносит информацию о родительских коммитах и зависимостях. Если cherry-pick применил коммит A без коммита B, от которого A зависел, могут возникнуть логические ошибки
  • Конфликты при merge — после cherry-pick при полном слиянии веток Git может увидеть те же изменения дважды и создать конфликты, которых можно было избежать при обычном merge
  • Отсутствие связи — без флага -x невозможно понять, что коммит был перенесён из другой ветки. При поиске origin изменения разработчик может потратить часы на выяснение происхождения коммита

Рекомендации по минимизации рисков: всегда используйте флаг -x для указания исходного SHA, документируйте причину cherry-pick в сообщении коммита, и по возможности используйте merge вместо cherry-pick, когда это позволяет контекст. Если cherry-pick-ов становится много — рассмотрите реструктуризацию веток.

Автоматизация проверок при Cherry-pick

CI-пайплайны должны учитывать cherry-pick как отдельный сценарий. Рекомендуется настроить автоматическую проверку: при создании cherry-pick коммита CI проверяет, что изменённые файлы соответствуют ожидаемому набору, и запускает тесты для затронутых модулей. Это снижает риск регрессии при точечном переносе изменений между ветками.

Часто задаваемые вопросы

Чем cherry-pick отличается от git revert?

Cherry-pick переносит изменения из коммита в другую ветку. Revert создаёт новый коммит, который отменяет изменения указанного коммита в той же ветке. Revert не удаляет историю — он добавляет обратное изменение.

Можно ли cherry-pick сразу несколько коммитов?

Да: git cherry-pick A B C — перенос коммитов A, B и C по порядку. Или git cherry-pick A..C — перенос всех коммитов от A до C (не включая A). Порядок переноса соответствует порядку в команде.

Как cherry-pick работает с merge commit'ами?

По умолчанию cherry-pick merge commit не работает, потому что у merge commit два родителя. Используйте флаг -m 1, чтобы указать, с каким родителем сравнивать. -m 1 берёт diff относительно первого родителя.

Что делать, если cherry-pick создал неверный коммит?

Отменить cherry-pick можно через git reset --hard HEAD~1, если это последний коммит. Если коммит уже запушен — используйте git revert , чтобы создать отменяющий коммит.

Может ли cherry-pick перенести коммит из одной ветки в ту же?

Нет смысла, но технически возможно. Если коммит уже существует в ветке, Git обнаружит, что изменения уже применены, и сообщит: "The previous cherry-pick is now empty, possibly due to conflict resolution." Коммит не будет создан повторно.

Итоги

  • Cherry-pick — перенос выбранных коммитов между ветками без полного слияния
  • Механизм — Git вычисляет diff коммита и применяет его как новый коммит в target
  • Hotfix-сценарий — основной use case: перенос исправления в релизную ветку
  • Флаг -x — обязателен для документирования исходного SHA перенесённого коммита
  • Риски — дублирование коммитов, потеря контекста, конфликты при будущих merge
  • Отличие от Merge — cherry-pick точечный, merge объединяет ветки целиком
  • Отличие от Rebase — cherry-pick выбирает коммиты вручную, rebase автоматический для цепочки

Мы разработаем мобильное приложение под ключ

IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.

Обсудить проект

Читайте также