ho contrassegnato questa domanda come duplicato. Scriverò quello che ho spiegato the other answer ma usando il tuo esempio.
L'approccio che uso per questi casi d'uso è quello di unire tutti i rami siano spostati in 1 nodo comune artificiale, e quindi utilizzare il comando rebase con l'opzione --preserve-merges
. L'unione di tutti i rami sarà esporre 1 end-point che verrà utilizzato come parametro di input finale per rebase --onto
. Il punto iniziale è in genere ovvio, l'origine del sottostruttura da spostare.
In caso di unione per ottenere l'endpoint di sottostruttura , i conflitti dovrebbero essere esplicitamente evitati . Pertanto i comandi di fusione devono essere istruiti per risolverli automaticamente con l'opzione -Xours
. Il risultato della fusione non è importante poiché questi nodi di unione artificiali verranno scartati dopo il rebase.
Si consiglia di creare un nuovo ramo pacchetto per non perdere i riferimenti originali . Nell'esempio sopra i seguenti comandi sarebbero eseguiti:
$ git checkout -b pack WIP1 # create new branch at 'WIP1'
$ git merge -s recursive -Xours WIP2 # merges WIP2 into pack (node p2)
$ git merge -s recursive -Xours WIP3 # merges WIP3 into pack
Questi può vedere ciò che l'albero sarebbe diventato. Due nuovinodi p2 e pacchetto sono stati creati con le unioni.
o (master)
/
/ (WIP1) (p2)
/ o-----o-----o----o (pack)
/ / //
o--o--o--o-----o-----o /(WIP2)
(X) \ /
o------------o (WIP3)
Ora è il momento di rebase. Da oggi c'è un endpoint comune per tutte le rami (pacchetto), è facile spostare l'intera sottostruttura con:
$ git rebase --preserve-merges --onto master X pack
che produce questo:
(WIP1') (p2')
o-----o-----o----o (pack')
(master) / //
o----o----o--o--o-----o-----o /(WIP2')
(X) \ /
o------------o (WIP3')
Ora è il momento di riorganizzare i riferimenti. Non so perché, in alcuni casi i riferimenti vengono spostati e in altri no. Tipo questo per ogni WIP1 riferimento, WIP2, WIP3 o quello che vi serve:
$ git checkout WIP1
$ git reset --hard <WIP1' hash>
E, infine, sbarazzarsi dei artificiali commit che sono stati creati per generare un nodo fine comune sottostruttura.
$ git branch -D pack
$ git branch -D p2 # if there is any
Così l'albero finale sarebbe:
(WIP1')
o-----o
(master) /
o----o----o--o--o-----o-----o (WIP2')
(X) \
o------------o (WIP3')
possibile duplicato di [rebasing un ramo con tutti i suoi figli] (http://stackoverflow.com/questions/5600659/rebasing-a-branch -incluso di tutti i suoi figli) –
Possibile duplicato di [Rebasare un albero (un commit/ramo e tutti i suoi figli)] (https://stackoverflow.com/questions/17315285/rebasing-a-tree-a-commit -branch-and-all-its-children) – carnicer