Eliminar confirmaciones de una sola sucursal en Git

Tengo dos twigs, maestra y característica1. Estaba trabajando en feature1 cuando me di count de que necesitaba trabajar en otra cosa no relacionada. Desafortunadamente, me olvidé de la bifurcación desde el maestro, y en su lugar creé mi twig feature2 desde feature1. Ahora quiero fusionar feature2 en master, pero no puedo porque hay partes de feature1 en esa twig.

¿Cómo elimino los commit de feature1 de la twig feature2? ¿Implica volver a basar?

Siento que si pudiera cambiar el punto de reference de inicio de feature2 para estar donde está master, eso podría ayudar, pero no tengo idea de cómo.

EDITAR:

¡Gracias por las respuestas! Intenté volver a basarme según la solución de @Mark, pero me di count de que la historia es más complicada de lo que originalmente pensé. la característica 2 se ha fusionado en otras twigs de características, y la maestra se ha fusionado en la característica 2 en un punto. También hay compromisos adicionales en el maestro que no están relacionados con la característica2. Todo sigue siendo local.

Realmente, mi historia es más como esta:

A - B - C - D - - - - - - - - - - - - - L - M master | | - I - J - K feature2 \ / \ - E - F - G - H - - - - - -N - O - P feature1 

Y lo que quiero es esto:

 A - B - C - D - - - - - - - - - - L - M master |\ | - - - - - I - J - K feature2 \ \ - E - F - G - H - - - N - O - P feature1 

También he intentado:

 git rebase --onto 1524b824cfce5856a49e feature1 feature2 // 1524b824cfce5856a49e == D 

Pero esto solo establece que la característica de nombre de twig 2 apunte a 1524, y deja commits I, J, K con sus padres originales.

Si solo estás trabajando en tu twig de feature2 y no la has compartido con otras personas, está bien volver a establecer la base de esa twig antes de fusionarla. Podría hacer lo siguiente, por ejemplo:

 git checkout feature2 git rebase --onto master feature1 feature2 

… que reescribirá su twig feature2 , dejándola de forma que consista en todas las confirmaciones de feature2 ya que se ramificó desde feature1 , pero se volvió a aplicar en master . Le sugiero que use gitk --all o un visor de historial de git similar después para verificar que el resultado de esta operación es el que desea.

Por cierto, este es exactamente el escenario utilizado para explicar --onto en la documentation de git rebase – ver el párrafo que comienza:

A continuación, le mostramos cómo trasplantar una twig de tema basada en una twig a otra, para pretender que bifurcó la twig de tema de la última twig, utilizando rebase –onto. […]


Actualizado en respuesta a más material en la pregunta:

Comenzando con tu historial, que se ve así:

 A - B - C - D - - - - - - - - - - - - - L - M master | | - I - J - K feature2 \ / \ - E - F - G - H - - - - - -N - O - P feature1 

Puedes get lo que quieras haciendo lo siguiente:

 git checkout feature2 git rebase --onto DH feature2 

Esto te dejará con la historia que se ve así:

 A - B - C - D - - - - - - - - - - - - - - - - - - - L - M master |\ | \ - I' J' K' feature2 I - J - K \ / \ - - - - - - - E - F - G - H - - - - - -N - O - P feature1 

Antes de crear la fusión que desea en la característica 1, debe anotar el SHA1sum de O y P (Supongo que N es solo una fusión normal, y no una "fusión maligna").

A continuación, realice un restablecimiento completo para volver a mover la function1 a H :

 git checkout feature1 git rest --hard H 

Entonces deberías tener la historia:

 A - B - C - D - - - - - - - - - - - - - - - - - - - L - M master |\ | \ - I' J' K' feature2 \ - - - - - - - E - F - G - H feature1 

Ahora aparentemente quiere fusionar K' en feature1 :

 git merge K' A - B - C - D - - - - - - - - - - - - - - - - - - - L - M master |\ | \ - I' - J' - - - - - - - K' feature2 \ \ - - - - - - - E - F - G - H - Z feature1 

Y, por último, puedes elegir el viejo O y P en feature1 con:

 git cherry-pick O git cherry-pick P 

… dejar:

 A - B - C - D - - - - - - - - - - - - - - - - - - - L - M master |\ | \ - I' - J' - - - - - - - K' feature2 \ \ - - - - - - - E - F - G - H - Z - - O' - P' feature1 

Si no te importa que feature2 se fusione de nuevo en P lugar de M , aquí hay una solución relativamente simple.

  1. Rebase IJK en D, mire el título de la sección " rebases más interesantes"
  2. Rebase OP en H. de la misma manera que en el paso 1
  3. Finalmente combine feature2 en feature1 con git merge feature2 mientras tiene feature1 desprotegido.

Si desea que K fusione en un compromiso en particular, el rebase se torna un poco más complicado.