La mia guida per comprendere Git rebase -i
Il comando git rebase è uno dei più potenti in Git. Può riscrivere la cronologia dei commit del tuo repository riorganizzando, modificando e persino eliminando i commit.
Git è un sistema di controllo delle versioni distribuito gratuito e open source progettato per gestire qualsiasi cosa, dai progetti piccoli a quelli molto grandi, con velocità ed efficienza. È uno strumento essenziale nel toolkit di uno sviluppatore open source.
Questo articolo spiega perché e come utilizzare il comando git rebase --interactive
(-i
in breve). Questo è considerato un comando Git intermedio, ma può essere molto utile quando inizi a lavorare con team grandi.
Questo comando è uno dei più potenti in Git. Il comando git rebase
ti aiuta a gestire più commit, tra cui:
- Appiattisci (o squash nella terminologia Git) diversi commit in modo che sembrino stati eseguiti tutti in una volta
- Elimina uno dei commit
- Dividi un commit in due
- Riordina i commit
Sì, il comando git rebase
può riscrivere la cronologia dei commit del tuo repository riorganizzando, modificando e persino eliminando i commit. Quindi iniziamo!
Istruzioni utili nel messaggio di rebase
L'interfaccia git rebase -i
è, come implica il flag nella sua forma lunga --interactive
, un'interfaccia interattiva. Fornisce un elenco di commit e quindi scegli quali azioni vuoi che Git intraprenda su ciascuno di essi. Non intraprendere alcuna azione è una scelta valida, ma almeno un commit deve essere contrassegnato come quello da schiacciare, altrimenti il rebase sarà funzionalmente privo di significato.
- p, pick — Scegli questo commit da mantenere.
- e, modifica: modifica questo commit per modificare il messaggio di commit.
- r, reword — Usa questo commit, ma anche modificalo.
- s, squash — Squash questo commit in un commit precedente. Quando esegui un
git rebase -i
, devi avere almeno un commit contrassegnato come squash. - d, drop: elimina questo commit.
Commit schiaccianti
Supponiamo di avere due commit e di volerli racchiudere in uno solo. Ciò si ottiene utilizzando il comando git rebase -i HEAD~2
(ovvero due commit dalla tua posizione attuale) e inserendo la parola squash prima del commit.
$ git rebase --interactive HEAD~2
L'esecuzione di questo comando ti fornisce un elenco di commit nel tuo editor di testo che assomiglia a questo:
pick 718710d Commit1.
pick d66e267 Commit2.
Se vuoi creare un singolo commit da due commit, devi modificare lo script in modo che assomigli a questo:
pick 718710d Commit1.
squash d66e267 Commit2.
Infine, salva ed esci dall'editor. Successivamente, Git applica tutte le modifiche e apre un editor per unire i due commit:
# This is a combination of 2 commits.
# This is the 1st commit message:
Fuse smoke test versioning.
# This is the commit message #2:
Updated the code.
# Please enter the commit message for your changes.
Il salvataggio di questo comporta un singolo commit che introduce le modifiche dei due commit precedenti.
Riordinamento dei commit
Supponiamo di avere tre commit e di voler modificare il loro ordine in modo tale che Commit3 sia il primo, Commit2 sia il secondo e quindi il terzo sia Commit1. Esegui git rebase -i HEAD~3
per far sì che ciò accada:
$ git rebase --interactive HEAD~3
Questo script è aperto nel tuo editor:
pick 8cfd1c4 Commit1
pick 718710d Commit2
pick d77e267 Commit3
Modifica lo script in questo modo:
pick d77e267 Commit3
pick 718710d Commit2
pick 8cfd1c4 Commit1
Quando salvi ed esci dall'editor, Git riavvolge il tuo ramo al genitore di questi commit e applica d77e267, quindi 718710d e infine 8cfd1c4 poiché i numeri di commit non corrispondono.
Elimina un impegno
Supponiamo di avere due commit e di voler eliminare il secondo. Puoi eliminarlo utilizzando lo script git rebase -i
.
$ git rebase -i HEAD~2
Questo script è aperto nel tuo editor:
pick 8cfd1c4 Commit1
pick 718710d Commit2
Inserisci la parola drop prima del commit che desideri eliminare oppure puoi semplicemente eliminare quella riga dallo script rebase.
pick 8cfd1c4 Commit1
drop 718710d Commit2
Quindi salva ed esci dall'editor. Git applica le modifiche ed elimina il commit.
Ciò può causare conflitti di unione se hai molti commit successivi nella sequenza che dipendono da quello che hai appena eliminato, quindi usalo con attenzione. Ma hai la possibilità di annullare le modifiche.
Ribasare con cautela
Se arrivi a metà del rebase e decidi che non è una buona idea, usa il comando git rebase --abort
per annullare tutte le modifiche apportate. Se hai terminato un rebase e decidi che è sbagliato o non è quello che vuoi, puoi usare git reflog
per recuperare una versione precedente del tuo ramo.
Il rebasing è potente e può essere utile per mantenere il repository organizzato e la cronologia pulita. Ad alcuni sviluppatori piace riorganizzare il ramo principale in modo che i commit raccontino una chiara storia di sviluppo, mentre altri preferiscono che tutti i commit vengano preservati esattamente come sono stati proposti per la fusione da altri rami. Finché pensi a ciò di cui ha bisogno il tuo repository e a come un rebase potrebbe influenzarlo, il comando git rebase
e l'interfaccia git rebase -i
sono comandi utili.