2010-09-14 17 views
30

Sono sicuro che questa è una cosa semplice a cui è stato chiesto e risposto, ma non so quali termini cercare. Ho questo:Come si sposta un commit tra i rami in Git?

/--master--X--Y 
A--B 
    \--C--D--E 

Dove ho commesso C, D, ed E (solo localmente) su un ramo, ma poi ho capito che D ed E sono davvero indipendenti C. voglio passare C alla propria ramo, e mantieni D ed E per dopo. Cioè, voglio questo:

    /--C 
    /--master--X--Y 
A--B 
    \--D--E 

Come faccio a tirare C fuori da sotto D ed E?

risposta

42

È possibile utilizzare git cherry-pick per afferrare C, e metterlo su Y. Assumendo Y esiste come la punta di un ramo chiamato branch-Y:

$ git checkout branch-Y 
$ git cherry-pick C 

Così ora C è in cima Y. Ma D ed E anche contiene ancora C (il cherry picking non sposta un commit, ne fa solo una copia). Dovrete rebase D ed E in cima a B. E Supponendo che è la punta di branch-E e B è branch-B, è possibile:

$ git checkout branch-E 
$ git rebase --interactive branch-B 

Questo aprirà una sessione rebase interattivo. Basta rimuovere commit C interamente e lasciare intatto D ed E. Quindi D e E si baseranno su B senza C.

+4

Si noti che 'cherry-pick', a partire dalla v1.7.1, può eseguire il cherry-pick di più commit, quindi è possibile utilizzarlo per" yank "altro di uno si impegna. Puoi anche farlo creando un ramo temporaneo su E e ricodificandolo interattivamente su Y, mantenendo solo i commit che vuoi, quindi unendoli (sarà un avanzamento rapido) al ramo di Y. (Funziona sempre, e potrebbe essere più facile comunque, quindi non devi incollare più SHA1.) – Cascabel