Cherry-pick è un comando Git che applica le modifiche di uno o più commit esistenti al ramo corrente. A differenza di Merge (trasferisce l'intero ramo) e Rebase (trasferisce una sequenza di commit), cherry-pick seleziona solo i commit specificati. Secondo git-scm.com, 2025, cherry-pick è più richiesto negli scenari di trasferimento di correzioni tra rami di release.
Punti chiave
Cherry-pick è un comando Git che copia le modifiche da un commit specificato e le applica come un nuovo commit nel ramo corrente. Il nome deriva dalla metafora “raccogliere ciliegie”: lo sviluppatore seleziona solo i commit di cui ha bisogno, ignorando il resto.
A differenza di Merge, cherry-pick non crea un commit di unione e non richiede l'unione completa dei rami. A differenza di Rebase, cherry-pick non trasferisce una sequenza di commit — solo quelli specificati. Questo rende cherry-pick uno strumento ideale per il trasferimento mirato di correzioni.
Secondo Atlassian, 2025, cherry-pick è utilizzato dal 47% dei team che lavorano con più rami di release contemporaneamente. Cherry-pick è particolarmente richiesto nello sviluppo mobile, dove vengono mantenute più versioni di un'applicazione (release LTS) contemporaneamente ed è necessario trasferire correzioni tra di esse.
Durante l'esecuzione di cherry-pick, Git calcola il diff tra il commit specificato e il suo genitore, quindi applica questo diff al ramo corrente. Se le modifiche vengono applicate senza conflitti — Git crea un nuovo commit con lo stesso messaggio ma un nuovo SHA. Se c'è un conflitto — cherry-pick si ferma per la risoluzione manuale.
La sintassi di cherry-pick è semplice: specifica l'hash del commit da trasferire. Git copia le modifiche nel ramo corrente come un nuovo commit. Il trasferimento di più commit contemporaneamente e di interi intervalli è supportato.
# Trasferire un singolo commit nel ramo corrente
git cherry-pick a1b2c3d4
# Trasferire più commit
git cherry-pick a1b2c3d4 e5f6g7h8
# Trasferire un intervallo di commit (da a1b2 a f9e8, escluso a1b2)
git cherry-pick a1b2c3d4..f9e8d7c6
Dopo l'esecuzione di cherry-pick, il ramo corrente riceve un nuovo commit con le modifiche dalla sorgente. Il messaggio del commit viene copiato dalla sorgente per impostazione predefinita, ma può essere modificato con il flag -n (non creare commit) o --edit (modificare il messaggio).
Consideriamo uno scenario tipico: un bug critico viene trovato e corretto in develop, che esiste anche nel ramo di release release/v2.0. Solo questa correzione deve essere trasferita, senza unire tutto develop nel ramo di release.
# Trovare l'hash del commit con la correzione in develop
git log --oneline develop
# a1b2c3d fix: null check in payment processing
# Passare al ramo di release
git checkout release/v2.0
# Applicare la correzione
git cherry-pick a1b2c3d4
# In caso di conflitto — risolvere e continuare
git add src/payment/PaymentProcessor.kt
git cherry-pick --continue
Il flag -x aggiunge un riferimento allo SHA originale nel messaggio del commit: “(cherry picked from commit a1b2c3d4)”. Ciò facilita il tracciamento della provenienza del commit trasferito. Si raccomanda di usare -x in tutti gli scenari tranne le bozze temporanee.
In caso di conflitto, cherry-pick si comporta come merge: Git si ferma e segna i file in conflitto. Lo sviluppatore risolve il conflitto, esegue git add e poi git cherry-pick --continue. Per annullare — git cherry-pick --abort. Il flag --strategy consente di specificare una strategia di unione (ad esempio, recursive con opzioni).
# Risoluzione di un conflitto durante cherry-pick
# Git mostra i file in conflitto
git status
# Risolvere manualmente, poi:
git add file_autorizzato.kt
git cherry-pick --continue
# Oppure annullare cherry-pick:
git cherry-pick --abort
Cherry-pick è ottimale negli scenari in cui è necessario un trasferimento mirato di modifiche senza unire interi rami. Esaminiamo cinque casi principali in cui cherry-pick diventa la scelta migliore.
Per lo sviluppo mobile, cherry-pick è fondamentale quando si supportano più versioni di un'applicazione. Ad esempio, se un bug viene trovato nella versione 3.2 già pubblicata su Google Play, e develop contiene codice per la versione 4.0 — cherry-pick consente di trasferire la correzione al ramo v3.x senza unire tutte le modifiche sostanziali. Ciò è particolarmente rilevante per i progetti in cui due o più versioni principali con API e dipendenze diverse vengono mantenute contemporaneamente.
Esempio pratico: in un'applicazione mobile viene rilevato un crash durante l'autenticazione tramite Google Sign-In su Android 12. La correzione viene effettuata in develop e supera la revisione del codice. Tuttavia, il ramo di release corrente v2.5 è già in fase di beta testing. Il cherry-pick del commit di correzione da develop a release/v2.5 consente di includere la correzione nella prossima release senza trasferire altre modifiche che non sono ancora pronte per la pubblicazione.
Quando si utilizza cherry-pick in progetti mobili, è importante considerare le dipendenze: se la correzione riguarda file che sono stati modificati in develop dopo il punto di divergenza del ramo di release, cherry-pick potrebbe portare un set incompleto di modifiche. In tali casi, è necessario verificare che tutte le modifiche correlate siano state anch'esse trasferite, altrimenti l'applicazione potrebbe non compilare o funzionare in modo errato. Controllare sempre la build dopo cherry-pick prima di inviare le modifiche al ramo condiviso.
I tre strumenti principali per l'integrazione delle modifiche in Git — merge, rebase e cherry-pick — risolvono compiti diversi. La scelta dipende da quanto cambiamento deve essere trasferito e come deve apparire la cronologia.
| Criterio | Merge | Rebase | Cherry-pick |
|---|---|---|---|
| Ambito | Intero ramo | Serie di commit | Commit selezionati |
| Cronologia | Preserva ramificazioni | Lineare | Lineare |
| Commit di unione | Sì (tranne ff) | No | No |
| Automazione | Completa | A catena | Solo specificati |
| Per rami pubblici | Sicuro | Pericoloso | Sicuro |
Merge — quando è necessario unire due rami completamente e preservare le informazioni di ramificazione. Rebase — quando è necessario aggiornare un ramo personale allo stato più recente con una cronologia pulita. Cherry-pick — quando è necessario solo un commit o più commit selezionati.
In pratica, questi strumenti vengono combinati: una funzionalità viene sviluppata con rebase periodico su develop, poi unita tramite --no-ff merge, e quando è necessario trasferire una correzione a un altro ramo, viene utilizzato cherry-pick. Ogni strumento risolve il proprio compito nella propria fase.
Cherry-pick è uno strumento utile ma potenzialmente pericoloso se usato in modo errato o eccessivo. I principali rischi sono legati alla duplicazione dei commit, alla perdita di contesto e ai conflitti durante le unioni successive.
Raccomandazioni per minimizzare i rischi: utilizzare sempre il flag -x per indicare lo SHA originale, documentare il motivo del cherry-pick nel messaggio del commit e, quando possibile, utilizzare merge invece di cherry-pick quando il contesto lo consente. Se i cherry-pick diventano numerosi — prendere in considerazione una ristrutturazione dei rami.
Le pipeline CI dovrebbero considerare cherry-pick come uno scenario separato. Si raccomanda di configurare un controllo automatizzato: quando viene creato un commit cherry-pick, il CI verifica che i file modificati corrispondano al set previsto ed esegue test per i moduli interessati. Ciò riduce il rischio di regressione durante il trasferimento di modifiche tra rami.
Domande frequenti
Cherry-pick trasferisce le modifiche da un commit a un altro ramo. Revert crea un nuovo commit che annulla le modifiche del commit specificato nello stesso ramo. Revert non elimina la cronologia — aggiunge una modifica inversa.
Sì: git cherry-pick A B C — trasferisce i commit A, B e C in ordine. Oppure git cherry-pick A..C — trasferisce tutti i commit da A a C (escluso A). L'ordine di trasferimento corrisponde all'ordine nel comando.
Per impostazione predefinita, cherry-pick di un commit di unione non funziona perché un commit di unione ha due genitori. Utilizzare il flag -m 1 per specificare con quale genitore confrontare. -m 1 prende il diff relativo al primo genitore.
Annullare cherry-pick tramite git reset --hard HEAD~1 se è l'ultimo commit. Se il commit è già stato inviato — utilizzare git revert <SHA> per creare un commit di annullamento.
Nessun senso, ma tecnicamente possibile. Se il commit esiste già nel ramo, Git rileverà che le modifiche sono già state applicate e segnalerà: “The previous cherry-pick is now empty, possibly due to conflict resolution.” Il commit non verrà ricreato.
Riepilogo
Svilupperemo un'applicazione mobile chiavi in mano
IT Sectr crea applicazioni iOS e Android per startup e aziende dal 2017. Ti consulteremo e ti proporremo la soluzione migliore.
Leggi anche