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 обаче вече е в етап на бета тестване. 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 г. Ще ви консултираме и ще предложим най-доброто решение.
Прочетете също