Git Rebase: nostro e loro, locale e remoto


Esempio

Un rebase cambia il significato di "nostro" e "loro":

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

Qualunque cosa HEAD indichi è "nostra"

La prima cosa che fa rebase è il reset del HEAD da master ; prima che il cherry-picking commetta dal vecchio topic ramo a uno nuovo (ogni commit nel ramo topic precedente verrà riscritto e verrà identificato da un diverso hash).

Per quanto riguarda le terminologie utilizzate dagli strumenti di unione (da non confondere con riferimento locale o riferimento remoto )

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

Ciò significa che uno strumento di fusione / diff presenterà il ramo upstream come local ( master : il ramo su cui si sta ridefinendo), e il ramo di lavoro come remote ( topic : il ramo che viene ridefinito)

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

Inversione illustrata

In una fusione:

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

Non cambiamo l' topic corrente, quindi quello che abbiamo è ancora quello su cui stavamo lavorando (e ci uniamo da un altro ramo)

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

Su un rebase:

Ma su un rebase cambiamo i lati perché la prima cosa che fa un rebase è il checkout del ramo upstream per replicare il commit corrente su di esso!

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

Un git rebase upstream imposta innanzitutto HEAD al ramo upstream, da qui il passaggio di "nostro" e "loro" rispetto al precedente ramo di lavoro "attuale".

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      

Il rebase poi ripetere 'loro' si impegna sul nuovo 'nostro' topic filiale:

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