Git cambia el historial de feature-branch en una nueva twig?

Alguien más puede reformular mejor esta pregunta, pero esto es lo que quiero hacer:

He estado trabajando en una twig de refactorización importante B de larga duración. He estado fusionando regularmente master en y ahora la twig B está por delante de master por ~ 200 commits. Estoy listo para enviar una request de extracción ahora, pero quiero limpiar un poco mi historial de compromisos. Básicamente quiero aplastar todas mis ~ 200 confirmaciones en solo 3 commits:

  • Commit 1 = Todos los files que se borraron
  • Commit 2 = Todos los nuevos files agregados
  • Commit 3 = Todo lo demás, es decir, todos los files movidos / editados

Y, para no arruinarlo, me gustaría hacer esta historia-reescribir en una twig separada de mi propia twig B y enviar esa twig como mi request de extracción.

¿Cuál es la forma más fácil de lograr esto en git?

Supongamos que vas a fusionar para master :

  1. Crear y pagar una nueva sucursal:

     git checkout -b going-to-squash 
  2. Rebase en master

     git rebase --squash master 
  3. Restablecer a la twig principal

     git reset master 
  4. Ahora, toda su sucursal aplastada estará en un estado no comprometido.

    Crea tus nuevos commits ahora.

    Usaría una interfaz gráfica para este paso, pero es perfectamente factible en la línea de command.

Un git rebase --interactive (como se describe en el libro de Pro Git ) no sería práctico, ya que permite recoger o aplastar commits (no partes de commits)

Otra forma podría ser generar un parche gigante (como el git format-patch origin/master ) y luego analizar ese file con 3 files de parche:

  • uno con todas las eliminaciones
  • uno con todas las adiciones
  • el rest

A continuación, puede crear una bifurcación desde la branch B confirmación branch B originada (consulte " Intento de reference de la bifurcación de Git de reference ") y aplicar esos tres parches.