¿Existe una forma rápida de rebasar un largo historial de commits para master branch?

He estado trabajando durante las últimas dos semanas en una function, y creé una twig separada para ella. El problema es que la tarea me llevó mucho time, y no rebase mi twig para dominarla periódicamente. Terminé con más de 100 commits y ahora cuando trato de volver a establecer la base de la twig para dominar usando git rebase master , me está tomando una eternidad, ya que necesito verificar el conflicto para cada commit, modificarlo, git add y luego git rebase --continue .

¿Hay alguna manera más fácil de hacer eso?

Esto depende en parte de cómo has hecho tus más de 100 compromisos y lo que ha estado sucediendo mientras tanto. Cuatro estrategias pueden ser útiles:

Reducir el número de commits para rebase

Si tienes una secuencia hermosa y clara de 100 confirmaciones que nunca modifica el mismo código dos veces, lo siento, pero estás atascado.

Sin embargo, desde 100 commits en dos semanas, supongo que a tu historial de commits no le gusta eso. Tal vez haya modificado la function X 5 veces en el historial de confirmación, y cada una de esas confirmaciones generará un conflicto. Si solo tuvieras una única confirmación de esa function modificada X, tendrías que hacer el 20% del trabajo.

Entonces, la respuesta aquí es orderar tu historial de commits antes de reubicarlo en master. Este es otro uso para 'git rebase'. Vuelve a colocarlo en su base existente , pero usa git rebase -i para interactuar de forma interactiva y reorderar las confirmaciones. Asegúrese de tener la cantidad mínima de confirmaciones y de que cada una haga algo independiente. También puede aprovechar la oportunidad para cambiar los loggings de sus commits. Las twigs key de copy de security ( git branch ) y git diff de aquellas después de cada compromiso para comprobar que no ha cambiado nada.

En particular, si tiene confirmaciones de fusión internas, aplanarlas es útil.

Inevitablemente, cuando hago esto, encuentro cosas que hice mal, o podría haberlo hecho mejor, incluso si se trata de un formatting de código "único" o posts de confirmación. Puede aprovechar la oportunidad para arreglar esto. Supongo que deberías tener 10 o 20 commits cuando esto se haga, mucho más manejable.

Rebase en etapas

Si ya has hecho eso, es probable que tengas que morder la bala. Sin embargo, si un colega ha estado refactorizando mientras trabajaba, a veces lo que mejor hace es lo siguiente. Imagina que el tree se parece un poco a esto:

  A --- B --- C --- D --- E --- F -- .... -- X --- Y --- Z (master) \ \----- 1 --- 2 --- 3 --- 4 .... 97 --- 98 --- 99 --- 100 (you) 

Lo que quiere hacer en última instancia es volver a basar en Z. Sin embargo, esto le da un montón de conflictos. Supongamos que commits D y E son dos megacompromisos de un colega refactorizando algo con lo que su código está tratando. A veces, es más fácil:

  • Rebase en C (esto no debería ser mucho trabajo)
  • Toma una respiración profunda y vuelve a basar en E
  • Rebase en master (esto no debería ser mucho trabajo)

Evitando la complejidad en el lado 'maestro'

A veces las cosas se complicaron mucho en el tree en el que intentas fusionarte. Un caso clásico es que (utilizando el diagtwig anterior), cometer G revierte la confirmación C, luego confirmar H rehace (o casi lo rehace), y mientras tanto hay fusiones (particularmente de las cosas en las que puede haberse fusionado también) . Gracias colega, eso hace que el rebase sea realmente simple. Otras cosas que causan dificultades son confusiones complejas de fusión y renombrados nombres. Cada compromiso tiende a darle los mismos conflictos una y otra vez sin razón aparente. git rebase Aarrggh.

Una técnica aquí es aplanar una copy del tree maestro, es decir, la twig maestra (localmente), y luego volver a clasificarla aplastando todo en una sola confirmación de la A a la Z. También puedes aplanar tus cosas un poco primero (ver arriba). Luego rebase en el maestro aplanado. Ahora que tienes el set de compromisos "correctos", puedes volver a convertirlo fácilmente en maestro (bueno, en "Z" ya que el maestro puede cambiar) porque el código es exactamente el mismo.

Si todo lo demás falla

A veces git rebase parece entrar en un estado de fuga de conflictos, y es hora de romper git format-patch y git am para volver a aplicarlo en su totalidad o en bits. Esto es realmente útil si alguien ha renombrado un file (ya que puede corregir el nombre del file en el parche en su editor) o renombrado una class / variable común / lo que sea (como puede encontrar / replace en el parche).

Aprende de tus errores

La próxima vez, rebase en master más frecuentemente. Es less doloroso si lo haces a medida que avanzas.

Además, si tienes dos personas trabajando en la misma área de código y produce una stack de conflictos, tal vez tu código no esté suficientemente abstraído, ¿o quizás estás trabajando uno encima del otro y podrías dividir mejor tu trabajo?