git, reordera commits en twigs desorderadas

Tengo un repo de git que me gustaría reestructurar por completo.

En general, tengo tres características, llamémoslas A , B , C , en las que he estado trabajando durante las últimas semanas. Desafortunadamente, he sido un poco impensado con respecto a cómo usar las twigs para dividir mi trabajo en las funciones correctamente, y de alguna manera también salté de una function a otra, incluso entre las confirmaciones.

Así que ahora tengo tres twigs A_devel , B_devel , C_devel y en cada twig un montón de commits que pertenecen a cada una de las tres características. Algunos commits de la característica A también contienen algunos cambios para la característica B en B_devel , algunos de B con cambios para A en C_devel y así sucesivamente. Algunas confirmaciones están incluso en la twig master , que contiene cambios para cualquiera de las características. Y todos los commits también se han enviado al origin .

Es un caos completo …

… que me gustaría limpiar ahora

Al less puedo ver a partir de los posts de compromiso y, en algunos casos, solo de las diferencias de código en las que he estado trabajando en cada compromiso en particular. Entonces sé qué compromiso pertenece a cada característica. Solo necesito saber cómo mover las confirmaciones a la twig correcta correspondiente.

// edit: por cierto, debo mencionar que soy el único que trabaja en este repository, tanto localmente como en origen. Así que lo más probable es que nadie tenga problemas con un historial modificado … solo en caso de que sea necesario.

Tenga en count lo siguiente antes de leer el rest de la respuesta:

  1. git reset o rebase hacen reescritura de historial, por lo que no deberían usarse si el historial se publicó. Esto no debería ser un problema en su caso, ya que usted es el único que utiliza el repository.
  2. cherry-pick, a partir de v1.7.1, puede seleccionar varias confirmaciones, por lo que puede usar esto para "arrastrar" más de una apuesta.

Entonces mi estrategia sugerida sería algo como sigue. Considere la siguiente estructura que tiene una mezqueuenza de cambios relacionados con las características A y B en dos twigs:

  A1--A2--B1--B2--A3 (A_Devel HEAD) / ooX (master HEAD) \ B3--B4--A4--B5 (B_Devel HEAD) 

lo que queremos es:

  A1--A2--A3--A4 (A_Devel HEAD) / ooX (master HEAD) \ B1--B2--B3--B4--B5 (B_Devel HEAD) 

Asegúrese de que todas las twigs de características tengan todas las confirmaciones relevantes + algunas innecesarias

Copie todo el compromiso relacionado con la característica A a A_Devel desde B_Devel:

  1. git checkout A_Devel
  2. git cherry-pick A4

dando

  A1--A2--B1--B2--A3--A4 (A_Devel HEAD) / ooX (master HEAD) \ B3--B4--A4--B5 (B_Devel HEAD) 

  1. git checkout B_Devel
  2. git cherry-pick B1 B2

dando

  A1--A2--B1--B2--A3--A4 (A_Devel HEAD) / ooX (master HEAD) \ B3--B4--A4--B5--B1--B2 (B_Devel HEAD) 


Ahora elimine las confirmaciones irrelevantes

  1. git checkout A_Devel
  2. git rebase -i HEAD~~~~ (queremos eliminar B1, B2)
  3. El editor abre con: pick B1 pick B2 pick A3 pick A4

Borre las primeras dos líneas y guarde y salga del editor. Espere a que termine la rebase.

Ahora tendremos:

  A1--A2--A3--A4 (A_Devel HEAD) / ooX (master HEAD) \ B3--B4--A4--B5--B1--B2 (B_Devel HEAD) 

Del mismo modo, para la twig B_Devel:

  1. git checkout B_Devel
  2. git rebase -i HEAD~~~~~~ (queremos cambiar cosas en los últimos 6 commits)
  3. El editor abre con: pick B3 pick B4 pick A4 pick B5 pick B1 pick B2

elimine la línea con A1 y reordere los cambios "B" restantes para que se vean así:

  pick B1 pick B2 pick B3 pick B4 pick B5 

Guarde, salga, espere a que termine la rebase, lo que finalmente nos dará:

  A1--A2--A3--A4 (A_Devel HEAD) / ooX (master HEAD) \ B1--B2--B3--B4--B5 (B_Devel HEAD) 

Definitivamente no es una buena solución, pero si estás revisando todo el logging, teóricamente podrías usar una combinación de git cherry-pick <commithash> para get un commit de una twig a otra, y git rebase -i (rebase interactivo ) para reorderar commits en su twig.

Lea más sobre esto aquí.