repositorio remote remota rama origin example eliminar crear actualizar git git-branch

remote - git push origin master



Renombra la rama maestra para los repositorios locales y remotos de Git (15)

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

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 que siempre actualizaron su sucursal master local a través de git pull ), ¿qué pasaría después de que cambiara el nombre de la rama remota? ¿Su git pull todavía funcionaría o lanzaría un error que ya no podía encontrar origin/master ?

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

Supongo que todo esto resultaría en muchos problemas. ¿Hay una manera limpia de conseguir lo que quiero? ¿O debería simplemente dejar master como es y crear una nueva rama master-new y seguir trabajando allí?


Asumiendo que actualmente estás 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 haga una rama master-old en el repositorio de origin , con base en la confirmación master en el repositorio local.
  2. Cree una nueva rama local para esta nueva rama de origin/master-old (que se configurará automáticamente como una rama de seguimiento).
  3. Ahora apunte a su master local a cualquier compromiso al que desee que apunte.
  4. Finalmente, forzar el cambio de master en el repositorio de origin para reflejar su nuevo master local.

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


Bueno. Mis 2 centavos. ¿Qué hay de iniciar sesión en el servidor, ir al directorio git y cambiar el nombre de la rama en el repositorio simple. Esto no tiene todos los problemas asociados con volver a cargar la misma rama. En realidad, los ''clientes'' reconocerán automáticamente el nombre modificado y cambiarán su referencia remota. Después (o antes) también puede modificar el nombre local de la rama.


Con Git v1.7, creo que esto ha cambiado ligeramente. Ahora es muy fácil actualizar la referencia de rastreo de su sucursal local al nuevo control remoto.

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


Creo que la clave es darse cuenta de que está realizando un doble cambio de nombre: de master a master-old y también de master-new a master .

De todas las otras respuestas he sintetizado esto:

doublerename master-new master master-old

donde primero tenemos que definir la función Bash del doublerename :

# doublerename NEW CURRENT OLD # - arguments are branch names # - see COMMIT_MESSAGE below # - the result is pushed to origin, with upstream tracking info updated doublerename() { local NEW=$1 local CUR=$2 local OLD=$3 local COMMIT_MESSAGE="Double rename: $NEW -> $CUR -> $OLD. This commit replaces the contents of ''$CUR'' with the contents of ''$NEW''. The old contents of ''$CUR'' now lives in ''$OLD''. The name ''$NEW'' will be deleted. This way the public history of ''$CUR'' is not rewritten and clients do not have to perform a Rebase Recovery. " git branch --move $CUR $OLD git branch --move $NEW $CUR git checkout $CUR git merge -s ours $OLD -m $COMMIT_MESSAGE git push --set-upstream --atomic origin $OLD $CUR :$NEW }

Esto es similar a un cambio de historia de git rebase en que el contenido de la rama es bastante diferente, pero difiere en que los clientes aún pueden avanzar de forma segura con git pull master .


Esta es la forma más simple y "legible" que conozco:

''Mover'' rama local utilizando -m

git branch -m my_old_branch_name my_new_branch_name

Empuje la rama ''movida'' hacia el control remoto, configure ''corriente arriba'' usando -u

git push origin -u my_new_branch_name

(la configuración ''aguas arriba'' esencialmente ''conecta'' su sucursal local al remoto, de modo que funcionen las funciones de búsqueda, extracción y empuje)

Eliminar la rama antigua del control remoto

git push origin -D <old_name>

(tu sucursal local ya se ha ido porque la "moviste" en el primer paso)


Hay muchas formas de cambiar el nombre de la sucursal, pero me centraré en el problema mayor: "cómo permitir que los clientes avancen y no tengan que meterse con sus sucursales a nivel local" .

Primero una imagen rápida:

Esto es algo realmente fácil de hacer; pero no abuses de ello. Toda la idea depende de la combinación de compromisos; ya que permiten el avance rápido, y enlazan las 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 padre-hijo:

# 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 la creación de una confirmación de merge permite el reenvío rápido de la rama a una nueva revisión.

usando 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


La respuesta seleccionada falló cuando lo probé. Se produce un error: se 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 hacer checkout en el marcador de posición justo antes de enviarlo al repositorio remoto. El resto se explica por sí mismo, ya que la eliminación de la rama maestra y su inserción en el repositorio remoto debería funcionar ahora. Extraído de here .


Lo más cercano al cambio 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. Primero, ningún checkout existente sabrá acerca del cambio de nombre: git no intenta rastrear los nombres de las sucursales. Si el nuevo master aún no existe, git pull dará error. Si el nuevo master ha sido creado. el tirón intentará fusionar master y master-old . Por lo general, es una mala idea, a menos que cuente con la colaboración de todos los que han consultado el repositorio anteriormente.

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

Esta advertencia solo se aplica a la rama actual (generalmente la rama master ); Cualquier otra rama puede ser eliminada y recreada como se muestra arriba.


Qué pasa:

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


Se puede guardar lo siguiente en el script de shell para realizar el trabajo:

Por ejemplo:

remote="origin" if [ "$#" -eq 0 ] # if there are no arguments, just quit then echo "Usage: $0 oldName newName or $0 newName" >&2 exit 1 elif [ "$#" -eq 1 ] # if only one argument is given, rename current branch then oldBranchName="$(git branch | grep /* | cut -d '' '' -f2)" #save current branch name newBranchName=$1 else oldBranchName=$1 newBranchName=$2 fi git branch -m $oldBranchName $newBranchName git push $remote :$oldBranchName #delete old branch on remote git push --set-upstream $remote $newBranchName # add new branch name on remote and track it

Tenga en cuenta que aquí el nombre remoto predeterminado "origen" está codificado, puede extender el script para que sea configurable.

Luego, esta secuencia de comandos se puede utilizar con alias de bash, alias de git o, por ejemplo, en acciones personalizadas de sourcetree.


Supongo que todavía está preguntando sobre la misma situación que en su pregunta anterior . Es decir, master-new no contendrá master-old en su historial. * Si llama a master-new "master", efectivamente habrá reescrito el historial. No importa cómo llegas a un estado en el que el maestro no es descendiente de una posición anterior del maestro, simplemente está en ese estado.

A otros usuarios que intenten tirar mientras el maestro no existe, simplemente les fallarán sus tirones (no habrá tal referencia en el control remoto), y una vez que exista nuevamente en un nuevo lugar, sus tirones deberán intentar fusionar su maestro con el nuevo maestro remoto. como si fusionara master-old y master-new en su repositorio. Dado lo que intentas hacer aquí, la fusión tendría conflictos. (Si se resolvieran y el resultado se devolviera al repositorio, estarías en un estado aún peor, ambas versiones de la historia 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 confirmaciones revertidas en el repositorio git.git. Lo importante es que una vez que publicamos la historia, es algo en lo que todos podemos confiar.

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


Usted puede hacer lo siguiente:

git -m master master-old #rename current master git checkout -b master #create a new branch master git push -f origin master #force push to master

Pero forzar el empuje es una mala idea si otras personas comparten este repositorio. La fuerza de empuje hará que su historial de revisión entre en conflicto con el nuevo.


Bien , ¡cambiar el nombre de una rama tanto localmente como en el control remoto es bastante fácil! ...

Si estás en la rama, puedes hacer fácilmente:

git branch -m <branch>

o si no, tienes que hacer:

git branch -m <your_old_branch> <your_new_branch>

Luego, empuje la eliminación al control remoto de esta manera:

git push origin <your_old_branch>

Ahora que lo has hecho, si obtienes un error en sentido ascendente mientras intentas presionar, simplemente haz:

git push --set-upstream origin <your_new_branch>

También creo la imagen a continuación para mostrar los pasos en la línea de comando real, solo sigue los pasos y estarás bien:


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

Es posible que tenga que cambiar manualmente a nombre de new-branch-name antes de eliminar el new-branch-name old-branch-name


git update-ref newref oldref git update-ref -d oldref newref