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 --oursy --theirspara, por ejemplo, git checkoutse 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 rebaseobtendrá las revisiones del padre SVN del HEAD actual y volverá a basar el trabajo actual (no comprometido con SVN) en su contra.git rebasemenciona: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.txtarchivo conbarcontenido).test.txtarchivo conbazcontenido) 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 upstreamlo hace para obtener de laupstreamrama sobre la que desea reajustar: CABEZA refiere aupstream-oursahora).Es probable que la confusión provenga del papel de la rama trabajadora en un clásico
git merge.Cuando se fusiona:
Como
git rebasemenciona 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 upstreamprimero cambiaráHEADde 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 rebasees 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 rebasepágina de manual ...