¿Cómo reemplazar la rama maestra en Git, por completo, desde otra rama?

Tengo dos ramas en mi repositorio Git:

  1. maestro
  2. seotweaks (creada originalmente desde master)

Creé seotweaks con la intención de fusionarlo rápidamente con master. Sin embargo, eso fue hace tres meses y el código en esta rama está 13 versiones por delante de master.

Se ha convertido en nuestra rama maestra de trabajo, ya que todo el código de master es más o menos obsoleto ahora.

Muy mala práctica, lo sé, lección aprendida.

¿Sabes cómo puedo reemplazar todo el contenido de la rama master con los de seotweaks?

Podría borrar todo lo que hay en master y fusionar, pero esto no me parece una buena práctica.

Solución

Usted debe ser capaz de utilizar la estrategia de fusión "nuestro" para sobrescribir maestro con seotweaks así:

git checkout seotweaks
git merge -s ours master
git checkout master
git merge seotweaks

El resultado debe ser su maestro es ahora esencialmente seotweaks.

(-s ours es la abreviatura de --strategy=ours)

De los docs sobre la estrategia nuestra:

Esto resuelve cualquier número de cabezas, pero el árbol resultante de la fusión es siempre el de la cabeza de la rama actual, ignorando efectivamente todos los cambios de todas las otras ramas. Está pensada para ser usada para reemplazar la historia de desarrollo antigua de las ramas laterales. Tenga en cuenta que esto es diferente de la opción -Xours de la estrategia de fusión recursiva.

Actualización de los comentarios: Si obtienes el mensaje fatal: refusing to merge unrelated histories, entonces cambia la segunda línea por esto: git merge --allow-unrelated-histories -s ours master

Comentarios (39)

¿Qué tal si usas git branch -m para renombrar la rama master a otra, y luego renombrar la rama seotweaks a master? Algo así:

git branch -m master old-master
git branch -m seotweaks master
git push -f origin master

Esto podría eliminar los commits del master de origen, por favor comprueba tu master de origen antes de ejecutar git push -f master de origen.

Comentarios (16)

Puedes renombrar/eliminar la rama maestra en remoto, pero esto será un problema si mucha gente ha basado su trabajo en la rama maestra remota y ha sacado esa rama en su repo local.
Este podría no ser el caso aquí, ya que todo el mundo parece estar trabajando en la rama 'seotweaks'.

En ese caso puedes:
git remote --show puede no funcionar. (Haz un git remote show para comprobar cómo está declarado tu remoto dentro de tu repo local. Asumiré origin) (Respecto a GitHub, house9 comenta: "Tuve que hacer un paso adicional, hacer clic en el botón Admin en GitHub y establecer la Rama por defecto a algo distinto de master, y luego volver a ponerlo después")

git branch -m master master-old  # rename master on local
git push origin :master          # delete master on remote
git push origin master-old       # create master-old on remote
git checkout -b master seotweaks # create a new local master on top of seotweaks
git push origin master           # create master on remote

Pero de nuevo:

  • si otros usuarios intentan hacer un pull mientras el master está borrado en el remoto, sus pulls fallarán ("no such ref on remote")
  • cuando el master se recrea en remoto, un pull intentará fusionar ese nuevo master en su master local (ahora antiguo): muchos conflictos. En realidad, necesitan reajustar --hard su master local a la rama remota/master que van a obtener, y olvidarse de su master actual.
Comentarios (6)