2016-01-21 17 views
15

Ho due rami (e master). Il ramo 2 si basa sul ramo 1 basato sul master. Ho sottoposto il Branch 1 per la revisione, ha apportato alcune modifiche, ho modificato alcune di quelle modifiche nella cronologia e unito il risultato in master.Rebase solo una parte di un ramo

Ora ho bisogno di rebase Branch 2 in cima al master per prepararlo per la revisione/fusione.

Il problema è che il ramo 2 contiene ancora i commit originali di Branch 1, che non esistono più, quindi git viene confuso. Ho provato rebase -i per abbandonare i commit originali di Branch 1, ma i commit di Branch 2 non si basano su master-before-branch-1.

Quello che devo fare è prendere il ramo 2, rilasciare alcuni commit e rifare solo i restanti commit sopra il master in una singola operazione. Ma so solo come fare queste due operazioni in due passaggi distinti.

Come posso rebase parte del mio ramo su un altro ramo, lasciando cadere tutti i commit che non sono in comune discendenza, tranne quelli specificati (ad esempio da HEAD ~ 2 in su)?

Ecco lo stato attuale:

master      new branch 1 
- - - - - - - - - - - | - - - - - - - - - 
    \ 
    \ branch 1 
     \ _ _ _ _ _ _ _ 
        \ 
         \  branch 2 
         \ _ _ _ _ _ _ _ 

Quello che voglio finire con:

master   new branch 1  
- - - - - - - | - - - - - - - - - - 
            \ 
            \ 
            \ 
             \ branch 2 
             - - - - - - - - - 
+4

Un grafico ASCII che rappresenta lo stato del repository potrebbe essere d'aiuto. A prima vista, direi che stai cercando ['git rebase --onto'] (https://git-scm.com/docs/git-rebase). Vedi se questo aiuta: http://stackoverflow.com/questions/28715619/how-can-i-rebase-part-of-a-branch-to-the-master-branch/28715930#28715930 – Jubobs

+0

Meglio! Vedi anche la parte superiore di http://stackoverflow.com/questions/25488138/move-initial-commits-off-master-to-another-branch-in-git/25490288#25490288 – Jubobs

+0

git rebase - quasi ha funzionato per me . Ho fatto 'git rebase --onto master --root HEAD ~ 1', ma per qualche ragione ha scelto tre commit da portare con me invece di solo 'HEAD ~ 1' e verso l'alto. Inoltre, invece di ridefinire il mio ramo, ora sono nello stato di HEAD distaccato. – Puppy

risposta

11

la soluzione è notevolmente più semplice di quanto mi aspettassi. Si scopre che è possibile fornire -i a una più ampia varietà di comandi di rebase (ho pensato che fosse solo per la ridefinizione di un ramo su se stesso per la modifica della cronologia). Quindi ho semplicemente eseguito git rebase -i master e ho abbandonato questi commit extra.

+0

Per chiarire cosa è stato fatto da @Puppy è stato eseguire un rebase interattivo dal ramo 2 sul nuovo ramo 1 ('git rebase -i new_branch_1' mentre sul ramo 2) e rimosso tutto il ramo 1 commette utilizzando la console interattiva in modo che solo i commit del ramo 2 fossero riprodotti . – theannouncer

19

Il comando reale sarebbe:

git rebase --onto newbranch1 branch1 branch2 

che ripete in cima a tutte le new_branch1 commette dopobranch1 fino a branch2 TESTA.

+0

Di sicuro (stava per pubblicare lo stesso da solo). Per inciso, 'git help rebase' copre questo caso. –

+0

@TomFenech anche meglio di 'git help rebase': http://stackoverflow.com/a/2369516/6309 (la mia vecchia risposta del 2010);) – VonC