2013-10-31 16 views
18

miei rami sono:git rebase: copiare invece di muoversi

o---o support.2013.16 
    \ 
     o---o---o---o---o master 
         \ 
         o---o---o hotfix/A 

ho bisogno di copiare hotfix/A a support.2013.16. Sono consapevole di cherry-picking, ma è possibile fare qualcosa di simile

git rebase --onto support.2013.16 master hotfix/A 

ma senza muovere un ramo, ma la copia di esso, invece?

+5

Si potrebbe usare 'git checkout -b ' primo a creare il nuovo nome del ramo, quindi utilizzare rebase. Il ramo 'hotfix/A' originale rimarrebbe invariato. – qqx

risposta

35

Git rebase copia effettivamente il ramo originale in uno nuovo; ma poiché muove la testa del ramo, sembra una mossa piuttosto che una copia. Se si è utilizzato git branch per aggiungere una diramazione aggiuntiva al ramo originale, sarà comunque possibile accedere facilmente alla diramazione originale dopo che git rebase ha effettuato la copia rebasata. Quindi nel tuo esempio

git branch rebased-A hotfix/A 
git rebase --onto support.2013.16 master rebased-A 

ti lascia con

 o---o---o rebased-A (hotfix/A') 
    /
o---o support.2013.16 
    \ 
     o---o---o---o---o master 
         \ 
         o---o---o hotfix/A 
+1

Si noti che questo fa la stessa cosa dell'altra soluzione ('git checkout -b'). (Mi piace questa risposta meglio grazie all'albero di commit disegnato. :-)) – torek

7

è possibile creare un nuovo ramo:

git checkout -b hotfix/A-support hotfix/A 

e rebase invece. Quindi avrai due rami. Forse potresti decidere di abbandonare il ramo dopo averlo fuso nel ramo support.

In alternativa, è possibile ribassare lo hoftix/A sullo git merge-base support.2013.16 master e quindi è possibile unire facilmente lo hotfix/A in entrambi i rami. Ti darà una storia più carina, nessun commit duplicato.