Rebase de branch1 con cambios en master de branch2

Tengo dos twigs fuera del master ; branch1 y branch2 . Tengo algunos cambios realizados en branch1 y tengo un PR activo para esto. También tengo cambios en branch2 que se han revisado y fusionado en master y la twig posteriormente eliminada.

He actualizado mi master local haciendo un git fetch -ap y un git pull que networkingujo los cambios realizados en branch2 . Ahora quiero actualizar branch1 con estos cambios para que las únicas diferencias sean las que he hecho en esa twig. git checkout branch1 seguido de git rebase master .

Sin embargo, cuando hago un git status en branch1 dice:

 On branch branch1 Your branch and 'origin/branch1' have diverged, and have 3 and 1 different commits each, respectively. (use "git pull" to merge the remote branch into yours) 

Hacer un git pull aquí abre un dialog de fusión de comentarios. Pero ahora, cuando miro mi PR en la branch1 , ahora incluye los cambios de la branch2 como nuevos cambios. ¿Qué pasó aquí y cómo puedo solucionarlo?

(Para esta respuesta, supongo que tiene branch1 desprotegido. Si no, haga la git checkout branch1 ).

Cuando haces git rebase master , estás reescribiendo los commits en branch1 , ya que ahora tienen un nuevo padre. Así es como se verá tu historia:

 X--*--Y [master] \ \ \ A'--B'--C' [branch1] <-- \ | (git rebase master) A--B--C [origin/branch1] ---- 

donde, por ejemplo, A' tiene el mismo contenido que A , pero un hash de confirmación diferente, porque su padre es Y lugar de X

Como los commits han cambiado, deberás forzar la actualización del origin . Después de terminar la rebase, debes hacer:

 git push --force-with-lease 

Sin embargo, como ya hiciste un post-rebase de git pull , tendrás que arreglarlo primero. Por ejemplo:

 git reset --hard C' 

O:

 git reset --hard HEAD^ 

Esto eliminará la confirmación de fusión de la branch1 , y puede forzar la inserción como se describió anteriormente. Primero, para asegurarse de que su sucursal se reinició correctamente, haga lo siguiente:

 git log --oneline --decorate master..HEAD 

El resultado de ese command debe mostrar todas las confirmaciones que deben estar en branch1 , y solo esas confirmaciones.

(Aparte: si haces el git status en este punto, es posible que veas un resultado como este:

 On branch branch1 Your branch is behind 'origin/branch1' by 2 commits, and can be fast-forwarded. (use "git pull" to update your local branch) 

Puede ignorar esta advertencia de forma segura, ya que una de esas confirmaciones fue la de fusión, y la otra fue la 1 different commit de su post de error original).

Como se mencionó anteriormente, en este punto debe hacer:

 git push --force-with-lease 

Y ahora la branch1 remota tendrá los mismos commits que su branch1 local.


Advertencia obligatoria: como una rebase reescribe la historia, esto puede ser peligroso / perturbador para cualquier otra persona que trabaje en esta twig. Asegúrese de comunicar claramente lo que ha hecho con cualquier persona con la que queuebora.