¿Cómo particionar un commit de git en dos, basado en el mismo padre?

Estoy en la sucursal foo, con el padre A:

---A---foo 

Quiero dividir los cambios de A a foo en dos twigs, ambas basadas en A. Creo que puedo hacer la mitad del trabajo de esta manera:

 git checkout -b halfFoo git reset HEAD~ # Only choose half the stuff. git add -i git commit 

Eso me da:

 ---A---foo \ \-halfFoo 

Sé cómo conseguirlo (git checkout -b otherHalfFoo; git commit -a):

 ---A---foo \ \-halfFoo \ \-otherHalfFoo 

Pero lo que me gustaría es get esto:

 ---A---foo |\ | \-halfFoo \ \-otherHalfFoo' 

¿Cómo puedo hacer esto sin tener que pasar por 'git add -i' (y seleccionar el negativo de lo que se eligió para halfFoo) nuevamente?

Primero, rebobina a tu confirmación anterior, dejando en los cambios desde entonces. Luego bifurca y aplica algunos de los cambios. Vástase desde la twig original nuevamente y aplique el rest de los cambios.

 git branch original_tip_with_foo # if you want a reference to the foo commit git reset HEAD~ git stash git branch branch_2 # we'll get there in a moment ... git checkout -b branch_1 git stash pop git add -p # ... add your first set of changes, for the first branch ... git commit -m'first set of changes' git stash git checkout branch_2 git stash pop git add -p # ... add your second set of changes ... git commit -m'second set of changes' 

La forma más simple es esta:

 git checkout -b branch1 foo git rebase -i A git checkout -b branch2 foo git rebase -i A 

Cuando se le solicite, elimine las líneas que contienen las confirmaciones que no desea y marque las que necesite editar con una "e" en lugar de la "selección".

De tus charts, para llegar a la última image del penúltimo gráfico, revisa A de nuevo, crea una nueva twig y selecciona otra. A continuación, reinicie –hard la twig con medioFoo a la confirmación correcta (HEAD ~ 1 probablemente).

Use la checkout -i para seleccionar de manera interactiva los bits que desea en la mitad, y asígnelos. Luego use git revert en la twig con todo para eliminar lo que divide.

De su ejemplo en branch foo, con el padre A:

 ---A---foo 

Cree una nueva sucursal y agregue de forma interactiva los cambios que desee allí:

 git co -b halfFoo foo~ git checkout -i foo git commit 

Eso da:

 ---A---foo \ \-halfFoo 

Luego, crea fácilmente una twig que sea foo sin los elementos que seleccionaste para halfFoo usando git revert revert:

 git co -b otherHalfFooWithHistory foo git revert halfFoo ---A---foo \ \-otherHalfFooWithHistory \-halfFoo 

Que es conceptualmente lo que quieres para otherHalfFoo, pero tiene un historial donde todo foo existía y luego algo fue eliminado. Opcionalmente puede limpiarlo con merge --squash :

 git co -b otherHalfFoo foo~ git merge --squash otherHalfFooWithHistory git branch -D otherHalfFooWithHistory ---A---foo |\ | \-halfFoo \ \-otherHalfFoo