Utilizo git-svn y noté que cuando tengo que arreglar un conflicto de fusión después de realizar una git svn rebase
, el significado de las opciones --ours
y --theirs
para, por ejemplo, git checkout
se invierte. Es decir, si hay un conflicto y quiero mantener la versión que vino del servidor SVN y deshacerme de los cambios que hice localmente, tengo que usar ours
, cuando espero que sea theirs
.
¿Porqué es eso?
Ejemplo:
mkdir test
cd test
svnadmin create svnrepo
svn co file://$PWD/svnrepo svnwc
cd svnwc
echo foo > test.txt
svn add test.txt
svn ci -m 'svn commit 1'
cd ..
git svn clone file://$PWD/svnrepo gitwc
cd svnwc
echo bar > test.txt
svn ci -m 'svn commit 2'
cd ..
cd gitwc
echo baz > test.txt
git commit -a -m 'git commit 1'
git svn rebase
git checkout --ours test.txt
cat test.txt
# shows "bar" but I expect "baz"
git checkout --theirs test.txt
cat test.txt
# shows "baz" but I expect "bar"
Respuestas:
Eso parece coherente con lo que hace una rebase.
git svn rebase
obtendrá las revisiones del padre SVN del HEAD actual y volverá a basar el trabajo actual (no comprometido con SVN) en su contra.git rebase
menciona:Tenga en cuenta que una fusió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:
<upstream>
,En otras palabras, los lados se intercambian .
Si concilia ambas definiciones:
test.txt
archivo conbar
contenido).test.txt
archivo conbaz
contenido) es "su", y cada una de esas confirmaciones de Git locales se está reproduciendo.En otras palabras, SVN o no:
<upstream>
rama " " (encima de la cual se repite cualquier cosa, y que es parte de las confirmaciones hasta ahora rebasadas ") es" nuestra ".Buen consejo mnemónico de CommaToast :
(y la primera cosa que una
git rebase upstream
lo hace para obtener de laupstream
rama sobre la que desea reajustar: CABEZA refiere aupstream
-ours
ahora).Es probable que la confusión provenga del papel de la rama trabajadora en un clásico
git merge
.Cuando se fusiona:
Como
git rebase
menciona la página de manual, una combinación durante un rebase significa que se intercambian los lados.Otra forma de decir lo mismo es considerar que:
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)
Pero en una rebase , cambiamos de lado porque lo primero que hace una rebase es verificar la rama ascendente. (para reproducir las confirmaciones actuales encima)
A
git rebase upstream
primero cambiaráHEAD
de B a la rama ascendenteHEAD
(de ahí el cambio de 'nuestro' y 'suyo' en comparación con la rama de trabajo "actual" anterior)., y luego la rebase reproducirá 'sus' confirmaciones en la nueva rama B de 'nuestra':
El único paso adicional
git svn rebase
es que se realiza primero una "búsqueda" de svn en la rama remota de Git que representa las confirmaciones de SVN.Inicialmente tienes:
, primero actualiza la rama de seguimiento de SVN con nuevas confirmaciones provenientes de SVN
, luego cambia la rama actual al lado SVN (que se convierte en "nuestro")
, antes de reproducir las confirmaciones en las que estabas trabajando (pero que ahora son "suyas" durante ese rebase)
fuente
git rebase
página de manual ...