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