Modulo 15 — Rebasing
Molti imparano a temere git rebase (“può fare pasticci!”, “non è per principianti!”). In realtà è utilissimo — purché si sappia quando NON usarlo.
I due usi principali
Section titled “I due usi principali”- come alternativa al merge;
- come strumento di pulizia (riscrittura della history).
Uso 1: alternativa al merge
Section titled “Uso 1: alternativa al merge”Il problema
Section titled “Il problema”Lavori su un feature branch in un progetto collaborativo. Nel frattempo master avanza: ogni volta che mergi master nel tuo branch nasce un merge commit. Su un master molto attivo, il feature branch si riempie di merge commit e la sua history ne esce “sporca”.
Il feature branch è partito da un master ormai superato: le due linee divergono.
La soluzione: rebase
Section titled “La soluzione: rebase”git switch featuregit rebase masterIl rebase sposta l’intero feature branch perché inizi dalla punta di master. Tutto il lavoro resta — ma la history viene riscritta: per ogni commit originale del branch, il rebase crea un commit nuovo (invece di usare un merge commit).
Il branch è stato ricostruito sulla punta di master: stessa quantità di lavoro, history lineare.
Si può fare anche una sola volta, a feature conclusa, prima di riportarla su master.
Perché farlo
Section titled “Perché farlo”- History di progetto molto più pulita;
- nessun merge commit superfluo;
- history lineare.
⚠️ WARNING
Section titled “⚠️ WARNING”Mai fare rebase di commit già condivisi con altri. Se hai già pushato su GitHub, NON fare rebase — a meno che tu non sia assolutamente sicuro che nessuno stia usando quei commit.
Riscrivere una history che gli altri hanno già in locale rende davvero complicato riconciliare le versioni alternative.
Uso 2: strumento di pulizia (interactive rebase)
Section titled “Uso 2: strumento di pulizia (interactive rebase)”Prima di condividere il lavoro capita di voler riscrivere, rinominare, riordinare o eliminare i propri commit. È il territorio del rebase interattivo:
git rebase -i HEAD~4Nota bene:
- con
-iserve specificare quanto indietro riscrivere (HEAD~4= gli ultimi 4 commit); - qui non si rebasea su un altro branch: si riscrive una serie di commit sulla HEAD su cui poggiano già (pura pulizia).
Cosa appare nell’editor
Section titled “Cosa appare nell’editor”La lista dei commit (dal più vecchio), ognuno con un comando di default pick, più la legenda dei comandi disponibili. I più usati:
| Comando | Effetto |
|---|---|
pick | usa il commit così com’è |
reword | usa il commit ma cambia il messaggio |
edit | usa il commit ma fermati per l’amend |
fixup | usa il contenuto fondendolo nel commit precedente, scartando il messaggio |
drop | elimina il commit |
Esempio
Section titled “Esempio”Prima:
pick f7f3f6d Change my name a bitpick 310154e Update READMEpick a5f4a0d Add cat-fileDopo la modifica (eliminare il primo, cambiare messaggio all’ultimo):
drop f7f3f6d Change my name a bitpick 310154e Update READMEreword a5f4a0d Add cat-fileSalvando il file, Git esegue i comandi (per reword aprirà l’editor del messaggio; per edit si fermerà in attesa dell’amend).
Immagini: documentazione ufficiale di Git (git-scm.com, dal libro Pro Git di Scott Chacon), licenza CC BY-NC-SA 3.0.