TL; DR;
Para resumir (como comenta Benubird ), cuando:
git checkout A
git rebase B # rebase A on top of B
local
es B
(rebase en ),
remote
es A
Y:
git checkout A
git merge B # merge B into A
local
es A
(fusionarse con ),
remote
es B
Un cambio de base cambia ours
(rama actual antes de que comience el rebase) y theirs
(la rama sobre la que desea rebase).
kutschkem señala que, en un contexto mergetool GUI :
- referencias locales las confirmaciones parcialmente modificadas : "
ours
" (la rama ascendente)
- control remoto se refiere a los cambios entrantes : "
theirs
" - la rama actual antes del rebase.
Vea las ilustraciones en la última parte de esta respuesta.
Inversión cuando rebase
La confusión puede estar relacionada con la inversión de ours
y theirs
durante un rebase .
(extractos relevantes)
git rebase
página man :
Tenga en cuenta que una combinación de rebase funciona al reproducir cada confirmación de la rama de trabajo en la parte superior de la <upstream>
rama.
Debido a esto, cuando ocurre un conflicto de fusión:
- el lado reportado como '
ours
' es la serie rebase hasta ahora, comenzando con <upstream>
,
- y '
theirs
' es la rama de trabajo. En otras palabras, los lados se intercambian.
Inversión ilustrada
En una fusión
x--x--x--x--x(*) <- current branch B ('*'=HEAD)
\
\
\--y--y--y <- other branch to merge
, no cambiamos la rama actual 'B', así que lo que tenemos sigue siendo en lo que estábamos trabajando (y nos fusionamos desde otra rama)
x--x--x--x--x---------o(*) MERGE, still on branch B
\ ^ /
\ ours /
\ /
--y--y--y--/
^
their
En un rebase:
Pero en un rebase , cambiamos de lado porque lo primero que hace un rebase es verificar la rama aguas arriba. (para reproducir las confirmaciones actuales encima)
x--x--x--x--x(*) <- current branch B
\
\
\--y--y--y <- upstream branch
A git rebase upstream
primero cambiará HEAD
de B a la rama aguas arriba HEAD
(de ahí el cambio de 'la nuestra' y 'la de ellos' en comparación con la rama de trabajo "actual" anterior).
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
, y luego el rebase reproducirá 'sus' confirmaciones en la nueva rama 'nuestra' 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 noción "ascendente" es el conjunto referencial de datos (un repositorio completo o, como aquí, una rama, que puede ser una rama local ) desde el que se leen los datos o se añaden / crean nuevos datos.
' local
' y ' remote
' vs. ' mine
' y ' theirs
'
Pandawood agrega en los comentarios :
Para mí, la pregunta sigue siendo, que es "local" y quién es "remoto" (ya que los términos "nuestro" y "suyo" no se usan cuando se rebase en git, referirse a ellos simplemente parece hacer una respuesta más confusa) .
GUI git mergetool
kutschkem agrega, y con razón:
Al resolver conflictos, git dirá algo como:
local: modified file and remote: modified file.
Estoy bastante seguro de que la pregunta apunta a la definición de local y remoto en este punto. En ese punto, me parece por experiencia que:
- referencias locales las confirmaciones parcialmente modificadas : "
ours
" (la rama ascendente)
- control remoto se refiere a los cambios entrantes : "
theirs
" - la rama actual antes del rebase.
git mergetool
de hecho menciona 'local' y 'remoto' :
Merging:
f.txt
Normal merge conflict for 'f.txt':
{local}: modified file
{remote}: modified file
Hit return to start merge resolution tool (kdiff3):
Por ejemplo, KDiff3 sería mostrar la resolución de combinación como tal :
Y meld también lo mostraría :
Lo mismo para VimDiff , que muestra :
Invoque a Vimdiff como mergetool con git mergetool -t gvimdiff. Las versiones recientes de Git invocan a Vimdiff con el siguiente diseño de ventana:
+--------------------------------+
| LOCAL | BASE | REMOTE |
+--------------------------------+
| MERGED |
+--------------------------------+
LOCAL
:
Un archivo temporal que contiene el contenido del archivo en la rama actual.
BASE
:
Un archivo temporal que contiene la base común para la fusión.
REMOTE
:
Un archivo temporal que contiene el contenido del archivo que se fusionará.
MERGED
:
El archivo que contiene los marcadores de conflicto.
Git ha realizado la mayor resolución de conflictos automática posible y el estado de este archivo es una combinación de ambos LOCAL
y REMOTE
con marcadores de conflicto que rodean todo lo que Git no pudo resolver por sí mismo.
El mergetool
debe escribir el resultado de la resolución a este archivo.