2011-03-23 13 views
15

Estoy usando git-svn para administrar mis ramas de corrección de errores, pero me dice que tengo cambios no fusionados, aunque si reviso el repositorio de SVN directamente, puedo ver que también se han confirmado. Es como si la rebase de la corrección de error no estuviera configurando la rama como fusionada.git indica que una rama no se fusionó después de volver a basar, ¿por qué?

¿Qué estoy haciendo mal, aquí?

git checkout -b fix_bug_1234 

git add . 
git commit -m "first change" 
git add . 
git commit -m "second change" 

git rebase -i HEAD~2 // squash the two changes together 

git svn rebase // fetch any changes from svn 

git checkout master 
git rebase fix_bug_1234 
git svn dcommit 

git branch -d fix_bug_1234 
error: The branch 'fix_bug_1234' is not fully merged. 

Respuesta

27

La razón de esto es que git rebase cambia los objetos de confirmación. Entonces, si bien el contenido real (o diff) es el mismo con esos commit rebasados, se están refiriendo a un padre diferente, y como tales son diferentes.

De esa manera git branch -d no se puede verificar que los cambios de esos commits estén incluidos en algunas otras confirmaciones. Necesitará usar git branch -D (mayúscula D) para forzar la eliminación.

En una nota al margen: git svn dcommit tiene el mismo efecto que el rebase. Como dcommit empuja las confirmaciones al servidor SVN, luego obtiene las confirmaciones del servidor SVN nuevamente. Entonces termina con diferentes objetos que los que presionaron. Aunque pueden ser idénticos en contenido (a menos que haya conflictos), aún difieren (la razón principal es que git svn agrega una línea al mensaje de confirmación que indica la versión SVN a la que pertenece la confirmación).

+0

Muy buena respuesta, gracias por explicar dcommit, too! –

3

Así es como hago este tipo de cosas, y funciona. La respuesta del usuario poke explica por qué la base de datos de git no está haciendo lo que usted desea.

git rebase -i HEAD~2 // squash the two changes together 

git svn rebase // fetch any changes from svn 
git svn dcommit // you can commit to SVN from any branch 

git checkout master 
git svn rebase 
git branch -d fix_bug_1234 
+0

Bueno, la rebase en sí está haciendo lo que yo quiero. ¡Es un poco aterrador ver que me dicen que me he mudado! Gracias por los consejos de flujo de trabajo. –

+0

La rebase está haciendo lo que quieras con el contenido de tus archivos. No preserva el árbol de confirmación exacto de SVN, por lo que realmente tienes commits no fusionados. Simplemente resultan en el mismo contenido de archivo. –

Cuestiones relacionadas