remota - git push
Git rebase una rama encima de otra rama (4)
Quiero reajustar mis cambios (desde la
branch2
) en la parte superior de labranch1
.
git checkout branch2 # Go to your local branch. Use -f to force the checkout.
git reset HEAD --hard # Drop all non-committed changes.
git rebase branch1 # Rebase on top of branch1. Use -i for an interactive list.
Nota: Si una rama está en el remoto, como origin
, prefija el nombre de la rama con origin/
.
Solución de problemas
Si te quedas atascado en medio de
rebase
y quieres comenzar de nuevo, ejecuta:rm -fr .git/rebase-merge # Abort a rebase-merge mode. git reset HEAD --hard # Reset everything to the current HEAD.
Si estás en la rama separada (ejecuta:
git branch
y busca el símbolo de la estrella), ejecuta:git checkout branch2 -f # and start again.
Si tiene conflictos, necesita corregirlos , use un punto de rebasado diferente.
Si desea hacer el reajuste manual paso a paso, use cherry-picking. P.ej
git reflog # Note hashes of for your commits. git checkout master # Go to your base branch. git cherry-pick C0MM1T1 # Cherry pick first commit based on its hash. # Go to the next one or solve the conflicts. git cherry-pick C0MM1T2 # Cherry pick another commit and so on.
Si su rebase muestra demasiados compromisos en la lista interactiva después de ejecutar
git rebase branch1 -i
, puede iniciar su rebase dado el compromiso específico justo antes de sus cambios, por ejemplo,git rebase pr3v1ios
.
En mi repositorio de git, tengo una rama Master
. Uno de los desarrolladores remotos creó una rama Branch1
y tenía un montón de confirmaciones en ella. Me Branch1
partir de Branch1
, creando una nueva rama llamada Branch2
( git checkout -b Branch2 Branch1
) de tal manera que la cabeza de Branch2
estaba en el último commit agregado a Branch1
: (se parece a esto)
Master---
/
Branch1--commit1--commit2
/
Branch2 (my local branch)
Branch1
ha tenido una serie de cambios. El otro dev aplastó sus compromisos y luego agregó algunos más. Mientras tanto, he tenido un montón de cambios en mi sucursal, pero aún no he cometido nada. La estructura actual se ve así:
Master---
/
Branch1--squashed commit1,2--commit3--commit4
/
Branch2 (my local branch)
Ahora quiero tener que volver a introducir mis cambios en la parte superior de Branch1
. Estoy sumamente confundido sobre cómo hacer esto. Sé que el primer paso será confirmar mis cambios usando git add .
y git commit -m "message"
. ¿Pero entonces empujar? usando el git push origin Branch2
? o git push origin Branch2 Branch1
? La ayuda es muy necesaria y GRATUITAMENTE apreciada, también si puedo crear una copia de seguridad de mi sucursal, será genial en caso de que estropee algo
En primer lugar, debe asegurarse de que su referencia a Branch1 esté actualizada (especialmente porque su historial ha sido modificado).
Si te gusta trabajar con copys locales, puedes hacer algo como esto:
git push origin Branch2 # this ensures you have at least one copy in your remote
git fetch origin
git checkout Branch1
git reset --hard origin/Branch1
git checkout Branch2
git rebase Branch1 # solve conflicts ... and check that everything is ok
git push -f origin Branch2
Primero copia de seguridad de su actual Branch2
:
# from Branch2
git checkout -b Branch2_backup
Luego rebase Branch2
en Branch1
:
# from Branch2
git fetch origin # update all tracking branches, including Branch1
git rebase origin/Branch1 # rebase on latest Branch1
Después de la rebase, la estructura de tu rama debería verse así:
master --
/
1 -- 2 -- 3 -- 4 -- Branch2''
En el diagrama anterior, el apóstrofe en Branch2
indica que cada confirmación en Branch2
después de la confirmación 4 es en realidad una reescritura.
Tenga en cuenta que ahora ha reescrito el historial de Branch2
y, si la sucursal ya está publicada, tendrá que forzar su inserción en el control remoto a través de
git push --force origin Branch2
La fuerza de empuje puede causar problemas a cualquier otra persona que use Branch2
por lo que debe tener cuidado al hacer esto.
git rebase branch1 branch2
reajustará los cambios exclusivamente en branch2
en branch1
.
La operación puede producir algunos conflictos que luego tendrás que resolver manualmente. Edite los archivos afectados, fusionando contenido y eliminando cualquier archivo defectuoso. Luego, marque los archivos como fusionados usando git add <file>
y luego continúe la rebase usando git rebase --continue
. Repita hasta que esté hecho.
Una vez hecho esto, no tienes nada más que hacer. No tienes que empujar. Sin embargo, si desea reflejar sus nuevos cambios en algún otro repositorio (por ejemplo, compartirlo con otros o tener esos cambios en otro repositorio suyo), haga un git push
final.