Cambiar base de sucursal

Resuelto Ivan asked hace 12 años • 6 respuestas

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 masterizar

(commit 1) - master
                |-- (commit 2) - (commit 3) - demo
                \-- (commit 4) - (commit 5) - PRO

Probé 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 algunas confirmaciones). Luego, por error, creo otra rama desde la demostración ( git checkout -b PROy algunas confirmaciones) y ahora necesito mover la rama PRO a la maestra y dejar la demostración intacta. Al final, tanto la demo como la PRO se colgarán del master.

Ivan avatar Jun 01 '12 23:06 Ivan
Aceptado

Suponiendo newBaseque la rama a la que desea mover sus confirmaciones oldBasees la base anterior de su rama, puede usar --ontopara eso:

git rebase --onto newBase oldBase feature/branch

Dado su caso:

git checkout PRO # Just to be clear which branch to be on.
git rebase --onto master demo PRO

Básicamente, tomas todas las confirmaciones desde después demohasta inclusive PRO, y las reorganizas en la masterconfirmación.

loganfsmyth avatar Jun 01 '2012 16:06 loganfsmyth

Intentaré ser lo más genérico posible. Primero, asegúrese de estar en la sucursal deseada:

git checkout current-branch

Luego use el siguiente comando (¿dónde new-base-branchestá la rama que desea que sea su nueva base y current-base-branches la rama que es su base actual?)

git rebase --onto new-base-branch current-base-branch

Si no tiene conflictos, entonces genial, ya está. Si es así (en la mayoría de los casos), siga leyendo.

Pueden surgir conflictos y tendrás que resolverlos manualmente. Git ahora intenta realizar una "fusión tripartita" entre tu archivo current-branch. Más o menos así es como funcionará git internamente:current-base-branchnew-base-branch

  1. Git primero cambiará la current-base-branchbase del archivo new-base-branch. Puede haber conflictos; que tendrás que resolver manualmente. Una vez hecho esto, normalmente haces git add .y git rebase --continue. Creará una nueva confirmación temporal temp-commit-hashpara esto.

  2. Después de esto, Git ahora cambiará su base current-branchsobre temp-commit-hash. Puede haber más conflictos y nuevamente tendrás que resolverlos manualmente. Una vez hecho esto, continúa nuevamente con git add .y git rebase --continue, después de lo cual habrá rebasado exitosamente su archivo current-branchen la parte superior new-base-branch.


Nota: Si comienza a cometer errores, puede hacerlo git rebase --aborten cualquier momento durante el proceso de rebase y volver al punto de partida.

ARK avatar Mar 08 '2018 20:03 ARK

Pague en PROla 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:

$ git checkout PRO
$ git log            # see the commit history
# copy the oldest & latest commit-hash 

Elimina la PROrama (mantén una copia de seguridad solo por seguridad). Crear y pagar en una nueva PROsucursal desde master:

$ git branch PRO.bac    # create a new branch PRO.bac = PRO as backup

$ git checkout master
$ git branch -D PRO     # delete the local PRO branch
$ git checkout -b PRO   # create and checkout to a new 'PRO' branch from 'master'

Tome ( seleccione ) el rango de confirmaciones de PROla rama anterior en la nueva PROrama:

$ git cherry-pick commit4^..commit5   # cherry-pick range of commits
# note the '^' after commit4

Ahora, si todo está bien, fuerce (-f) empujar a remote PROla rama y elimine PRO.bacla rama local:

$ git log                  # check the commit history

$ git push -f origin HEAD  # replace the remote PRO by local PRO branch history
# git branch -D PRO.bac    # delete local PRO.bac branch
Sajib Khan avatar Sep 28 '2017 04:09 Sajib Khan