Git Rebase: nuestro y el de ellos, local y remoto.


Ejemplo

Una rebase cambia el significado de "nuestro" y "suyo":

git checkout topic
git rebase   master    # rebase topic branch on top of master branch

Lo que apunta HEAD es "nuestro"

Lo primero que hace una rebase es reiniciar la HEAD para master ; antes de realizar un picking desde el topic rama anterior a uno nuevo (todos los mensajes de la rama del topic anterior se volverán a escribir y se identificarán con un hash diferente).

Con respecto a las terminologías utilizadas por las herramientas de combinación (no debe confundirse con la referencia local o la referencia remota )

=> local is master ("ours"),
=> remote is topic ("theirs")

Eso significa que una herramienta de combinación / diferenciación presentará la rama en sentido ascendente como local ( master : la rama en la parte superior de la cual se está rebasando), y la rama en funcionamiento como remote ( topic : la rama que se está rebasando)

+-----------------------------------------+
| LOCAL:master |    BASE   | REMOTE:topic |
+-----------------------------------------+
|             MERGED                      |
+-----------------------------------------+

Inversión ilustrada

En una fusión:

c--c--x--x--x(*) <- current branch topic ('*'=HEAD)
    \
     \
      \--y--y--y <- other branch to merge

No cambiamos el topic sucursal actual, por lo que todavía tenemos en qué estábamos trabajando (y nos fusionamos de otra sucursal)

c--c--x--x--x---------o(*)  MERGE, still on branch topic
    \       ^        /
     \     ours     /
      \            /
       --y--y--y--/  
               ^
              theirs

En una rebase:

¡Pero en una rebase cambiamos de lado porque lo primero que hace una rebase es retirar la rama ascendente para reproducir las confirmaciones actuales sobre ella!

c--c--x--x--x(*) <- current branch topic ('*'=HEAD)
    \
     \
      \--y--y--y <- upstream branch

Una git rebase upstream primero establecerá HEAD en la rama en sentido ascendente, de ahí el cambio de 'nuestro' y 'de ellos' en comparación con la rama de trabajo "actual" anterior.

c--c--x--x--x <- former "current" branch, new "theirs"
    \
     \
      \--y--y--y(*) <- set HEAD to this commit, to replay x's on it
               ^       this will be the new "ours"
               |
            upstream      

El rebase luego reproducirá "sus" confirmaciones en la nueva rama del topic "nuestro":

c--c..x..x..x <- old "theirs" commits, now "ghosts", available through "reflogs"
    \
     \
      \--y--y--y--x'--x'--x'(*) <- topic  once all x's are replayed,
               ^                      point branch topic to this commit
               |
        upstream branch