tl; dr
La sintassi corretta da rifare Boltre Aall'uso git rebase --ontonel tuo caso è:
git checkout B
git rebase --onto A B^
o rifare Bin cima a Apartire dal commit che è il padre diB referenziato con B^o B~1.
Se sei interessato alla differenza tra git rebase <branch>e continua a git rebase --onto <branch>leggere.
The Quick: git rebase
git rebase <branch>sta per rebase al ramo attualmente avete verificato, a cui fa riferimento HEAD, in cima alla ultima commit che è raggiungibile dalla <branch>, ma non da HEAD.
Questo è il caso più comune di rebasing e probabilmente quello che richiede meno pianificazione in anticipo.
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E (HEAD) D---E (HEAD)
In questo esempio, Fe Gsono commit che sono raggiungibili da branchma non da HEAD. Dicendo git rebase branchprenderà D, questo è il primo commit dopo il punto di diramazione, e lo riposizionerà (cioè cambierà il suo genitore ) sopra l'ultimo commit raggiungibile branchma non da HEAD, cioè G.
Il preciso: git rebase --onto con 2 argomenti
git rebase --ontoti consente di effettuare il rebase a partire da un commit specifico . Ti dà il controllo esatto su ciò che viene ripassato e dove. Questo è per gli scenari in cui è necessario essere precisi.
Ad esempio, immaginiamo che dobbiamo rifare HEADesattamente oltre a Fpartire da E. Siamo interessati solo ad entrare Fnel nostro ramo di lavoro mentre, allo stesso tempo, non vogliamo mantenerlo Dperché contiene alcune modifiche incompatibili.
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H---I (HEAD)
In questo caso, diremmo git rebase --onto F D. Questo significa:
Sostituisci il commit raggiungibile dal HEADcui genitore è Din cima F.
In altre parole, cambia il genitore di Eda Da F. La sintassi di git rebase --ontoè quindi git rebase --onto <newparent> <oldparent>.
Un altro scenario in cui questo è utile è quando si desidera rimuovere rapidamente alcuni commit dal ramo corrente senza dover effettuare un rebase interattivo :
Before After
A---B---C---E---F (HEAD) A---B---F (HEAD)
In questo esempio, al fine di rimuovere Ce Edalla sequenza si direbbe git rebase --onto B E, o rifare HEADil punto in Bcui si trovava il vecchio genitore E.
The Surgeon: git rebase --onto con 3 argomenti
git rebase --ontopuò fare un passo avanti in termini di precisione. In effetti, ti consente di rifare un intervallo arbitrario di commit sopra un altro.
Ecco un esempio:
Before After
A---B---C---F---G (branch) A---B---C---F---G (branch)
\ \
D---E---H---I (HEAD) E---H (HEAD)
In questo caso, vogliamo ridefinire l'intervallo esatto E---Hsopra F, ignorando dove HEADsta puntando attualmente. Possiamo farlo dicendo git rebase --onto F D H, il che significa:
Ricambia l'intervallo di commit il cui genitore è D fino a Hin cima F.
La sintassi di git rebase --ontocon una serie di commit diventa quindi git rebase --onto <newparent> <oldparent> <until>. Il trucco qui è ricordare che il commit a cui fa riferimento <until>è incluso nell'intervallo e diventerà il nuovo HEADdopo il completamento del rebase.