Tengo la rama master
que rastrea la rama remota origin/master
.
Quiero cambiarles el nombre a master-old
ambos localmente y en el control remoto. es posible?
Para otros usuarios que rastrearon origin/master
(y que siempre actualizaron su master
sucursal local a través de git pull
), ¿qué sucedería después de cambiar el nombre de la sucursal remota?
¿Seguiría git pull
funcionando o arrojaría un error que ya no podría encontrar origin/master
?
Luego, más adelante, quiero crear una nueva master
rama (tanto local como remota). Nuevamente, después de hacer esto, ¿qué pasaría ahora si los otros usuarios lo hacen git pull
?
Supongo que todo esto provocaría muchos problemas. ¿Hay una manera limpia de obtener lo que quiero? ¿O debería simplemente dejarlo master
como está y crear una nueva sucursal master-new
y seguir trabajando allí más adelante?
fuente
git push -f
afecta la capacidadpull
de cualquier rama de seguimiento remoto.master-old
que apunte a la misma confirmación que lamaster
rama anterior . Luego puede sobrescribir lamaster
rama con sus nuevos cambios haciendo unmerge
con laours
estrategia. Hacer una fusión funciona cuando el control remoto no permite cambios no rápidos. Eso también significa que otros usuarios no tendrán actualizaciones forzadas.master
solo es especial siempre que sea la única rama existente. Tan pronto como tenga más de una, todas las ramas estarán en pie de igualdad.Respuestas:
Lo más parecido al cambio de nombre es eliminar y volver a crear en el control remoto. Por ejemplo:
Sin embargo, esto tiene muchas advertencias. Primero, ningún pago existente sabrá sobre el cambio de nombre: git no intenta rastrear los cambios de nombre de las sucursales. Si lo nuevo
master
aún no existe, git pull generará un error. Si lo nuevomaster
ha sido creado. el tirón intentará fusionarsemaster
ymaster-old
. Por lo tanto, generalmente es una mala idea a menos que cuente con la cooperación de todos los que han revisado el repositorio anteriormente.Nota: Las versiones más recientes de git no le permitirán eliminar la rama maestra de forma remota de forma predeterminada. Puede anular esto estableciendo el
receive.denyDeleteCurrent
valor de configuración enwarn
oignore
en el repositorio remoto . De lo contrario, si está listo para crear un nuevo maestro de inmediato, omita elgit push remote :master
paso y pase--force
algit push remote master
paso. 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
master
rama); cualquier otra rama se puede eliminar y volver a crear como se indicó anteriormente.fuente
new-branch-name
y enold-branch-name
lugar demaster
/master-old
, por lo tanto, este es un problema general.Asumiendo que estás actualmente en
master
:master-old
bifurcación en elorigin
repositorio, basada en lamaster
confirmación en el repositorio local.origin/master-old
sucursal (que se configurará automáticamente como una sucursal de seguimiento).master
a cualquier compromiso que desee que señale.master
en elorigin
repositorio para reflejar su nuevo localmaster
.(Si lo hace de otra manera, necesita al menos un paso más para asegurarse de que
master-old
está configurado correctamente para realizar un seguimientoorigin/master-old
. Ninguna de las otras soluciones publicadas en el momento de escribir este artículo incluye eso).fuente
master
una sucursal o en otra. Sin embargo, la pregunta estaba mal titulada, se trata de una tarea más compleja que simplemente cambiar el nombre de una rama.master
entonces podrían hacergit fetch && git reset --hard origin/master
que su localmaster
sea el mismo que el que está encendidoorigin
. He documentado esto, así como el caso más complejo en el que tiene compromisos locales además de losmaster
que desea mantener, en stackoverflow.com/q/4084868Con Git v1.7, creo que esto ha cambiado ligeramente. Actualizar la referencia de seguimiento de su sucursal local al nuevo control remoto ahora es muy fácil.
fuente
--set-upstream
es el siguiente: Una vez que tenga su sucursal renombrada a nivel local y eliminado en el origen, sólo tiene que hacer:git push -u --all
new_branch
y finalmente eliminar el control remotomaster
con la 2da línea.git push origin --delete old_branch
es un poco más legible.Es posible que deba cambiar manualmente a
new-branch-name
antes de eliminarold-branch-name
fuente
git branch -d old-branch-name
para eliminar la rama antigua local.git push remote-name new-branch-name :old-branch-name
.Hay muchas formas de cambiar el nombre de la sucursal, 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 foto rápida:
Esto es algo realmente fácil de hacer; Pero no abuses de ello. Toda la idea depende de los compromisos de fusión; ya que permiten el avance rápido y vinculan las historias de una rama con otra.
renombrar la sucursal:
creando la nueva rama "maestra":
crear un compromiso de fusión para tener un historial padre-hijo:
y voilá.
Esto funciona porque crear una
merge
confirmación permite reenviar rápidamente la rama a una nueva revisión.utilizando un mensaje de confirmación de fusión sensible:
fuente
git merge -s ours master-old
es la pieza crucial que las otras respuestas pierden. Además, "fácil de hacer" no significa "fácil de entender o descubrir", lo que parece ser el caso con gran parte de git, pero estoy divagando.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 master-new "master", efectivamente habrá reescrito el historial. No importa cómo llegue a un estado en el que el maestro no sea un descendiente de una posición anterior del maestro, simplemente que está en ese estado.
A otros usuarios que intenten extraer mientras el maestro no existe simplemente les fallarán sus tirones (no existe tal referencia en el control remoto), y una vez que exista nuevamente en un nuevo lugar, sus tirones tendrán que intentar fusionar su maestro con el nuevo maestro remoto, tal como si combinaras master-old y master-new en tu repositorio. Dado lo que está tratando de hacer aquí, la fusión tendría conflictos. (Si se resolvieran y el resultado se volviera a colocar en el repositorio, estaría 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 el historial, es algo en lo que todos pueden confiar.
* Si lo hiciera, esto sería equivalente a empujar algunos cambios al maestro y luego crear una nueva rama donde solía estar. No hay problema.
fuente
La respuesta seleccionada falló cuando lo intenté. Se genera un error:
refusing to delete the current branch: refs/heads/master
. Creo que publicaré lo que funciona para mí:El truco es pagar al marcador de posición justo antes de empujarlo al repositorio remoto. El resto se explica por sí mismo, eliminar la rama maestra y empujarla al repositorio remoto debería funcionar ahora. Extraído de aquí .
fuente
Bueno. Mis 2 centavos ¿Qué hay de iniciar sesión en el servidor, ir al directorio git y cambiar el nombre de la sucursal en el repositorio vacío? Esto no tiene todos los problemas asociados con la recarga de 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 sucursal.
fuente
Qué pasa:
fuente
Esta es la forma más simple y 'legible' que conozco:
'Mover' sucursal local usando -m
Empuje la rama 'movida' al control remoto, establezca 'corriente arriba' usando -u
(la configuración 'ascendente' esencialmente 'conecta' su rama local al control remoto, de modo que cosas como buscar, tirar y empujar funcionarán)
Eliminar la rama vieja del control remoto
(su sucursal local ya no está, porque la 'movió' en el primer paso)
fuente
OK , cambiar el nombre de una sucursal localmente y en el control remoto es bastante fácil ...
Si está en la sucursal, puede hacer fácilmente:
git branch -m <branch>
o si no, debes 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 ha terminado, si obtiene un error ascendente mientras intenta presionar, simplemente haga lo siguiente:
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 siga los pasos y sería bueno:
fuente
Puede hacer lo siguiente:
Pero forzar el empuje es una mala idea si otras personas comparten este repositorio. El empuje forzado hará que su historial de revisiones entre en conflicto con el nuevo.
fuente
Lo siguiente se puede guardar en el script de shell para hacer el trabajo:
Por ejemplo:
Tenga en cuenta que aquí el nombre remoto predeterminado "origen" está codificado, puede extender el script para que sea configurable.
Entonces este script se puede usar con alias bash, alias git o en, por ejemplo, acciones personalizadas de código fuente.
fuente
Creo que la clave es darse cuenta de que está realizando un doble cambio de nombre:
master
tomaster-old
ymaster-new
to tomaster
.De todas las otras respuestas, he sintetizado esto:
donde primero tenemos que definir la
doublerename
función Bash:Esto es similar a un cambio de historial
git rebase
en que el contenido de la rama es bastante diferente, pero difiere en que los clientes aún pueden avanzar de forma seguragit pull master
.fuente
fuente