Cambiar el código de confirmaciones anteriores con git rebase -i

Tengo un repository con varias confirmaciones que deseo fusionar en dos parches. Un parche que introduce la function y otro que cambia el código existente para usarlo. El problema es que cuando estaba codificando y cometiendo no tenía eso en mente, entonces hay compromisos que hacen ambas cosas. ¿Cómo puedo dividir estos commits?

Sé que de alguna manera puedo hacerlo con git rebase -i y elegir edición para cada confirmación que me gustaría cambiar, pero de esta manera solo puedo cambiar el post de confirmación, no el código

Git rebase te permite dividir commits :

En el modo interactivo, puede marcar commits con la acción "editar". Sin embargo, esto no significa necesariamente que git rebase espera que el resultado de esta edición sea exactamente un commit. De hecho, puede deshacer la confirmación, o puede agregar otras confirmaciones. Esto se puede usar para dividir un compromiso en dos:

  • Inicie una database interactiva con git rebase -i ^, donde está la confirmación que desea dividir. De hecho, cualquier range de compromiso funcionará, siempre que contenga ese compromiso.

  • Marque la confirmación que desea dividir con la acción "editar".

  • Cuando se trata de editar esa confirmación, ejecute git reset HEAD ^. El efecto es que HEAD se rebobina en uno, y el índice sigue el juego. Sin embargo, el tree de trabajo permanece igual.

  • Ahora agregue los cambios al índice que desea tener en la primera confirmación. Puedes usar git add (posiblemente interactivamente) o git gui (o ambos) para hacer eso.

  • Confirme el índice actual con cualquier post de compromiso apropiado ahora.

  • Repita los dos últimos pasos hasta que su tree de trabajo esté limpio.

  • Continúa la rebase con git rebase –continuar.

Si no está absolutamente seguro de que las revisiones intermedias sean consistentes (comstackn, pasan la suite de testings, etc.), debe usar git stash para save los cambios aún no confirmados después de cada confirmación, probar y modificar la confirmación si las correcciones son necesarios.

Esto es lo que haría:

 git reset COMMIT_BEFORE_CHANGES --soft 

y vuelva a comprometer todo en las confirmaciones apropiadas. --soft dejará su tree de trabajo y su índice en el estado en que se encuentran antes del reinicio.

No hace falta decir que no deberías hacer algo como esto después de que alguien te haya quitado.