remotas - ver ramas git
Haz de la rama Git actual una rama maestra (13)
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 mucho mejor estado que la del maestro, por lo que quiero que la rama se "convierta" en el maestro y desestime los cambios en el maestro.
No puedo fusionarlo, porque no quiero mantener los cambios en el maestro. ¿Qué tengo que hacer?
Extra : en este caso, el maestro ''antiguo'' ya se ha enviado a otro repositorio como GitHub. ¿Cómo cambia esto las cosas?
Asegúrese de que todo esté en su repositorio remoto (GitHub):
git checkout master
Sobrescriba "master" con "better_branch":
git reset --hard better_branch
Forzar el empuje a su repositorio remoto:
git push -f origin master
El problema con las otras dos respuestas es que el nuevo maestro no tiene al antiguo maestro como un antepasado, por lo que cuando lo presionas, todos los demás se desordenarán. 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 información al mensaje de confirmación de fusión para aclarar lo que ha hecho. Cambia la segunda línea a:
git merge --strategy=ours --no-commit master
git commit # add information to the template merge message
Encontré este método simple para trabajar mejor. No reescribe el historial y todas las revisiones anteriores de la rama se agregarán al maestro. No se pierde nada, y puede ver claramente lo que ocurrió en el registro de confirmación.
Objetivo: Hacer que el estado actual de "rama" sea el "maestro".
Trabajando en una rama, confirme e inserte 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 rama y su registro de confirmación maestro mostrará todos los registros de la rama.
Encontré la respuesta que quería en la publicación del blog Reemplace la rama maestra por otra rama en git :
git checkout feature_branch
git merge -s ours --no-commit master
git commit # Add a message regarding the replacement that you just did
git checkout master
git merge feature_branch
Es esencialmente lo mismo que la respuesta de Cascabel . Excepto que la "opción" que agregó debajo de su solución ya está incorporada en mi bloque de código principal.
Es más fácil de encontrar 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 que ya la ejecuté.
Las soluciones que se dan aquí (cambiar el nombre de la rama en ''maestro'') no insisten en las consecuencias para el repositorio remoto (GitHub):
- Si no presionó nada desde la creación de esa rama, puede cambiarle el nombre y presionarlo sin ningún problema.
- Si tuvo un Master Push en GitHub, necesitará ''Git Push -f'' la nueva rama: ya no puede presionar en un modo de avance rápido .
-f --force
Generalmente, el comando se niega a actualizar una referencia remota que no es un antecesor de la referencia local utilizada para sobrescribirla. Esta bandera desactiva el cheque. Esto puede hacer que el repositorio remoto pierda confirmaciones; Úsalo con cuidado.
Si otros ya han retirado tu repo, no podrán extraer ese nuevo historial maestro sin reemplazar su propio maestro con esa nueva rama maestra de GitHub (o lidiar con muchas fusiones).
Hay alternativas a un impulso de git - forzar para repositorios públicos .
La respuesta de Jefromi (fusionar los cambios correctos con el maestro original) es uno de ellos.
Los siguientes pasos se realizan en el navegador Git con tecnología de Atlassian (servidor de Bitbucket)
Haciendo {current-branch} como master
- Haga una rama de
master
y llámela "maestro-duplicado". - Haga una rama de {current-branch} y asígnele el nombre “{current-branch} -copy”.
- En la configuración del repositorio (Bitbucket), cambie “Ramificación predeterminada” para que apunte a “duplicado maestro” (sin este paso, no podrá eliminar el maestro: “En el paso siguiente”).
- Eliminar rama "maestra": hice este paso desde el árbol de origen (puede hacerlo desde el CLI o el navegador Git)
- Cambie el nombre de "{current-branch}" a "master" y presione el repositorio (esto creará una nueva rama "master" y aún existirá "{current-branch}").
- En la configuración del repositorio, cambie "Rama predeterminada" para que apunte a "maestro".
Mi forma de hacer las cosas es la siguiente.
#Backup branch
git checkout -b master_backup
git push origin master_backup
git checkout master
#Hard Reset master branch to the last common commit
git reset --hard e8c8597
#Merge
git merge develop
Para agregar a la respuesta de Jefromi, si no desea colocar una fusión sin sentido en el historial de la rama de source
, puede crear una rama temporal para la fusión de la ours
y luego desecharla:
git checkout <source>
git checkout -b temp # temporary branch for merge
git merge -s ours <target> # create merge commit with contents of <source>
git checkout <target> # fast forward <target> to merge commit
git merge temp # ...
git branch -d temp # throw temporary branch away
De esa manera, la confirmación de fusión solo existirá en el historial de la rama de target
.
Alternativamente, si no desea crear una combinación, simplemente puede tomar el contenido de la source
y usarlo para una nueva confirmación en el target
:
git checkout <source> # fill index with contents of <source>
git symbolic-ref HEAD <target> # tell git we''re committing on <target>
git commit -m "Setting contents to <source>" # make an ordinary commit with the contents of <source>
Por lo que entiendo, puede ramificar la rama actual en una rama existente. En esencia, esto sobrescribirá el master
con lo que tenga en la rama actual:
git branch -f master HEAD
Una vez que haya hecho eso, normalmente puede empujar su rama master
local, posiblemente requiriendo el parámetro de fuerza aquí también:
git push -f origin master
No se fusiona, no hay órdenes largas. Simplemente branch
y push
- pero, sí, esto volverá a escribir el historial de la rama master
, así que si trabaja en un equipo debe saber lo que está haciendo.
Alternativamente, descubrí que puedes empujar cualquier rama a cualquier rama remota, así 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
Renombra la rama a master
por:
git branch -M branch_name master
Si está utilizando eGit en Eclipse :
- Haga clic derecho en el nodo del proyecto.
- Elija Equipo → luego Avanzado → luego Renombrar rama
- Luego expanda la carpeta de seguimiento remoto .
- Elija la rama con el nombre incorrecto, luego haga clic en el botón Cambiar nombre, cambie el nombre a cualquiera que sea el nombre nuevo.
- Elija el nuevo maestro, luego renómbrelo a maestro.
Uno también puede sacar todos los archivos de la otra rama al maestro:
git checkout master
git checkout better_branch -- .
y luego cometer todos los cambios.
Edit: ¡No dijiste que habías empujado a un repo público! Eso hace un mundo de diferencia.
Hay dos formas, la manera "sucia" y la manera "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 que coincidan con las ramas renombradas.
También puede hacerlo de forma sucia, lo que no actualizará los archivos de configuración. Esto es algo de lo que sucede bajo el capó de lo anterior ...
mv -i .git/refs/new-master .git/refs/master
git checkout master