Pregunta Cambiar el nombre de la rama principal para repositorios Git locales y remotos


Tengo la rama master que rastrea la rama remota origin/master.

Quiero cambiarles el nombre a master-old tanto localmente como en el control remoto. ¿Es eso posible? Para otros usuarios que rastrearon origin/master (y quién siempre actualizó su local master rama a través de git pull), ¿qué pasaría después de renombrar la rama remota? ¿Sería su git pull todavía funciona o arrojaría un error que no pudo encontrar origin/master ¿nunca más?

Luego, más adelante, quiero crear un nuevo master rama (tanto local como remota). Una vez más, después de hacer esto, ¿qué pasaría ahora si los otros usuarios lo hacen? git pull?

Creo que todo esto resultaría en muchos problemas. ¿Hay una manera limpia de obtener lo que quiero? O debería simplemente irme master tal como es y crear una nueva rama master-new y solo trabajas allí más adelante?


746
2017-10-06 16:51


origen


Respuestas:


Lo más parecido a cambiar de nombre es eliminar y luego volver a crear en el control remoto. Por ejemplo:

git branch -m master master-old
git push remote :master         # delete master
git push remote master-old      # create master-old on remote

git checkout -b master some-ref # create a new local master
git push remote master          # create master on remote

Sin embargo, esto tiene muchas advertencias. En primer lugar, no hay registros existentes que sepan sobre el cambio de nombre. Git lo hace no intentar rastrear los nombres de las sucursales. Si el nuevo master aún no existe, git pull saldrá error. Si el nuevo master Ha sido creado. el tirón intentará fusionarse master y master-old. Por lo general, es una mala idea, a menos que cuente con la cooperación de todos los que hayan consultado el repositorio anteriormente.

Nota: Las versiones más nuevas de git no le permitirán eliminar la rama maestra de manera remota. Puede anular esto configurando el receive.denyDeleteCurrent valor de configuración para warn o ignore sobre el remoto repositorio. De lo contrario, si está listo para crear un nuevo maestro de inmediato, omita el git push remote :master paso, y pase --force al git push remote master paso. Tenga en cuenta que si no puede cambiar la configuración del control remoto, ¡no podrá eliminar completamente la rama principal!

Esta advertencia solo se aplica a la rama actual (generalmente el master rama); cualquier otra rama se puede eliminar y volver a crear como se indicó anteriormente.


573
2017-10-06 17:35



Asumiendo que estás actualmente en master:

git push origin master:master-old        # 1
git branch master-old origin/master-old  # 2
git reset --hard $new_master_commit      # 3
git push -f origin                       # 4
  1. Primero haz una master-old rama en el origin repositorio, basado en el master comprometerse en el repositorio local.
  2. Crea una nueva sucursal local para este nuevo origin/master-old rama (que se configurará automáticamente como una rama de seguimiento).
  3. Ahora apunta a tu local master a la apuesta que quieras que apunte.
  4. Finalmente, cambio de fuerza master en el origin repositorio para reflejar su nuevo local master.

(Si lo hace de cualquier otra forma, necesita al menos un paso más para asegurarse de que master-old está configurado correctamente para rastrear origin/master-old. Ninguna de las otras soluciones publicadas en el momento de este escrito incluye eso).


240
2017-09-24 20:21



Con Git v1.7, creo que esto ha cambiado un poco. Actualizar la referencia de seguimiento de su sucursal local al nuevo control remoto ahora es muy fácil.

git branch -m old_branch new_branch         # Rename branch locally    
git push origin :old_branch                 # Delete the old branch    
git push --set-upstream origin new_branch   # Push the new branch, set local branch to track the new remote

146
2018-04-25 17:22



git checkout -b new-branch-name
git push remote-name new-branch-name :old-branch-name

Es posible que deba cambiar manualmente a new-branch-name antes de borrar old-branch-name


35
2018-02-10 02:29



Hay muchas maneras de cambiar el nombre de la rama, pero me voy a centrar en el problema más grande: "cómo permitir a los clientes avanzar rápidamente y no tener que meterse con sus sucursales localmente".

Primero una imagen rápida: renaming master branch and allowing clients to fast-forward

Esto es algo realmente fácil de hacer; pero no abusar de eso La idea general depende de los commits de fusión; ya que permiten un avance rápido y vinculan historias de una rama con otra.

renombrando la rama:

# rename the branch "master" to "master-old"
# this works even if you are on branch "master"
git branch -m master master-old

creando la nueva rama "maestra":

# create master from new starting point
git branch master <new-master-start-point>

creando un compromiso de fusión para tener un historial de elementos primarios y secundarios:

# now we've got to fix the new branch...
git checkout master

# ... by doing a merge commit that obsoletes
# "master-old" hence the "ours" strategy.
git merge -s ours master-old

y voilá.

git push origin master

Esto funciona porque crear un merge commit permite reenvío rápido la rama a una nueva revisión.

utilizando un mensaje de confirmación de fusión sensible:

renamed branch "master" to "master-old" and use commit ba2f9cc as new "master"
-- this is done by doing a merge commit with "ours" strategy which obsoletes
   the branch.

these are the steps I did:

git branch -m master master-old
git branch master ba2f9cc
git checkout master
git merge -s ours master-old

25
2018-03-18 00:48



Supongo que todavía estás preguntando por la misma situación que en tu Pregunta anterior. Es decir, master-new no contendrá un master-old en su historial. * Si llama master-new "master", efectivamente tendrá un historial reescrito. No importa cómo te metes en un estado en el que el maestro no es descendiente de un puesto anterior de maestro, simplemente que está en ese estado.

Otros usuarios que intenten extraer mientras que master no existe, simplemente harán que fallen sus pull (no existe esa referencia en el control remoto), y una vez que exista nuevamente en un lugar nuevo, sus pulls tendrán que intentar fusionar su master con el nuevo master remoto. como si fusionas master-old y master-new en tu repositorio. Dado lo que intenta hacer aquí, la fusión tendría conflictos. (Si se resolvieran, y el resultado se devolvió al repositorio, estarías en un estado aún peor; ambas versiones de la historia están allí).

Para responder a su pregunta simplemente: debe aceptar que a veces habrá errores en su historial. Esto está bien. Le pasa a todo el mundo. Hay commits revertidos en el repositorio de git.git. Lo importante es que una vez que publicamos la historia, es algo en lo que todos pueden confiar.

* Si lo hiciera, esto sería equivalente a presionar algunos cambios en el maestro y luego crear una nueva rama donde solía estar. No hay problema.


11
2017-10-06 17:12



los respuesta seleccionada falló cuando lo probé Lanza un error: refusing to delete the current branch: refs/heads/master. Supongo que publicaré lo que funciona para mí:

git checkout master             # if not in master already

git branch placeholder          # create placeholder branch
git checkout placeholder        # checkout to placeholder
git push remote placeholder     # push placeholder to remote repository

git branch -d master            # remove master in local repository
git push remote :master         # remove master from remote repository.

El truco es verificar el marcador de posición justo antes de empujarlo al repositorio remoto. El resto se explica por sí mismo, eliminar la rama principal y enviarla al repositorio remoto debería funcionar ahora. Extraído de aquí.


8
2017-12-25 12:28