modulo 04 / lezione 19
Riscrivere la storia: rebase, amend, cherry-pick
git cherry-pick: portare un commit da un'altra parte
Trasportare commit selezionati tra branch quando il merge intero non è quello che serve.
git cherry-pick: portare un commit da un’altra parte
git cherry-pick prende il cambiamento introdotto da un commit e lo applica sul branch corrente creando un nuovo commit.
È una chirurgia mirata: utile quando vuoi portare un fix, non tutta la storia del branch da cui proviene.
Perché questa lezione conta
Nel lavoro reale capita spesso:
- un bugfix su
maindeve andare anche surelease/1.2; - un commit utile è finito in un branch sperimentale;
- una patch deve essere backportata;
- una PR contiene un commit buono e altri non pronti.
Cherry-pick risolve questi casi senza mergeare tutto.
Obiettivo operativo
Alla fine della lezione devi saper scegliere un commit, applicarlo su un altro branch, gestire conflitti, usare -x quando serve tracciabilità e riconoscere quando cherry-pick è il sintomo di un workflow confuso.
Come funziona
git switch release/1.2
git cherry-pick abc1234
Git calcola il diff introdotto da abc1234 rispetto al suo parent e prova ad applicarlo sul branch corrente.
Il nuovo commit avrà un nuovo hash perché parent e contesto sono diversi.
-x per tracciabilità
Per backport o release branch:
git cherry-pick -x abc1234
Aggiunge al messaggio:
(cherry picked from commit abc1234...)
Questo aiuta a capire da dove arriva la patch.
Cherry-pick multiplo
Puoi applicare più commit:
git cherry-pick a1b2 c3d4 e5f6
Oppure un range:
git cherry-pick A..B
Attenzione: cherry-pick massivo spesso indica che forse volevi un merge o un rebase.
Conflitti
Se c’è conflitto:
git status
# risolvi file
git add file
git cherry-pick --continue
Per annullare:
git cherry-pick --abort
Per saltare il commit corrente:
git cherry-pick --skip
Usa --skip solo se hai capito che quel commit non è applicabile o necessario.
Quando usarlo
Usa cherry-pick per:
- hotfix da portare su release branch;
- recupero di un singolo commit;
- backport controllato;
- patch isolata da branch non pronto.
Evitalo per:
- integrare feature complete;
- spostare dieci commit correlati;
- aggirare conflitti di merge;
- copiare lavoro senza capire dipendenze.
Dipendenze tra commit
Un commit può dipendere da commit precedenti. Se cherry-picki solo il secondo, può non compilare.
Prima:
git show --stat abc1234
git show abc1234
git log --oneline --graph --decorate --all
Chiediti:
- introduce simboli usati altrove?
- richiede migrazioni o config?
- dipende da refactor precedenti?
- ha test collegati?
Controllo dopo il cherry-pick
Dopo un cherry-pick riuscito non fermarti al fatto che Git non segnali conflitti. Il branch target può avere vincoli diversi: dipendenze più vecchie, feature flag assenti, schema database differente o test non presenti.
Routine minima:
git show --stat HEAD
git diff HEAD~1..HEAD
npm test
Se stai facendo backport su release branch, aggiungi una nota nella PR: commit sorgente, motivo del backport, test eseguiti e motivo per cui non è stato fatto un merge completo.
Laboratorio guidato
Crea:
main;release/1.0;- un commit bugfix su
main; - un commit feature su
main.
Porta solo il bugfix su release/1.0 con cherry-pick -x. Verifica che la feature non sia entrata.
Poi crea un conflitto e risolvilo.
Output atteso
Una procedura backport:
1. identifico commit fix
2. controllo dipendenze
3. switch release branch
4. cherry-pick -x
5. test
6. push/PR
Errori comuni
Cherry-pick di commit dipendenti. Il fix sembra isolato ma non lo è.
Cherry-pick massivo. Crea duplicati e rende difficile seguire la storia.
Dimenticare -x nei backport. Perdi tracciabilità.
Non testare sul branch target. Applicare patch non garantisce compatibilità.
Checklist di verifica
- so usare
git cherry-pick <sha>; - so usare
-xnei backport; - so continuare o abortire dopo conflitto;
- controllo dipendenze del commit;
- uso cherry-pick come intervento mirato.
Collegamenti
- Modulo: Riscrivere la storia: rebase, amend, cherry-pick — lezione 19 del corso.
- Si collega a release branch e GitFlow del modulo 6.