Pregunta Hacer que la rama actual de Git sea una rama maestra


Tengo un repositorio en Git. Hice una rama, luego hice algunos cambios tanto al maestro como a la rama.

Luego, decenas de commits más tarde, me di cuenta de que la rama está en un estado mucho mejor que el maestro, por lo que quiero que la rama "se convierta" en el maestro y haga caso omiso de los cambios en el maestro.

No puedo fusionarlo, porque no quiero mantener los cambios en el maestro. ¿Que debería hacer?

Extra: En este caso, el "viejo" maestro ya ha sido push-ed a otro repositorio como GitHub. ¿Cómo cambia esto las cosas?


1310
2018-05-04 05:30


origen


Respuestas:


El problema con las otras dos respuestas es que el nuevo maestro no tiene el antiguo maestro como antepasado, por lo que cuando lo presionas, todos los demás se equivocan. Esto es lo que quieres hacer:

git checkout better_branch
git merge --strategy=ours master    # keep the content of this branch, but record a merge
git checkout master
git merge better_branch             # fast-forward master up to the merge

Si desea que su historial sea un poco más claro, le recomiendo que agregue cierta información al mensaje de compromiso de fusión para dejar en claro lo que ha hecho. Cambiar la segunda línea a:

git merge --strategy=ours --no-commit master
git commit          # add information to the template merge message

1743
2018-05-04 06:00



Asegúrese de que todo esté colocado en su repositorio remoto (GitHub):

git checkout master

Sobrescribir "maestro" con "better_branch":

git reset --hard better_branch

Fuerza el empuje a tu repositorio remoto:

git push -f origin master

168
2018-06-24 20:25



Editar: ¡No dijiste que presionaste 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 manera limpia:

git checkout new-master
git branch -m master old-master
git branch -m new-master master
# And don't do this part.  Just don't.  But if you want to...
# git branch -d --force old-master

Esto hará que los archivos de configuración cambien para coincidir con las ramas renombradas.

También puede hacerlo de manera sucia, lo que no actualizará los archivos de configuración. Esto es una especie de lo que sucede bajo el capó de lo anterior ...

mv -i .git/refs/new-master .git/refs/master
git checkout master

65
2018-05-04 05:37



Cambiar el nombre de la rama a master por:

git branch -M branch_name master

39
2018-05-04 05:37



Las soluciones dadas aquí (renombrando la rama en 'master') no insisten en las consecuencias para el repositorio remoto (GitHub):

    -F
    --fuerza

Por lo general, el comando se niega a actualizar una referencia remota que no sea un antecesor de la referencia local utilizada para sobrescribirla. Esta bandera desactiva el cheque. Esto puede causar que el repositorio remoto pierda commits; Úselo con cuidado.

Si otros ya han retirado su repositorio, no podrán obtener ese nuevo historial maestro sin reemplazar su propio maestro con esa nueva sucursal maestra de GitHub (o tratar con muchas fusiones).
Existen alternativas a un git push --force para repos públicos.
La respuesta de Jefromi (fusionar los cambios correctos al maestro original) es uno de ellos.


11
2018-05-04 05:57



Por lo que entiendo, puedes ramificar la rama actual en una rama existente. En esencia, esto sobrescribirá master con lo que tengas en la rama actual:

git branch -f master HEAD

Una vez que hayas hecho eso, normalmente puedes empujar a tu local master sucursal, posiblemente requiriendo fuerza parámetro aquí también:

git push -f origin master

Sin fusiones, sin comandos largos. Simplemente branch y push- pero si, esto reescribirá la historia del master sucursal, entonces si trabajas en un equipo debes saber lo que estás haciendo.




Alternativamente, descubrí que puede enviar cualquier rama a cualquier rama remota, por lo que:

# This will force push the current branch to the remote master
git push -f origin HEAD:master

# Switch current branch to master
git checkout master

# Reset the local master branch to what's on the remote
git reset --hard origin/master

10
2018-04-04 22:44



También se pueden extraer todos los archivos de la otra rama en master:

git checkout master
git checkout better_branch -- .

y luego comprometer todos los cambios.


6
2018-03-04 17:51



Encontré que este método simple funciona mejor. No reescribe el historial y todos los registros previos de la rama se agregarán al maestro. No se pierde nada, y se puede ver claramente lo que sucedió en el registro de compromiso.

Objetivo: hacer que el estado actual de "rama" sea el "maestro"

Trabajando en una sucursal, comprométase e impulse sus cambios para asegurarse de que sus repositorios locales y remotos estén actualizados:

git checkout master      # Set local repository to master
git reset --hard branch  # Force working tree and index to branch
git push origin master    # Update remote repository

Después de esto, su maestro será el estado exacto de su última confirmación de la bifurcación y su registro de confirmación principal mostrará todos los registros de la sucursal.


5
2018-04-08 15:30