Cuando hago un cambio de git, a menudo tengo dificultades para resolver lo que está sucediendo con lo 'local' y 'remoto' al resolver conflictos. A veces tengo la impresión de que intercambian lados de un compromiso a otro.
Esto es probablemente (definitivamente) porque todavía no lo he entendido correctamente.
Al rebasear, ¿quién es 'local' y quién es 'remoto'?
(Uso P4Merge para resolver conflictos)
git svn
', solo para la parte 'git rebase
')Respuestas:
TL; DR;
Para resumir (como comenta Benubird ), cuando:
local
esB
(rebase en ),remote
esA
Y:
local
esA
(fusionarse con ),remote
esB
Un cambio de base cambia
ours
(rama actual antes de que comience el rebase) ytheirs
(la rama sobre la que desea rebase).kutschkem señala que, en un contexto mergetool GUI :
ours
" (la rama ascendente)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
ytheirs
durante un rebase .(extractos relevantes)
git rebase
página man :Debido a esto, cuando ocurre un conflicto de fusión:
ours
' es la serie rebase hasta ahora, comenzando con<upstream>
,theirs
' es la rama de trabajo. En otras palabras, los lados se intercambian.Inversión ilustrada
En una fusión
, 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)
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)
A
git rebase upstream
primero cambiaráHEAD
de B a la rama aguas arribaHEAD
(de ahí el cambio de 'la nuestra' y 'la de ellos' en comparación con la rama de trabajo "actual" anterior)., y luego el rebase reproducirá 'sus' confirmaciones en la nueva rama 'nuestra' B:
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 :
GUI git mergetool
kutschkem agrega, y con razón:
ours
" (la rama ascendente)theirs
" - la rama actual antes del rebase.git mergetool
de hecho menciona 'local' y 'remoto' :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 :
fuente
git checkout A; git rebase B
local es B, el remoto es A. Todo lo que necesitaba saber ...git checkout A; git rebase B
local es B, a distancia es una . Sicheckout A
ahora estoy viendo los archivos tal como existenA
, ¿cómo es eso de alguna manera el control remoto ? (No digo que Benubird esté equivocado; digo que git tiene una UX estúpida){branch A}
y /{branch B}
o similar.La línea de fondo
git rebase
git merge
En otras palabras, LOCAL siempre es el original, y REMOTE siempre es el tipo cuyos compromisos no estaban allí antes, porque están fusionados o rebasados en la parte superior
¡Pruébalo!
Ciertamente. ¡No confíes en mi palabra! Aquí hay un experimento fácil que puedes hacer para verlo por ti mismo.
Primero, asegúrese de tener git mergetool configurado correctamente. (Si no lo hiciera, probablemente no estaría leyendo esta pregunta de todos modos). Luego busque un directorio para trabajar.
Configura tu repositorio:
Cree una confirmación inicial (con un archivo vacío):
Cree una confirmación en una rama que no sea maestra:
Cree una confirmación en la rama maestra:
En este punto, su repositorio debería verse así:
Ahora para la prueba de rebase:
Ahora la prueba de fusión. Cierre su herramienta de combinación sin guardar ningún cambio y luego cancele la nueva versión:
Luego:
Sus resultados deben ser los mismos que se muestran arriba.
fuente
local
/ con losremote
que luché en mi propia respuesta anterior (que es más sobre la inversión deours
vs detheirs
todos modos)No entendí su problema exactamente, pero creo que el siguiente diagrama resuelve su problema. (Rebase: repositorio remoto ---> Espacio de trabajo)
Fuente: My Git Workflow
fuente