2010-06-07 13 views
6

Digamos que tengo una rama de función llamada "branches/BigFeature". Quiero insertar esos cambios en el Troncal, hacer algunos cambios en el Troncal y fusionarlo nuevamente en la rama "BigFeature" para que el desarrollo pueda continuar.¿Por qué obtengo conflictos cuando se fusiona una rama en el Troncal y luego se fusiona de nuevo a la rama?

Mis pasos fueron:

  1. fusione los últimos cambios en el tronco a las ramas/BigFeature. (Tortoise SVN -> Fusionar un rango de revisiones)

  2. Fusiona los cambios en las ramas/BigFeature a Trunk. (Tortoise SVN -> Reintegrar una rama)

  3. hacer algunos cambios en el tronco.

  4. combinar los cambios en tronco para sucursales/BigFeatures. (Tortoise SVN -> Combinar un rango de revisiones)

El problema surge en el paso 4. Cuando puedo combinar de nuevo a BigFeature consigo todo tipo de conflictos. Parece tener un problema con los archivos que se agregaron originalmente en branches/BigFeature, pero que se fusionaron con el Troncal.

El mensaje que me da es "La última operación fusión trató de agregar el archivo 'bla', pero ya se añadió localmente.

Esto poco tiene sentido porque el archivo fue originalmente añadido en la ramas/rama BigFeature y luego se fusionó con el tronco. Pero ¿por qué no puede la operación de fusión darse cuenta de esto? ¿por qué se levanta como un conflicto?

el mismo tipo de error se produce para los archivos borrados.

La última operación de fusión trató de borrar/mover/cambiar el nombre del directorio 'bla', pero que se ha eliminado, movido o cambiado de nombre a nivel local.

Gracias por su ayuda.

+5

SVN se funden en general no funciona bien. – alternative

+1

¿Hay alternativas? – Justin

+5

Cualquiera que diga que svn merge no funciona no lo está haciendo bien. La visión conceptual de Svn de los cambios no es la mejor (más adelante los SCM como git lo acercaron un poco a la marca), pero no es cierto que uno no pueda fusionarse con subversión o incluso administrar una base de código complicada con fusiones próximas dentro y fuera. – Ether

Respuesta

7

Por desgracia, es una deficiencia de SVN, la forma en que se construye.

Los pasos de SVN tienen el siguiente aspecto:

1. (not modified) Merge the latest changes in Trunk to branches/BigFeature. (Tortoise SVN -> Merge a range of revisions) 
2. (not modified) Merge the changes in branches/BigFeature to Trunk. (Tortoise SVN -> Reintegrate a branch) 

2a. Delete branch branches/BigFeature 
2b. Create branch branches/BigFeature from current trunk 

3. (not modified) Make some changes to Trunk. 
4. (not modified) Merge the changes in Trunk to branches/BigFeatures. (Tortoise SVN -> Merge a range of revisions) 

rama SVN ya no es utilizable después de una operación de reintegración.

Actualización: hay una second way, en lugar de eliminar la rama.

2a. on branch: 
    $ svn update 
    Updated to revision X 
    $ svn merge --record-only -c X ^/trunk 
    $ svn commit -m "Block revision X from being merged into the branch." 

No sabía que este truco, lo aprendí gracias a su pregunta: D

+0

Eso es desafortunado. Pero bueno, al menos no soy solo yo :) Y este trabajo debería hacer el truco. – Justin

+0

No es necesario eliminar y volver a crear ramas todo el tiempo. Solo tienes que construir el comando de fusión correctamente para no volver a fusionar todo lo que fusionaste antes. – Ether

+0

¿Puede proporcionarnos alguna información sobre cómo hacer eso? Estoy de acuerdo con la línea de cmd, pero obviamente preferiría si Tortoise SVN proporcionara un medio para hacer esto. – Justin

Cuestiones relacionadas