Tengo un repositorio en Git. Hice una rama, luego hice algunos cambios tanto en el maestro como en la rama.
Luego, decenas de confirmaciones más tarde, me di cuenta de que la rama está en un estado mucho mejor que el maestro, así que quiero que la rama se "convierta" en el maestro y no tenga en cuenta los cambios en el maestro.
No puedo fusionarlo, porque no quiero mantener los cambios en master. ¿Qué tengo que hacer?
Extra : en este caso, el maestro 'viejo' ya ha sido push
enviado a otro repositorio como GitHub. ¿Cómo cambia esto las cosas?
Respuestas:
El problema con las otras dos respuestas es que el nuevo maestro no tiene al viejo maestro como antepasado, por lo que cuando lo presionas, todos los demás se equivocarán. Esto es lo que quieres hacer:
Si desea que su historial sea un poco más claro, le recomiendo agregar información al mensaje de confirmación de fusión para que quede claro lo que ha hecho. Cambia la segunda línea a:
fuente
--strategy=ours
es diferente de--strategy=recursive -Xours
. Es decir, "la nuestra" puede ser una estrategia en sí misma (el resultado será la rama actual, pase lo que pase), o pasar como una opción a la estrategia "recursiva" (incorporar los cambios de otra rama y preferir automáticamente los cambios de la rama actual cuando hay un conflicto) )git merge --strategy=ours master -m "new master"
para que funcione.git push
derecho después de esto si desea que su código se transfiera al control remoto. Es posible que vea una advertencia comoYour branch is ahead of 'origin/master' by 50 commits.
Se espera esto. ¡Solo empújalo! : DAsegúrese de que todo esté en su repositorio remoto (GitHub):
Sobrescriba "master" con "better_branch":
Fuerce el empuje a su repositorio remoto:
fuente
git reset --hard origin/master
próxima vez que quieran obtenerla, de lo contrario, git intentará fusionar los cambios en su (ahora) local divergente. Los peligros de esto se explican más en esta respuestaEditar: ¡No dijiste que había empujado a un repositorio público! Eso hace un mundo de diferencia.
Hay dos formas, la "sucia" y la "limpia". Supongamos que su rama se llama
new-master
. Esta es la forma limpia:Esto hará que los archivos de configuración cambien para que coincidan con las ramas renombradas.
También puede hacerlo de la manera sucia, lo que no actualizará los archivos de configuración. Esto es lo que sucede bajo el capó de lo anterior ...
fuente
git branch old-master master; git branch -f master new-master
. Cree la rama de copia de seguridad nueva, luego mueva directamente maestro a maestro nuevo. (Y perdón por escribir mal su nombre, acabo de notar eso)Cambie el nombre de la rama
master
por:fuente
git checkout master&&git reset --hard better_branch
?Por lo que entiendo, puede ramificar la rama actual en una rama existente. En esencia, esto sobrescribirá
master
con lo que tenga en la rama actual:Una vez que haya hecho eso, normalmente puede empujar su
master
rama local , posiblemente requiriendo el parámetro de fuerza aquí también:Sin fusiones, sin comandos largos. Simplemente
branch
ypush
, pero sí, esto reescribirá el historial de lamaster
sucursal, por lo que si trabaja en un equipo debe saber lo que está haciendo.Alternativamente, descubrí que puede empujar cualquier rama a cualquier rama remota, así que
fuente
Encontré la respuesta que quería en la publicación del blog Reemplace la rama maestra con otra rama en git :
Es esencialmente lo mismo que la respuesta de Cascabel . Excepto que la "opción" que agregó a continuación su solución ya está incrustada en mi bloque de código principal.
Es más fácil encontrarlo de esta manera.
Estoy agregando esto como una nueva respuesta, porque si necesito esta solución más adelante, quiero tener todo el código que voy a usar en un bloque de código.
De lo contrario, puedo copiar y pegar, luego leer los detalles a continuación para ver la línea que debería haber cambiado, después de haberlo ejecutado.
fuente
Las soluciones dadas aquí (renombrando la rama en 'maestro') no insisten en las consecuencias para el repositorio remoto (GitHub):
Si otros ya han retirado su repositorio, no podrán extraer ese nuevo historial maestro sin reemplazar su propio maestro con esa nueva rama maestra de GitHub (o tratar con muchas fusiones).
Hay alternativas a un git push --force para repos públicos .
La respuesta de Jefromi (fusionar los cambios correctos con el maestro original) es una de ellas.
fuente
Encontré este método simple para trabajar mejor. No reescribe el historial y todos los registros anteriores de la sucursal se agregarán al maestro. No se pierde nada y puede ver claramente lo que ocurrió en el registro de confirmación.
Objetivo: Convertir el estado actual de "rama" en "maestro"
Al trabajar en una sucursal, confirme y envíe sus cambios para asegurarse de que sus repositorios locales y remotos estén actualizados:
Después de esto, su maestro será el estado exacto de su última confirmación de rama y su registro de confirmación maestra mostrará todos los registros de la rama.
fuente
También se puede retirar todos los archivos de la otra rama al maestro:
y luego cometer todos los cambios.
fuente
Para agregar a la respuesta de Jefromi, si no desea colocar una fusión sin sentido en el historial de la
source
rama, puede crear una rama temporal para laours
fusión y luego tirarla:De esa forma, la confirmación de fusión solo existirá en la historia de la
target
rama.Alternativamente, si no desea crear una fusión, simplemente puede tomar el contenido
source
y usarlos para una nueva confirmación entarget
:fuente
Para mí, quería que mi devl volviera al maestro después de que estuviera por delante.
Mientras está en desarrollo:
fuente
Mi forma de hacer las cosas es la siguiente
fuente
Si está utilizando eGit en Eclipse :
fuente
Los siguientes pasos se realizan en el navegador Git con tecnología de Atlassian (servidor Bitbucket)
Haciendo {current-branch} como
master
master
y nómbrala "master-duplicate".fuente