TL; DR;
Riassumendo (come commenta Benubird ), quando:
git checkout A
git rebase B # rebase A on top of B
localè B(rinnova su ),
remote è A
E:
git checkout A
git merge B # merge B into A
localè A(unisci in ),
remote è B
Un rebase cambia ours(il ramo corrente prima dell'inizio del rebase) e theirs(il ramo sopra il quale si desidera ridisegnare).
kutschkem sottolinea che, in un contesto di fusione GUI :
- riferimenti locali commessi dal parzialmente reimpostato : "
ours" (il ramo a monte)
- remote si riferisce alle modifiche in arrivo : "
theirs" - il ramo corrente prima del rebase.
Vedi le illustrazioni nell'ultima parte di questa risposta.
Inversione quando rebase
La confusione potrebbe essere correlata all'inversione di ourse theirsdurante un rebase .
(estratti pertinenti)
git rebasepagina man :
Si noti che un'unione rebase funziona riproducendo ciascun commit dal ramo di lavoro in cima al <upstream>ramo.
Per questo motivo, quando si verifica un conflitto di unione:
- il lato segnalato come "
ours" è la serie finora riformata, a partire da <upstream>,
- e '
theirs' è il ramo di lavoro. In altre parole, i lati vengono scambiati.
Inversione illustrata
In unione
x--x--x--x--x(*) <- current branch B ('*'=HEAD)
\
\
\--y--y--y <- other branch to merge
, non cambiamo l'attuale ramo "B", quindi quello che abbiamo è ciò su cui stavamo lavorando (e ci uniamo da un altro ramo)
x--x--x--x--x---------o(*) MERGE, still on branch B
\ ^ /
\ ours /
\ /
--y--y--y--/
^
their
Su un rebase:
Ma su un rebase , cambiamo lato perché la prima cosa che fa un rebase è controllare il ramo a monte! (per ripetere gli attuali commit sopra di esso)
x--x--x--x--x(*) <- current branch B
\
\
\--y--y--y <- upstream branch
A git rebase upstreamprima cambierà HEADB nel ramo a monte HEAD(da qui il passaggio tra 'nostro' e 'loro' rispetto al precedente ramo di lavoro "attuale".)
x--x--x--x--x <- former "current" branch, new "theirs"
\
\
\--y--y--y(*) <- upstream branch with B reset on it,
new "ours", to replay x's on it
, e quindi il rebase ripeterà 'loro' si impegna sul nuovo 'nostro' ramo B:
x--x..x..x..x <- old "theirs" commits, now "ghosts", available through reflogs
\
\
\--y--y--y--x'--x'--x'(*) <- branch B with HEAD updated ("ours")
^
|
upstream branch
Nota: la nozione "upstream" è l'insieme di dati di riferimento (un repository completo o, come qui, un ramo, che può essere un ramo locale ) da cui vengono letti i dati o ai quali vengono aggiunti / creati nuovi dati.
' local' e ' remote' vs. ' mine' e ' theirs'
Pandawood aggiunge nei commenti :
Per me, la domanda rimane ancora, che è "locale" e chi è "remoto" (dal momento che i termini "nostro" e "loro" non vengono utilizzati quando si ribatte in git, fare riferimento a loro sembra solo rendere una risposta più confusa) .
GUI git mergetool
kutschkem aggiunge, e giustamente:
Quando si risolvono i conflitti, git dirà qualcosa del tipo:
local: modified file and remote: modified file.
Sono abbastanza sicuro che la domanda miri alla definizione di locale e remoto a questo punto. A quel punto, dalla mia esperienza, mi sembra che:
- riferimenti locali commessi dal parzialmente reimpostato : "
ours" (il ramo a monte)
- remote si riferisce alle modifiche in arrivo : "
theirs" - il ramo corrente prima del rebase.
git mergetoolparla infatti di "locale" e "remoto" :
Merging:
f.txt
Normal merge conflict for 'f.txt':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (kdiff3):
Per esempio, KDiff3 sarebbe visualizzare la risoluzione si fondono in questo modo :

E la fusione lo mostrerebbe anche :

Lo stesso per VimDiff , che visualizza :
Invoca Vimdiff come un mergetool con git mergetool -t gvimdiff. Le versioni recenti di Git invocano Vimdiff con il seguente layout di finestra:
+--------------------------------+
| LOCAL | BASE | REMOTE |
+--------------------------------+
| MERGED |
+--------------------------------+
LOCAL:
Un file temporaneo contenente il contenuto del file sul ramo corrente.
BASE:
Un file temporaneo contenente la base comune per l'unione.
REMOTE:
Un file temporaneo contenente il contenuto del file da unire.
MERGED:
Il file contenente gli indicatori di conflitto.
Git ha eseguito la massima risoluzione automatica dei conflitti e lo stato di questo file è una combinazione di entrambi LOCALe REMOTEcon indicatori di conflitto che circondano tutto ciò che Git non è riuscito a risolvere da solo.
L' mergetooldovrebbe scrivere il risultato della risoluzione a questo file.