Reorderación de confirmaciones

Actualmente estoy trabajando en una sucursal y quiero algunos compromisos para fusionarme en otras twigs:

abcdefg (branchA) / --oxxxxxxxxxx (master) \ xxxxx (branchB) 

(Las letras denotan commits, y las "x" son commits irrelevantes.)

Sin embargo, noté que sería una buena idea agrupar algunos commits. Quiero "concatenar" cometer a, d, eyg en un parche y comprometerlo a dominar. Los compromisos b y f deberían ir como uno se compromete a branchB. ¿Hay una buena manera de 'git'-ish para lograrlo?

El command que estás buscando es git rebase , específicamente la opción -i/--interactive .

Voy a suponer que quieres dejar commit c en la twig A, y que realmente quieres decir que quieres mover los otros commits a las otras twigs, en lugar de fusionar, ya que las fusiones son simples. Comencemos manipulando la twig A.

 git rebase -i <SHA1 of commit a>^ branchA 

El ^ significa el compromiso anterior, por lo que este command dice que rebase la twig A usando el compromiso antes de "a" como la base. Git te presentará una list de confirmaciones en este range. Reorderarlos y decirle a git que elimine los apropiados:

 pick c ... pick a ... squash d ... squash e ... squash g ... pick b squash f 

Ahora la historia debería verse así:

  c - [a+d+e+g] - [b+f] (branchA) / --oxxxxxxxxxx (master) 

Ahora, agarremos el commit b + f recién aplastado para branchB.

 git checkout branchB git cherry-pick branchA # cherry-pick one commit, the tip of branchA 

Y lo mismo para a + d + e + g para el maestro:

 git checkout master git cherry-pick branchA^ 

Finalmente, actualice branchA para que apunte a c:

 git branch -f branchA branchA^^ 

Ahora deberíamos tener:

  c (branch A) - [a+d+e+g] - [b+f] (dangling commits) / --oxxxxxxxxxx-[a+d+e+g] (master) \ xxxxx-[b+f] (branchB) 

Tenga en count que si tenía varios commits que quería mover entre branches, podría usar rebase nuevamente (de forma no interactiva):

 # create a temporary branch git branch fromAtoB branchA # move branchA back two commits git branch -f branchA branchA~2 # rebase those two commits onto branchB git rebase --onto branchB branchA fromAtoB # merge (fast-forward) these into branchB git checkout branchB git merge fromAtoB # clean up git branch -d fromAtoB 

Finalmente, un descargo de responsabilidad: es muy posible reorderar commits de tal manera que algunos ya no se apliquen limpiamente. Esto podría deberse a que eligió un pedido incorrecto (poniendo un parche antes de la confirmación introduciendo la function que parchó); en ese caso, querrás abortar la rebase ( git rebase --abort ). De lo contrario, tendrá que arreglar los conflictos de forma inteligente (como lo hace con los conflictos de combinación), agregar las correcciones, luego ejecutar git rebase --continue para git rebase --continue . Estas instrucciones también son provistas por el post de error impreso cuando ocurre el conflicto.

git rebase es lo que quieres. Echa un vistazo a la opción interactiva.

git rebase --interactive

Campo de golf:

Si desea reorderar solo las últimas dos confirmaciones , puede este git reorder alias: http://sofes.miximages.com/a/33388211/338581