Cherry-pick — це команда Git, яка застосовує зміни з одного або кількох існуючих комітів у поточну гілку. На відміну від Merge (переносить цілу гілку) та Rebase (переносить послідовність комітів), cherry-pick вибирає лише вказані коміти. За даними git-scm.com, 2025, cherry-pick найбільш затребуваний у сценаріях перенесення виправлень між релізними гілками.
Головне
Cherry-pick — це команда Git, яка копіює зміни з вказаного коміту та застосовує їх як новий коміт у поточній гілці. Назва походить від метафори «вибирати вишеньки»: розробник вибирає тільки ті коміти, які потрібні, ігноруючи решту.
На відміну від Merge, cherry-pick не створює merge-коміт і не вимагає повного злиття гілок. На відміну від Rebase, cherry-pick не переносить послідовність комітів — тільки вказані. Це робить cherry-pick ідеальним інструментом для точкового перенесення виправлень.
За даними Atlassian, 2025, cherry-pick використовується в 47% команд, які працюють з кількома релізними гілками одночасно. Особливо затребуваний cherry-pick у мобільній розробці, де одночасно підтримуються кілька версій застосунку (LTS-релізи) і потрібно переносити виправлення між ними.
При виконанні cherry-pick Git обчислює diff між вказаним комітом та його батьком, потім застосовує цей diff до поточної гілки. Якщо зміни застосувалися без конфлікту — Git створює новий коміт із тим самим повідомленням, але новим SHA. Якщо є конфлікт — cherry-pick призупиняється для ручного вирішення.
Синтаксис cherry-pick простий: вкажіть хеш коміту, який потрібно перенести. Git скопіює зміни в поточну гілку як новий коміт. Підтримується перенесення кількох комітів за раз і цілих діапазонів.
# Перенесення одного коміту в поточну гілку
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 у релізну гілку.
# Знайти хеш коміту з виправленням у 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 з опціями).
# Вирішення конфлікту при cherry-pick
# Git показує конфліктні файли
git status
# Вирішити вручну, потім:
git add разрешённый_файл.kt
git cherry-pick --continue
# Або скасувати cherry-pick:
git cherry-pick --abort
Cherry-pick оптимальний у сценаріях, де потрібне точкове перенесення змін без злиття цілих гілок. Розглянемо п’ять основних випадків, коли 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 перед тим, як пушити зміни в спільну гілку.
Три основні інструменти інтеграції змін у Git — merge, rebase та cherry-pick — вирішують різні завдання. Вибір залежить від того, який обсяг змін потрібно перенести і як має виглядати історія.
| Критерій | Merge | Rebase | Cherry-pick |
|---|---|---|---|
| Обсяг | Ціла гілка | Серія комітів | Вибрані коміти |
| Історія | Зберігає розгалуження | Лінійна | Лінійна |
| Merge-коміт | Так (крім ff) | Ні | Ні |
| Автоматизація | Повна | По ланцюжку | Тільки вказані |
| Для публічних гілок | Безпечний | Небезпечний | Безпечний |
Merge — коли потрібно об’єднати дві гілки цілком і зберегти інформацію про розгалуження. Rebase — коли потрібно оновити особисту гілку до актуального стану з чистою історією. Cherry-pick — коли потрібен лише один коміт або кілька вибраних комітів.
На практиці ці інструменти комбінуються: фіча розробляється з періодичним rebase на develop, потім зливається через --no-ff merge, а при необхідності перенести виправлення в іншу гілку використовується cherry-pick. Кожен інструмент вирішує своє завдання на своєму етапі.
Cherry-pick — корисний, але потенційно небезпечний інструмент при неправильному або надмірному використанні. Основні ризики пов’язані з дублюванням комітів, втратою контексту та конфліктами при подальших злиттях.
Рекомендації щодо мінімізації ризиків: завжди використовуйте прапорець -x для вказівки вихідного SHA, документуйте причину cherry-pick у повідомленні коміту, і по можливості використовуйте merge замість cherry-pick, коли це дозволяє контекст. Якщо cherry-pick-ів стає багато — розгляньте реструктуризацію гілок.
CI-пайплайни повинні враховувати cherry-pick як окремий сценарій. Рекомендується налаштувати автоматичну перевірку: при створенні cherry-pick коміту CI перевіряє, що змінені файли відповідають очікуваному набору, і запускає тести для порушених модулів. Це знижує ризик регресії при точковому перенесенні змін між гілками.
Часті запитання
Cherry-pick переносить зміни з коміту в іншу гілку. Revert створює новий коміт, який скасовує зміни вказаного коміту в тій самій гілці. Revert не видаляє історію — він додає зворотну зміну.
Так: git cherry-pick A B C — переносить коміти A, B та C по порядку. Або git cherry-pick A..C — переносить всі коміти від A до C (не включаючи A). Порядок перенесення відповідає порядку в команді.
За замовчуванням cherry-pick merge-коміту не працює, тому що у merge-коміту два батьки. Використовуйте прапорець -m 1, щоб вказати, з яким батьком порівнювати. -m 1 бере diff відносно першого батька.
Скасувати cherry-pick можна через git reset --hard HEAD~1, якщо це останній коміт. Якщо коміт вже запушено — використовуйте git revert <SHA>, щоб створити скасовуючий коміт.
Немає сенсу, але технічно можливо. Якщо коміт вже існує в гілці, Git виявить, що зміни вже застосовано, і повідомить: «The previous cherry-pick is now empty, possibly due to conflict resolution.» Коміт не буде створено повторно.
Підсумки
Ми розробимо мобільний застосунок під ключ
IT Sectr створює застосунки для iOS та Android для стартапів і бізнесу з 2017 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також