Corso
Il controllo di versione è uno degli aspetti più importanti dello sviluppo software moderno. Ti permette di tracciare le modifiche, collaborare in modo efficiente e mantenere la cronologia del codice. Tra i vari strumenti disponibili, Git spicca come uno dei sistemi più utilizzati per gestire le modifiche al codice.
Come scoprirai dal nostro corso Introduction to Git, Git offre i branch per lavorare su funzionalità o correzioni diverse senza influenzare la codebase principale. Sebbene i branch rendano lo sviluppo più flessibile, mantenerli organizzati a volte può essere una sfida. Ed è qui che entra in gioco il Git rebase.
Comprendere i branch in Git
Come approfondiamo nella nostra guida a Git e GitHub, i branch ti permettono di lavorare su nuove funzionalità o correzioni di bug in modo indipendente dalla codebase principale. Forniscono un ambiente isolato in cui è possibile apportare modifiche senza interrompere il lavoro in corso in altri branch.
Esistono diversi workflow di branching comuni, tra cui:
- Feature branch: usati per sviluppare nuove funzionalità prima di fonderle nel branch principale.
- Release branch: dedicati alla stabilizzazione del codice prima di un nuovo rilascio.
- Hotfix branch: creati per correggere problemi critici.
Gestire efficacemente questi branch è fondamentale per mantenere una cronologia del codice pulita e ordinata.

Che cos'è Git Rebase?
Git rebase è un comando che ti permette di spostare o riapplicare i commit da un branch a un altro. A differenza del merge, che crea un nuovo commit combinando le modifiche di branch diversi, il rebase applica le modifiche una per una sul branch di destinazione. Il risultato è una cronologia lineare senza commit di merge superflui.
Durante un rebase, Git prende ogni commit dal branch di origine e lo applica sopra l’ultimo commit nel branch di destinazione. Questo rende la cronologia dei commit più facile da leggere e seguire. Parliamo più approfonditamente di come vedere l’intera cronologia dei commit di un repository nella nostra Git Diff Guide.

Perché usare Git Rebase?
Il rebase è utile per vari motivi:
- Creare una cronologia lineare dei commit. Invece di avere una cronologia con molteplici commit di merge, il rebase mantiene il registro dei commit pulito e facile da capire.
- Migliorare la collaborazione e il code review. Una cronologia chiara aiuta i team a revisionare le modifiche in modo più efficace.
- Evitare commit di merge non necessari. Con il rebase invece del merge, puoi mantenere i branch aggiornati senza affollare il registro dei commit.
Tuttavia, il rebase può essere rischioso, soprattutto quando si lavora su branch condivisi, perché riscrive la cronologia dei commit e può causare conflitti o rendere difficile tracciare le modifiche. È meglio evitare di fare rebase sui branch pubblici e usarlo con cautela nei workflow collaborativi.
Quando usare Git Rebase
Ci sono alcune situazioni in cui usare Git rebase è la scelta giusta. Le esaminiamo nel dettaglio qui sotto:
Fare rebase dei feature branch locali
Quando lavori su un feature branch, è comune aggiornarlo con le ultime modifiche dal branch principale. Il rebase, che posiziona i commit del feature branch in cima al branch principale più recente, aiuta a mantenere una cronologia pulita come alternativa al merge.
Mantenere aggiornati i feature branch
Quando più sviluppatori lavorano sullo stesso repository, il branch principale cambia spesso. Il rebase aiuta a tenere aggiornato il feature branch senza aggiungere commit di merge non necessari.
Rebase nella collaborazione in team
Lavorando in team, il rebase può aiutare a prevenire i conflitti prima che si verifichino. Facendo regolarmente il rebase di un feature branch sul branch principale, puoi integrare le modifiche in modo incrementale, riducendo il rischio di conflitti di merge in seguito.
Guida passo passo a Git Rebase
In questa sezione ti accompagniamo nel processo di rebase con Git, offrendoti una guida passo passo a tutto ciò che devi sapere.

Prepararsi a un rebase
Prima di iniziare un rebase, assicurati che la working directory sia pulita. Ciò significa eseguire il commit o lo stash di eventuali modifiche prima di fare rebase.

Controlla anche di trovarti sul branch corretto eseguendo:
git branch
Recuperare le ultime modifiche
Prima del rebase, assicurati che il repository locale abbia le ultime modifiche dal repository remoto:
git fetch origin
Passare al feature branch
Spostati sul feature branch che deve essere ribasato:
git checkout your-feature-branch
Fare rebase sul branch principale
Per applicare i commit del feature branch sopra l’ultimo stato del branch principale, esegui:
git rebase main
Git riapplicherà ciascun commit del feature branch sul branch principale aggiornato.

Quando esegui git rebase main, Git prende le modifiche dal branch principale e le applica prima dei commit del tuo feature branch. Così mantieni una cronologia pulita e lineare. Questo processo “rigioca” i tuoi commit sull’ultimo stato di main, ottenendo una cronologia del progetto lineare senza commit di merge.
Per esempio, supponiamo che il branch principale abbia i commit A e B. Il tuo feature branch è divergente da A e include i commit C e D.
A---B (main)
\
C---D (feature)
Dopo git rebase main, il tuo feature branch viene aggiornato per includere i commit di main, seguiti dai tuoi commit:
---B---C'---D' (feature)
Qui C e D sono nuovi commit che rappresentano le tue modifiche originali, ora basate sopra B.
Risoluzione dei conflitti (se presenti)
Se durante il rebase emergono conflitti, Git si fermerà e ti permetterà di risolverli.
Segna i conflitti come risolti una volta corretti:
git add .
git rebase --continue
Se necessario, puoi annullare il rebase con:
git rebase --abort
Completare il rebase
Dopo un rebase riuscito, verifica il branch e testa il codice per assicurarti che tutto funzioni correttamente.
Rebase interattivo in Git
Oltre al rebase comune visto nella sezione precedente, puoi anche eseguire un rebase interattivo. Questo ti dà un controllo maggiore, come scoprirai qui sotto.
Che cos’è il rebase interattivo?
Il rebase interattivo git rebase -i ti permette di modificare i commit prima di applicarli. Questa modalità offre opzioni come riordinare, modificare, squash e rimuovere commit.
Perché usare il rebase interattivo?
Il rebase interattivo è utile quando vuoi affinare la cronologia dei commit. Aiuta a combinare più commit, modificare i messaggi dei commit e rimuovere i commit non necessari prima di fondere nel branch principale.
Usi comuni del rebase interattivo
- Riordinare i commit. Cambia l’ordine dei commit per rendere la cronologia più chiara.
- Squash di commit multipli. Combina diversi piccoli commit in un unico commit significativo.
- Modificare i messaggi dei commit. Cambia i messaggi dei commit prima di pushare le modifiche. È importante scrivere messaggi di commit adeguati per chiarire cosa è stato aggiornato nel codice, come mostriamo nel nostro tutorial GIT Push and Pull.
Come eseguire un rebase interattivo
Per iniziare un rebase interattivo, esegui:
git rebase -i HEAD~n
Sostituisci n con il numero di commit che vuoi modificare. L’interfaccia interattiva ti permette di scegliere come gestire ciascun commit.
Buone pratiche e considerazioni
Quando fai rebase, è importante seguire alcune buone pratiche. Vediamone alcune in questa sezione.
Evita il rebase di branch condivisi
Fare rebase su un branch su cui lavorano anche altri può causare conflitti e confusione. Se un branch condiviso è già stato pushato, evita di fare rebase.
Fetch e rebase regolari
Mantenere un feature branch aggiornato con le ultime modifiche dal branch principale aiuta a prevenire i conflitti e rende il merge più fluido.
Fai un backup prima del rebase
Poiché il rebase modifica la cronologia dei commit, è buona norma creare un backup prima di iniziare. Usare git stash o creare un branch temporaneo può prevenire perdite accidentali di dati.
Errori comuni e come evitarli
Vediamo alcune difficoltà comuni durante il rebase e come evitarle.
Fare rebase accidentalmente di un branch pubblico
Fare rebase di un branch già condiviso può creare conflitti per altri contributori. Se succede, usa git reflog per recuperare i commit persi.
Difficoltà nel risolvere i conflitti
Quando si verificano conflitti, prenditi il tempo per risolverli con attenzione. Usare strumenti come git mergetool può semplificare il processo.
Perdita della cronologia dei commit
Se dopo un rebase scompaiono dei commit, usa git reflog per trovarli e ripristinarli.
Conclusione
Git rebase è uno strumento potente per mantenere una cronologia dei commit pulita e migliorare la collaborazione. Usandolo correttamente — evitando il rebase di branch condivisi, recuperando regolarmente gli aggiornamenti e facendo il backup delle modifiche — puoi snellire il controllo di versione e ridurre i conflitti di merge.
Applica queste tecniche per mantenere i tuoi repository organizzati e i flussi di lavoro efficienti. Vuoi approfondire le tue competenze su Git? Dai un’occhiata al nostro corso Intermediate Git per scoprire le basi di Git per il controllo di versione nei tuoi progetti software e data.
FAQ su Git Rebase
Qual è la differenza tra Git rebase e Git merge?
Git merge crea un nuovo commit che combina le modifiche di due branch, mantenendo intatte entrambe le cronologie. Git rebase, invece, sposta i commit da un branch e li applica in sequenza su un altro, ottenendo una cronologia lineare senza commit di merge aggiuntivi.
Quando dovrei usare Git rebase invece di Git merge?
Usa Git rebase quando vuoi mantenere una cronologia dei commit pulita e lineare, soprattutto per i feature branch. È particolarmente utile prima di fondere un feature branch nel branch principale per evitare commit di merge non necessari. Evita però il rebase di branch condivisi, perché può riscrivere la cronologia dei commit e creare problemi ai collaboratori.
Cosa succede se incontro conflitti durante un Git rebase?
Se si verifica un conflitto durante il rebase, Git si fermerà e ti chiederà di risolverlo. Devi correggere manualmente i file in conflitto, metterli in stage con git add ., quindi continuare il rebase con git rebase --continue. Se i conflitti sono troppo complessi, puoi annullare il rebase con git rebase --abort e ricominciare.
È sicuro fare rebase di un branch che è già stato pushato su un repository remoto?
No, fare rebase di un branch che è stato pushato e condiviso con altri può creare problemi perché riscrive la cronologia dei commit. Se devi necessariamente fare rebase di un branch condiviso, comunica con il tuo team e usa con cautela git push --force-with-lease per evitare di sovrascrivere le modifiche di qualcun altro.
Come posso annullare un Git rebase se qualcosa va storto?
Se ti accorgi che un rebase ha causato problemi, puoi usare git reflog per trovare il commit precedente al rebase e ripristinarlo con git reset --hard <commit-hash>. Un’altra opzione è usare git rebase --abort se il rebase è ancora in corso e non è stato ancora completato.

