Cherry-pick — to polecenie Git, które stosuje zmiany z jednego lub kilku istniejących commitów w bieżącej gałęzi. W przeciwieństwie do Merge (przenosi całą gałąź) i Rebase (przenosi sekwencję commitów), cherry-pick wybiera tylko wskazane commity. Według git-scm.com, 2025, cherry-pick jest najbardziej poszukiwany w scenariuszach przenoszenia poprawek między gałęziami wydań.
Najważniejsze
Cherry-pick — to polecenie Git, które kopiuje zmiany z określonego commita i stosuje je jako nowy commit w bieżącej gałęzi. Nazwa pochodzi od metafory „wybierania wiśni”: programista wybiera tylko te commity, które są potrzebne, ignorując pozostałe.
W przeciwieństwie do Merge, cherry-pick nie tworzy merge commita i nie wymaga pełnego scalania gałęzi. W przeciwieństwie do Rebase, cherry-pick nie przenosi sekwencji commitów — tylko wskazane. To czyni cherry-pick idealnym narzędziem do precyzyjnego przenoszenia poprawek.
Według danych Atlassian, 2025, cherry-pick jest używany w 47% zespołów pracujących jednocześnie z kilkoma gałęziami wydań. Cherry-pick jest szczególnie poszukiwany w programowaniu mobilnym, gdzie jednocześnie obsługiwanych jest kilka wersji aplikacji (wydania LTS) i wymagane jest przenoszenie poprawek między nimi.
Podczas wykonywania cherry-pick Git oblicza diff między wskazanym commitem a jego rodzicem, a następnie stosuje ten diff do bieżącej gałęzi. Jeśli zmiany zostały zastosowane bez konfliktu — Git tworzy nowy commit z tą samą wiadomością, ale nowym SHA. Jeśli wystąpi konflikt — cherry-pick jest wstrzymywany do ręcznego rozwiązania.
Składnia cherry-pick jest prosta: podaj hash commita, który chcesz przenieść. Git skopiuje zmiany do bieżącej gałęzi jako nowy commit. Obsługiwane jest przenoszenie kilku commitów naraz oraz całych zakresów.
# Przenoszenie jednego commita do bieżącej gałęzi
git cherry-pick a1b2c3d4
# Przenoszenie kilku commitów
git cherry-pick a1b2c3d4 e5f6g7h8
# Przenoszenie zakresu commitów (od a1b2 do f9e8, nie włączając a1b2)
git cherry-pick a1b2c3d4..f9e8d7c6
Po wykonaniu cherry-pick bieżąca gałąź otrzymuje nowy commit ze zmianami z oryginalnego. Wiadomość commita domyślnie jest kopiowana z oryginalnego, ale może być zmieniona za pomocą flagi -n (nie twórz commita) lub --edit (edytuj wiadomość).
Rozważmy typowy scenariusz: w develop znaleziono i naprawiono krytyczny błąd, który występuje również w gałęzi wydania release/v2.0. Należy przenieść tylko tę poprawkę, bez scalania całego developa z gałęzią wydania.
# Znajdź hash commita z poprawką w develop
git log --oneline develop
# a1b2c3d fix: null check in payment processing
# Przełącz się na gałąź wydania
git checkout release/v2.0
# Zastosuj poprawkę
git cherry-pick a1b2c3d4
# Jeśli konflikt — rozwiąż i kontynuuj
git add src/payment/PaymentProcessor.kt
git cherry-pick --continue
Flaga -x dodaje do wiadomości commita odniesienie do oryginalnego SHA: „(cherry picked from commit a1b2c3d4)”. Ułatwia to śledzenie, skąd został przeniesiony commit. Zaleca się używanie -x we wszystkich scenariuszach, z wyjątkiem tymczasowych szkiców.
W przypadku konfliktu cherry-pick zachowuje się jak merge: Git zatrzymuje się i oznacza pliki z konfliktem. Programista rozwiązuje konflikt, wykonuje git add, a następnie git cherry-pick --continue. Aby anulować — git cherry-pick --abort. Flaga --strategy pozwala określić strategię scalania (na przykład recursive z opcjami).
# Rozwiązywanie konfliktu przy cherry-pick
# Git pokazuje pliki z konfliktem
git status
# Rozwiąż ręcznie, następnie:
git add allowed_file.kt
git cherry-pick --continue
# Lub anuluj cherry-pick:
git cherry-pick --abort
Cherry-pick jest optymalny w scenariuszach, gdzie wymagane jest precyzyjne przenoszenie zmian bez scalania całych gałęzi. Rozważmy pięć głównych przypadków, w których cherry-pick staje się najlepszym wyborem.
Dla programowania mobilnego cherry-pick jest krytycznie ważny przy obsłudze kilku wersji aplikacji. Na przykład, jeśli błąd został znaleziony w wersji 3.2 już wydanej w Google Play, a develop zawiera kod dla wersji 4.0 — cherry-pick pozwala przenieść poprawkę do gałęzi v3.x bez scalania wszystkich breaking changes. Jest to szczególnie istotne w projektach, gdzie jednocześnie obsługiwane są dwie lub więcej głównych wersji z różnymi API i zależnościami.
Przykład z praktyki: w aplikacji mobilnej wykryto crash podczas autoryzacji przez Google Sign-In na Androidzie 12. Poprawka została wprowadzona w develop i przeszła review. Jednak bieżąca gałąź wydania v2.5 jest już na etapie beta-testów. Cherry-pick commita poprawki z develop do release/v2.5 pozwala włączyć poprawkę do najbliższego wydania, nie przenosząc pozostałych zmian, które nie są jeszcze gotowe do wypuszczenia.
Przy używaniu cherry-pick w projektach mobilnych ważne jest uwzględnienie zależności: jeśli poprawka dotyczy plików, które zostały zmienione w develop po punkcie rozgałęzienia gałęzi wydania, cherry-pick może przynieść niekompletny zestaw zmian. W takich przypadkach należy sprawdzić, czy wszystkie powiązane zmiany zostały również przeniesione, w przeciwnym razie aplikacja może się nie zbudować lub działać nieprawidłowo. Zawsze sprawdzaj kompilację po cherry-pick przed wypchnięciem zmian do wspólnej gałęzi.
Trzy główne narzędzia integracji zmian w Git — merge, rebase i cherry-pick — rozwiązują różne zadania. Wybór zależy od tego, jaki zakres zmian należy przenieść i jak powinna wyglądać historia.
| Kryterium | Merge | Rebase | Cherry-pick |
|---|---|---|---|
| Zakres | Cała gałąź | Seria commitów | Wybrane commity |
| Historia | Zachowuje rozgałęzienia | Liniowa | Liniowa |
| Merge commit | Tak (oprócz ff) | Nie | Nie |
| Automatyzacja | Pełna | Po łańcuchu | Tylko wskazane |
| Dla publicznych gałęzi | Bezpieczny | Niebezpieczny | Bezpieczny |
Merge — gdy trzeba scalić dwie gałęzie w całości i zachować informację o rozgałęzieniach. Rebase — gdy trzeba zaktualizować osobistą gałąź do aktualnego stanu z czystą historią. Cherry-pick — gdy potrzebny jest tylko jeden commit lub kilka wybranych commitów.
W praktyce te narzędzia są kombinowane: funkcja jest rozwijana z okresowym rebase na develop, następnie scalana przez --no-ff merge, a w razie potrzeby przeniesienia poprawki do innej gałęzi używany jest cherry-pick. Każde narzędzie rozwiązuje swoje zadanie na swoim etapie.
Cherry-pick — użyteczne, ale potencjalnie niebezpieczne narzędzie przy nieprawidłowym lub nadmiernym używaniu. Główne ryzyka związane są z duplikowaniem commitów, utratą kontekstu i konfliktami przy późniejszych scalaniach.
Zalecenia dotyczące minimalizacji ryzyk: zawsze używaj flagi -x do wskazania oryginalnego SHA, dokumentuj powód cherry-pick w wiadomości commita, i jeśli to możliwe, używaj merge zamiast cherry-pick, gdy pozwala na to kontekst. Jeśli cherry-picków jest dużo — rozważ restrukturyzację gałęzi.
Pipeline'y CI powinny uwzględniać cherry-pick jako osobny scenariusz. Zaleca się skonfigurowanie automatycznego sprawdzania: przy tworzeniu cherry-pick commita CI sprawdza, czy zmodyfikowane pliki odpowiadają oczekiwanemu zestawowi, i uruchamia testy dla dotkniętych modułów. Zmniejsza to ryzyko regresji przy precyzyjnym przenoszeniu zmian między gałęziami.
Często zadawane pytania
Cherry-pick przenosi zmiany z commita do innej gałęzi. Revert tworzy nowy commit, który cofa zmiany określonego commita w tej samej gałęzi. Revert nie usuwa historii — dodaje odwrotną zmianę.
Tak: git cherry-pick A B C — przenoszenie commitów A, B i C po kolei. Lub git cherry-pick A..C — przenoszenie wszystkich commitów od A do C (nie włączając A). Kolejność przenoszenia odpowiada kolejności w poleceniu.
Domyślnie cherry-pick merge commit nie działa, ponieważ merge commit ma dwóch rodziców. Użyj flagi -m 1, aby wskazać, z którym rodzicem porównywać. -m 1 bierze diff względem pierwszego rodzica.
Anulować cherry-pick można przez git reset --hard HEAD~1, jeśli jest to ostatni commit. Jeśli commit już został wypchnięty — użyj git revert <SHA>, aby utworzyć commit cofający.
Nie ma sensu, ale technicznie jest to możliwe. Jeśli commit już istnieje w gałęzi, Git wykryje, że zmiany zostały już zastosowane, i poinformuje: „The previous cherry-pick is now empty, possibly due to conflict resolution.” Commit nie zostanie utworzony ponownie.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również