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
- Primero haga una rama
master-old
en el repositorio deorigin
, con base en la confirmaciónmaster
en el repositorio local. - Cree una nueva rama local para esta nueva rama de
origin/master-old
(que se configurará automáticamente como una rama de seguimiento). - Ahora apunte a su
master
local a cualquier compromiso al que desee que apunte. - Finalmente, forzar el cambio de
master
en el repositorio deorigin
para reflejar su nuevomaster
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" .
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