Cambiar base de sucursal
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 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 algunas confirmaciones). Luego, por error, creo otra rama desde la demostración ( git checkout -b PRO
y 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.
Suponiendo newBase
que la rama a la que desea mover sus confirmaciones oldBase
es la base anterior de su rama, puede usar --onto
para 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 demo
hasta inclusive PRO
, y las reorganizas en la master
confirmación.
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-branch
está la rama que desea que sea su nueva base y current-base-branch
es 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-branch
new-base-branch
Git primero cambiará la
current-base-branch
base del archivonew-base-branch
. Puede haber conflictos; que tendrás que resolver manualmente. Una vez hecho esto, normalmente hacesgit add .
ygit rebase --continue
. Creará una nueva confirmación temporaltemp-commit-hash
para esto.Después de esto, Git ahora cambiará su base
current-branch
sobretemp-commit-hash
. Puede haber más conflictos y nuevamente tendrás que resolverlos manualmente. Una vez hecho esto, continúa nuevamente congit add .
ygit rebase --continue
, después de lo cual habrá rebasado exitosamente su archivocurrent-branch
en la parte superiornew-base-branch
.
Nota: Si comienza a cometer errores, puede hacerlo git rebase --abort
en cualquier momento durante el proceso de rebase y volver al punto de partida.
Pague en PRO
la 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 PRO
rama (mantén una copia de seguridad solo por seguridad). Crear y pagar en una nueva PRO
sucursal 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 PRO
la rama anterior en la nueva PRO
rama:
$ git cherry-pick commit4^..commit5 # cherry-pick range of commits
# note the '^' after commit4
Ahora, si todo está bien, fuerce (-f) empujar a remote PRO
la rama y elimine PRO.bac
la 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