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?
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.