Menu
Coddy logo textTech

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.

Lo squash fonde una serie di piccoli commit in un unico commit pulito tramite un rebase interattivo.

Sintassi

ComandoCosa fa
git rebase -i HEAD~3Rebase interattivo degli ultimi 3 commit
git rebase -i mainRebase di tutti i commit successivi a main
git merge --squash featureUnisce i commit di un branch in uno solo durante il merge
git reset --soft HEAD~3 && git commitSquash degli ultimi 3 commit senza rebase

Comandi del rebase interattivo

Nell'editor che si apre, sostituisci pick con uno di questi.

Parola chiaveCosa fa
pickMantiene 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.

PassoAzioneRisultato
1git rebase -i HEAD~3Apre gli ultimi 3 commit nell'editor
2Imposta i commit 2 e 3 su squashLi segna per fonderli nel primo
3Salva e modifica il messaggio combinatoTre 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?
Esegui 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?
Entrambi fondono un commit in quello precedente. 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?
Usa 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?
Sì. 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?
Molti team lo fanno, così ogni feature arriva come un solo commit facile da leggere e facile da annullare con revert. Il prezzo è perdere la cronologia passo per passo. Fai pure lo squash su un branch che usi solo tu; su un branch condiviso mettiti prima d'accordo, perché i commit riscritti costringono tutti gli altri a reimpostare la propria copia.
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.
Illustrazione dei linguaggi di programmazione di Coddy

Impara Git con Coddy

INIZIA