Soluzione per argomento
Il comando corretto per rispondere alla domanda pubblicata potrebbe essere uno dei seguenti (supponendo che il ramo topic
sia già stato estratto):
git rebase --onto B master
git rebase --onto master~1 master
git rebase --onto B A
git rebase --onto B C
git rebase --onto B
Se topic
non è stato estratto, è sufficiente aggiungere topic
al comando (tranne l'ultimo) in questo modo:
git rebase --onto B master topic
In alternativa, controlla prima la filiale con:
git checkout topic
Sostituisci qualsiasi stringa di commit a un commit target
La forma base del comando di cui abbiamo bisogno, paralizzata dalla documentazione, è:
git rebase --onto <Target> [<Upstream> [<Branch>]]
<Branch>
è facoltativo e tutto ciò che fa è estrarre il ramo specificato prima di eseguire il resto del comando. Se hai già verificato il ramo che desideri modificare, non ti serve. Nota che devi aver specificato <Upstream>
per specificare <Branch>
o git penserà che stai specificando <Upstream>
.
<Target>
è il commit a cui assoceremo la nostra serie di commit. Quando si fornisce un nome di ramo, si specifica semplicemente il commit principale di quel ramo. <Target>
può essere qualsiasi commit che non sarà contenuto nella stringa di commit che viene spostata. Per esempio:
A --- B --- C --- D master
\
\-- X --- Y --- Z feature
Per spostare l'intero ramo di caratteristica, non è possibile selezionare X
, Y
, Z
o feature
come <Target>
in quanto tali sono tutti i commit all'interno del gruppo di essere spostati.
<Upstream>
è speciale perché può significare due cose diverse. Se si tratta di un commit che è un antenato del ramo estratto, funge da punto di taglio. Nell'esempio ho fornito, questo sarebbe tutto ciò che non è C
, D
o master
. Tutti i commit vengono eseguiti dopo che <Upstream>
il capo del ramo estratto è quello che verrà spostato.
Tuttavia, se <Upstream>
non è un antenato, git esegue il backup della catena dal commit specificato fino a quando non trova un antenato comune con il ramo estratto (e si interrompe se non riesce a trovarne uno). Nel nostro caso, una <Upstream>
delle B
, C
, D
o master
saranno tutti risultati commit B
servire come punto di taglio. <Upstream>
è esso stesso un comando facoltativo e se non è specificato, git osserva il genitore del ramo estratto che equivale a immettere master
.
Ora che git ha selezionato i commit che taglia e si sposta, li applica per <Target>
evitare di saltare quelli già applicati al target.
Esempi e risultati interessanti
Utilizzando questo punto di partenza:
A --- B --- C --- D --- E master
\
\-- X --- Y --- Z feature
git rebase --onto D A feature
Si applicherà commit B
, C
, X
, Y
, Z
di impegnarsi D
e finiscono per saltare B
e C
perché già sono state applicate.
git rebase --onto C X feature
Applicherà commit Y
e Z
commit C
, eliminando efficacemente il commitX
git checkout B
prima di correregit rebase
?