Skip to content

Modulo 15 — Rebasing

Molti imparano a temere git rebase (“può fare pasticci!”, “non è per principianti!”). In realtà è utilissimo — purché si sappia quando NON usarlo.

  1. come alternativa al merge;
  2. come strumento di pulizia (riscrittura della history).

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

Prima del rebase: feature branch e master divergono Il feature branch è partito da un master ormai superato: le due linee divergono.

Terminal window
git switch feature
git rebase master

Il 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).

Dopo il rebase: il feature branch è stato rigenerato in punta a master 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.

  • History di progetto molto più pulita;
  • nessun merge commit superfluo;
  • history lineare.

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:

Terminal window
git rebase -i HEAD~4

Nota bene:

  • con -i serve 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).

La lista dei commit (dal più vecchio), ognuno con un comando di default pick, più la legenda dei comandi disponibili. I più usati:

ComandoEffetto
pickusa il commit così com’è
rewordusa il commit ma cambia il messaggio
editusa il commit ma fermati per l’amend
fixupusa il contenuto fondendolo nel commit precedente, scartando il messaggio
dropelimina il commit

Prima:

pick f7f3f6d Change my name a bit
pick 310154e Update README
pick a5f4a0d Add cat-file

Dopo la modifica (eliminare il primo, cambiare messaggio all’ultimo):

drop f7f3f6d Change my name a bit
pick 310154e Update README
reword a5f4a0d Add cat-file

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