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 masterrama PRO, pero no pasa nada.
Para aclarar : estaba trabajando en master y luego tuve que hacer una demostración del producto ( git checkout -b demoy algunos commits). Luego, por error, creo otra rama de la demostración ( git checkout -b PROy 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
--ontopara eso:Dado su caso:
Básicamente, tomas todos los commits desde después
demohastaPRO, y los vuelves a basar en elmastercommit.fuente
git rebase --onto first-branch second-branch second-branchpero 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/branchorigin/newBasees el nombre de una rama, comonewBaseen 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).newBasees el nombre de una rama local yorigin/newBasees 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-branchestá la rama que desea que sea su nueva base ycurrent-base-branches 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-branchynew-base-branch. Aproximadamente así es como git funcionará internamente:Git primero rebase la
current-base-branchparte 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-hashpara esto.Después de esto, Git ahora rebase su
current-branchsuperior 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-branchen la parte superiornew-base-branch.Nota: Si comienza a equivocarse, puede hacerlo en
git rebase --abortcualquier momento durante el proceso de rebase y volver al punto de partida.fuente
rebasecomando 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
PROrama, 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
PROrama (guarde una copia de seguridad solo por seguridad). Crear y pagar a una nuevaPROsucursal desdemaster:Tome (selección de cereza ) el rango de confirmaciones de la
PROrama anterior en la nuevaPROrama:Ahora, si todo está bien, entonces forzar (-f) a la
remote PRObifurcación y eliminar laPRO.bacbifurcació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