tl; dr
La sintassi corretta da rifare B
oltre A
all'uso git rebase --onto
nel tuo caso è:
git checkout B
git rebase --onto A B^
o rifare B
in cima a A
partire 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, F
e G
sono commit che sono raggiungibili da branch
ma non da HEAD
. Dicendo git rebase branch
prenderà D
, questo è il primo commit dopo il punto di diramazione, e lo riposizionerà (cioè cambierà il suo genitore ) sopra l'ultimo commit raggiungibile branch
ma non da HEAD
, cioè G
.
Il preciso: git rebase --onto con 2 argomenti
git rebase --onto
ti 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 HEAD
esattamente oltre a F
partire da E
. Siamo interessati solo ad entrare F
nel nostro ramo di lavoro mentre, allo stesso tempo, non vogliamo mantenerlo D
perché 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 HEAD
cui genitore è D
in cima F
.
In altre parole, cambia il genitore di E
da D
a 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 C
e E
dalla sequenza si direbbe git rebase --onto B E
, o rifare HEAD
il punto in B
cui si trovava il vecchio genitore E
.
The Surgeon: git rebase --onto con 3 argomenti
git rebase --onto
può 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---H
sopra F
, ignorando dove HEAD
sta 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 H
in cima F
.
La sintassi di git rebase --onto
con 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 HEAD
dopo il completamento del rebase.