Soluzione per argomento
Il comando corretto per rispondere alla domanda pubblicata potrebbe essere uno dei seguenti (supponendo che il ramo topicsia 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 topicnon è stato estratto, è sufficiente aggiungere topical 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, Zo featurecome <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, Do 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, Do mastersaranno tutti risultati commit Bservire 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, Zdi impegnarsi De finiscono per saltare Be Cperché già sono state applicate.
git rebase --onto C X feature
Applicherà commit Ye Zcommit C, eliminando efficacemente il commitX
git checkout Bprima di correregit rebase?