Git Squash: unire i commit
Ultimo aggiornamento
Lo squash combina più commit in uno solo, così una serie disordinata di commit "wip", "fix typo", "actually fix it" diventa un unico commit pulito. Lo strumento abituale è il rebase interattivo, git rebase -i, in cui segni i commit da fondere insieme. Siccome lo squash riscrive la cronologia, fallo prima del push oppure su un branch su cui lavori solo tu.
Prova questi comandi nel terminal playground: una vera shell nel tuo browser, senza installare nulla.
Sintassi
| Comando | Cosa fa |
|---|---|
git rebase -i HEAD~3 | Rebase interattivo degli ultimi 3 commit |
git rebase -i main | Rebase di tutti i commit successivi a main |
git merge --squash feature | Unisce i commit di un branch in uno solo durante il merge |
git reset --soft HEAD~3 && git commit | Squash degli ultimi 3 commit senza rebase |
Comandi del rebase interattivo
Nell'editor che si apre, sostituisci pick con uno di questi.
| Parola chiave | Cosa fa |
|---|---|
pick | Mantiene il commit così com'è |
squash (s) | Lo fonde nel commit precedente, unendo i messaggi |
fixup (f) | Lo fonde ma scarta il messaggio di questo commit |
reword (r) | Mantiene il commit ma ne modifica il messaggio |
Esempio pratico
Fai lo squash degli ultimi tre commit in uno solo prima del push.
| Passo | Azione | Risultato |
|---|---|---|
| 1 | git rebase -i HEAD~3 | Apre gli ultimi 3 commit nell'editor |
| 2 | Imposta i commit 2 e 3 su squash | Li segna per fonderli nel primo |
| 3 | Salva e modifica il messaggio combinato | Tre commit diventano un unico commit pulito |
Domande frequenti su git squash
Cosa significa fare lo squash dei commit?
Fare lo squash trasforma più commit in un unico commit che contiene tutte le loro modifiche. I file restano esattamente uguali; cambia solo la cronologia, così chi fa la revisione vede un commit con un solo messaggio invece di una scia di piccole correzioni.
Come faccio lo squash degli ultimi N commit in Git?
git rebase -i HEAD~N (per esempio HEAD~3 per gli ultimi tre). Nell'editor lascia il primo commit su pick e cambia gli altri in squash (o fixup per scartarne i messaggi). Salva, modifica il messaggio del commit combinato e i commit si fondono in uno solo.Che differenza c'è tra squash e fixup?
squash mantiene il messaggio del commit e ti permette di combinarlo con gli altri in un editor. fixup scarta del tutto il messaggio del commit e tiene solo quello del commit precedente: comodo per i commit tipo "ops, piccola correzione" che non vuoi nel messaggio finale.Come faccio lo squash di un intero branch durante il merge?
git merge --squash feature, poi git commit. Questo applica tutte le modifiche del branch come modifiche in staging e ti permette di registrarle come un unico commit sul branch di destinazione, senza portare con sé i singoli commit del branch. Il pulsante "Squash and merge" di GitHub fa la stessa cosa.Posso fare lo squash senza un rebase interattivo?
git reset --soft HEAD~N riporta il branch indietro di N commit mantenendo tutte le loro modifiche in staging, poi un singolo git commit le registra come un unico commit. È un modo rapido per fare lo squash dei commit più recenti senza aprire l'editor del rebase.Conviene fare lo squash dei commit prima del merge?
Posso esercitarmi online?
Sì. Apri il terminal playground per eseguire il rebase interattivo in una vera shell nel tuo browser, senza installare nulla. Il corso interattivo gratuito di Git di Coddy spiega anche il rebase e la pulizia della cronologia passo dopo passo.