¿Cómo arreglar el maestro de git desorderado después de una rebase incorrecta?

Estamos usando git (y gerrit), pero todos en el proyecto son nuevos en git, y es así como cometimos el siguiente error:

  • Todos estábamos usando la twig principal para nuestros compromisos.
  • Creamos una twig de testing separada para un desarrollo lateral.
  • Después de un time, necesitábamos volver a evaluar testbranch para get algunos cambios en el master que se necesitaban en testbranch.
  • Lo que deberíamos haber hecho (creo) fue:
    • git rebase master testbranch
  • Sin embargo, lo que hicimos fue:
    • git rebase testbranch master
    • git push origen HEAD: refs / for / testbranch
  • Esto, nos damos count ahora, tomó todos los cambios maestros recientes y los empujó sobre todos los cambios de la twig de testing.
  • Desafortunadamente, hicimos lo anterior un total de 4 veces en el transcurso de algunos meses, con un gran número de actualizaciones cada vez.
  • Ahora hemos terminado con testbranch y queremos fusionar todos los cambios de testbranch en master.
  • Sin embargo, esto no está funcionando, probablemente obviamente, porque testbranch ya tiene todos los cambios de master, y la cantidad de files y conflictos es enorme, y get / gerrit (no estoy seguro de cuál) sigue dando errores de fusión.

En este punto:

  • ¿Qué podemos hacer para recuperarnos?
  • ¿Deberíamos seleccionar todos los cambios de testbranch? Pero, ¿cómo los identificamos cuando se mezclan con los cambios reubicados del maestro?
  • ¿Deberíamos cambiar el nombre de maestro a old_master y cambiar el nombre de testbranch para que sea el nuevo maestro? Si es así, ¿cómo hacemos esto?

Muchas gracias por cualquier respuesta.

Primero un APE rápido. No deberías estar reubicando sucursales en repositorys servidos. En el escenario que describes, debes fusionar el master en testbranch. Esto agregará sus cambios maestros a testbranch. Al volver a establecer las bases, está reescribiendo el historial de una twig pública (una twig clonada por otros) y esto causará un sinfín de problemas para los desarrolladores que clonen su repository.

Dicho esto, si hubieras reubicado correctamente master para testbranch, entonces master debería tener todos los cambios de master + testbranch. Creo que esto es lo que quieres. Debería poder verificar que el maestro tiene todos los cambios que desea (es decir, todos los cambios de su banco de testings). Si este es el caso, puede avanzar usando su maestro actual.

Si hay cambios adicionales en testbranch que no han sido actualizados para dominar, entonces querrá fusionarlos con el maestro. La fusión debe ser directa ya que master y testbranch son generalmente los mismos debido a tus rebases previos.

El hecho de que estés fusionando conflictos es extraño. Yo recomendaría crear un clon nuevo cuando intente la fusión. Es probable que la rebase que haya hecho contra el repository público confunda cualquier clon que esté realizando cambios.

Alternativamente, si puede verificar que testbranch tiene todos los cambios que desea, puede probar el plan "renombrar sucursal" que describe en la pregunta. Para hacer eso:

  1. Seleccione "Proyectos" en el menu principal de Gerrit
  2. Seleccione "Sucursales" del submenu del proyecto
  3. Cree una twig llamada old_master y configure la "Revisión inicial" para que sea "maestra". Esto creará una nueva twig llamada old_master que apunta hacia donde el maestro está apuntando actualmente. Debería verlo en la list de sucursales con el mismo hash de revisión que el maestro.
  4. Marque la casilla junto a "master" y presione el button Eliminar para eliminar el maestro de twigs.
  5. Cree una nueva twig llamada maestra con la revisión inicial siendo testbranch. Debería ver el maestro en la list de twigs con el mismo hash de revisión como testbranch.

El nuevo maestro ahora es el mismo que testbranch

Tendrá que decirles a todos los desarrolladores que creen un clon nuevo y que dejen de usar clones viejos.