2012-06-20 18 views
6

Nuestro flujo de trabajo de desarrollo git es que las ramas de temas se actualizan continuamente en el último máster hasta que se fusionen.Modificar el historial de una rama de tema git que usó fusiones para usar rebases

Sin embargo, un nuevo desarrollador ha creado ramas temáticas en las que ha realizado varias fusiones maestras en sus ramas temáticas para mantenerlas actualizadas.

A---B---C---D---E topic 
/ //
    F---G---H---I master 

Si bien la fusión de esta rama de tema a principal sería perfectamente correcta, da como resultado una historia muy desordenada. Quiero convertir estas ramas puntuales en una historia porcentualizada lineal limpio, que se pueden combinar limpiamente en la principal con un solo --no-ff fusión cometer es decir:

   A'---B'---E' topic 
      /
    F---G---H---I master 

Idealmente, habría algún git-fu que permitiría que haga la rebase, tomando las confirmaciones en la rama temática tal como está, mientras se aplica automáticamente la información de resolución de conflictos de fusión ya disponible en el tema consolidaciones de fusión como C y D.

Sé que puedo simplemente aplicar el parche de "git diff master..topic "y luego use rebase para trabajar hacia atrás y dividir manualmente el único parche en commits individuales, pero ¿hay un enfoque más simple y más elegante?

He intentado directamente git rebase y git rebase -p comandos sin suerte.

Respuesta

4

Encontré que el siguiente proceso parece funcionar razonablemente bien, aunque no perfectamente. Es posible que se requieran algunas resoluciones de conflictos menores, ver abajo.

  1. Asegurar la rama tema es puesta al día de las últimas maestro haciendo una fusión definitiva de maestro, si no lo ha hecho ya:

    git checkout topic 
    git merge master 
    
  2. simplificar la historia de la rama tópico con exclusión de fusiones:

    git log --no-merges 
    
  3. desde el registro anterior, determinan el punto de ramificación (el comprometerse en maestro antes de cometer la primera rama tema, que debe ser cometer F).

  4. rebase la rama tema en maestro, haciendo caso omiso de fusiones (que es el valor por defecto, es decir, no utilice la opción --preserve-merges/-p), la resolución de cualquier conflicto.

    git checkout master 
    git rebase --onto HEAD F topic 
    

    He encontrado que durante rebase, a menudo un conflicto daría lugar en el que un archivo se encontraba en un "Tanto Modificado" estado de conflicto, pero no contenían marcas de conflicto, por lo que un simple git add y git rebase --continue era suficiente para resolver el conflicto y continuar. Creo que git estaba usando la resolución anterior para resolver los conflictos.

    Además, en algunas ramas más complejas, se requerirán varios comandos git rebase --onto HEAD ..., o alternativamente git cherry-pick se pueden utilizar para seleccionar compromisos individuales. Simplemente trabaje a través del registro que se proporciona en el Paso 2, vuelva a establecer los rangos en HEAD y/o haga una selección especial de tareas individuales según sea necesario.

  5. El encabezado actual ahora debería representar la rama de tema rebasada.Verificar que el resultado coincide con la rama tema original, comprobando que los resultados del diff en ninguna salida:

    git diff topic..HEAD 
    
  6. Nombre HEAD para el nombre de la sucursal tema porcentualizada:

    git checkout -b rebased-topic 
    
1

respuesta de Raman más o menos funcionó para mí, pero pensé que agregaría más detalles sobre el paso 4, que fue complicado para mí ...

Tenía un repositorio que era más complicado, era así

 Q-R-S-T-U-V-W-X 
    // //
A-B-C-D-E-F-G-H-I-J-K 

yo quería esto:

     Q'-R'-S'-T'-U'-V'-W'-X' 
        /
A-B-C-D-E-F-G-H-I-J-K 

Lo que funcionó fue hacer git rebase --onto HEAD Q R, entonces git rebase --onto HEAD S U, así que básicamente el acaparamiento de los rangos de confirmaciones entre los lugares en los que se fusionaron en master a topic. Todo el tiempo que estuve haciendo esto, estaba en un estado de cabeza separada, así que no te preocupes si ves eso. Hubo algunas veces en que tuve conflictos de fusión, pero todos eran conflictos legítimos que esperaba ver.

Finalmente, tenía una rama que parecía correcta (Paso 6 en la respuesta de Raman), pero por alguna razón tuve que volver a trabajar en la maestra para mover las confirmaciones. No sé por qué tuve que hacer eso, pero fue sin problemas.

Creo que hacerlo de esta manera es básicamente equivalente a la selección de cerezas, por lo que podría ser más sencillo hacerlo en su lugar.

+0

Hmm, ¿estás seguro de que es realmente lo que querías? S, V y X en su gráfica parecen ser uniones de fusión, por lo que no deberían estar presentes como S ', V' y X 'en el estado deseado. A menos que contuvieran un montón de resolución manual de conflictos, supongo. – Raman

Cuestiones relacionadas