Tengo un árbol como este:
(commit 1) - master
\-- (commit 2) - (commit 3) - demo
\-- (commit 4) - (commit 5) - PRO
y tengo que mover la rama PRO para dominar
(commit 1) - master
|-- (commit 2) - (commit 3) - demo
\-- (commit 4) - (commit 5) - PRO
He intentado con una git rebase master
rama PRO, pero no pasa nada.
Para aclarar : estaba trabajando en master y luego tuve que hacer una demostración del producto ( git checkout -b demo
y algunos commits). Luego, por error, creo otra rama de la demostración ( git checkout -b PRO
y algunos commits) y ahora necesito mover la rama PRO a master y dejar la demo intacta. Al final, tanto la demo como PRO se colgarán del maestro.
Respuestas:
Uso
--onto
para eso:Dado su caso:
Básicamente, tomas todos los commits desde después
demo
hastaPRO
, y los vuelves a basar en elmaster
commit.fuente
git rebase --onto first-branch second-branch second-branch
pero no obtengo la sintaxisgit rebase --onto first-branch master second-branch
--onto
, y la forma en que me escribió ayudógit rebase --onto newBase oldBase feature/branch
origin/newBase
es el nombre de una rama, comonewBase
en mi ejemplo. Solo dependería si está haciendo un rebase en una rama que existe en su repositorio local (newBase
), o en una que existe en el remoto (origin/newBase
).newBase
es el nombre de una rama local yorigin/newBase
es el nombre de una rama remota. El que desea depende de lo que está haciendo rebase. No es que uno funcione y el otro no, es que se basan en cosas diferentes. La pregunta original nunca menciona los controles remotos, por lo que el uso de controles remotos en mi ejemplo no coincidiría con la pregunta que se hizo.Intentaré ser lo más genérico posible. Primero, asegúrese de estar en la rama deseada:
Luego use el siguiente comando (¿dónde
new-base-branch
está la rama que desea que sea su nueva base ycurrent-base-branch
es la rama que es su base actual?)Si no tiene conflictos, entonces genial, ya está. Si lo hace (en la mayoría de los casos), siga leyendo.
Pueden surgir conflictos y deberá resolverlos manualmente. Git ahora trata de hacer una "fusión de 3 vías" entre su
current-branch
,current-base-branch
ynew-base-branch
. Aproximadamente así es como git funcionará internamente:Git primero rebase la
current-base-branch
parte superior de lanew-base-branch
. Puede haber conflictos; que deberás resolver manualmente. Una vez hecho esto, generalmente lo hacesgit add .
ygit rebase --continue
. Creará una nueva confirmación temporaltemp-commit-hash
para esto.Después de esto, Git ahora rebase su
current-branch
superior sobre detemp-commit-hash
. Puede haber más conflictos y nuevamente tendrá que resolverlos manualmente. Una vez hecho esto, continúe nuevamente congit add .
ygit rebase --continue
, después de lo cual ha reubicado con éxito sucurrent-branch
en la parte superiornew-base-branch
.Nota: Si comienza a equivocarse, puede hacerlo en
git rebase --abort
cualquier momento durante el proceso de rebase y volver al punto de partida.fuente
rebase
comando publicado solo me da "fatal: no válido ascendente 'current-base-branch'". Además, ¿por qué es necesario decirle a GIT cuál es la rama principal actual de la rama actual? ¿No debería saber esto ya?Pague en la
PRO
rama, copie los hashes de confirmación más antiguos ( commit4 ) y más recientes ( commit5 ) de esta rama y péguelos en otro lugar:Elimine la
PRO
rama (guarde una copia de seguridad solo por seguridad). Crear y pagar a una nuevaPRO
sucursal desdemaster
:Tome (selección de cereza ) el rango de confirmaciones de la
PRO
rama anterior en la nuevaPRO
rama:Ahora, si todo está bien, entonces forzar (-f) a la
remote PRO
bifurcación y eliminar laPRO.bac
bifurcación local :fuente
Tuve un enfoque ligeramente diferente usando reset y stashes que evita eliminar y volver a crear ramas, así como eliminar la necesidad de cambiar de rama:
Al restablecer la rama en una base de confirmación por confirmación, básicamente solo rebobina el historial de las ramas una confirmación a la vez.
fuente