Deshaciendo un viejo compromiso anterior rápido

Mirando hacia atrás en algún trabajo que hice, hubo un compromiso de avance rápido que realmente hace que sea difícil decir en qué se trabajó, por lo que me gustaría mover ese compromiso a su propia twig. Aquí está mi situación actual:

A--B--C--D 

Y digamos que C es el compromiso que quiero mover. C también (desde el commit FF) tiene su propia twig que está en él ( branch2 ). Quiero que se vea así:

 A--B--------C2--D \ / \ / C--/ 

Así que C está en branch2 y C2 es un commit de fusión y A, B y D están todos en master .

Aquí hay alguna información adicional:

 $ git reflog show branch2 245c52c branch2@{0}: commit: C 7c2a064 branch2@{1}: branch: Created from HEAD $ git reflog show master c0a8aff master@{0}: commit: D 244c52c master@{1}: merge branch2: Fast-forward 8a93b2f master@{2}: commit: B fe872d8 master@{3}: commit: A 

Si usted tiene:

  A--B--C--D (master) | (branch2) 

Puede restablecer el master y volver a hacer la fusión (de una manera que no sea FF) , luego seleccionar con cuidado D (o rebase , si D es realmente múltiples confirmaciones)

 git checkout master git branch tmp # mark D if you need to git reset --hard B git merge --no-ff branch2 A--B----C2 \ / --C (branch2) \ --D (tmp) 

Entonces:

 git cherry-pick D 

Si D en realidad estaba compuesto de múltiples commits, la twig ' tmp ' sería útil:

 git rebase --onto master branch2 tmp 

Eso repetiría todas las confirmaciones después de branch2 (excluyendo C), hasta tmp HEAD (que es D ) encima de master ( C2 )