2009-11-05 14 views
18

Si sincroniza siempre una rama de función antes de fusionarla de nuevo. ¿Por qué realmente tiene que usar la opción --reintegrate?¿Cuándo es realmente necesaria la opción de reintegración?

libro La Subversión dice:

Cuando la fusión de su rama de nuevo al tronco, sin embargo, la matemática subyacente es bastante diferente. Su rama de características ahora es una mezcolanza de cambios troncales duplicados y cambios de ramas privadas, por lo que no hay un rango contiguo simple de revisiones para copiar. Al especificar la opción --reintegrate, le está pidiendo a Subversion que replique cuidadosamente solo aquellos cambios exclusivos de su sucursal. (Y de hecho, lo hace comparando el árbol última tronco con la última rama del árbol: la diferencia resultante es exactamente sus cambios de la rama!)

Así que la opción --reintegrate sólo combina los cambios que son exclusivos de la función rama. Pero si siempre sincronizas antes de fusionar (que es una práctica recomendada, para tratar con cualquier conflicto en la rama de características), entonces los únicos cambios entre las ramas son los cambios que son exclusivos de la rama de características, ¿no? Y si Subversion intenta fusionar el código que ya está en la rama de destino, simplemente no hará nada, ¿verdad?

En a blog post, Mark Phippard escribe:

Si incluimos esas revisiones sincronizados, entonces fusionamos volver cambios que ya existen en el tronco. Esto produce conflictos innecesarios y confusos.

¿Hay algún ejemplo de cuándo dejar de reintegrar me da conflictos innecesarios?

Respuesta

10

Déjame explicar cuando --reintegrate es absolutamente necesario.

Considere el siguiente caso de uso.

  1. que tienen proyecto p1 bajo P1/tronco. El proyecto tiene un archivo, readme.txt, con una línea "línea 1" <
  2. Crear una nueva rama, p1/ramas/BR1
  3. estadía en el maletero. Agregue la línea "línea2" al readme.txt y conéctela al tronco
  4. Cambie a la rama p1/branches/br1. Actualiza a HEAD.
  5. Combina desde el tronco a esta rama (para recoger los cambios del tronco).
  6. Debe tener line1 y line2 en readme.txt
  7. Commit fusionar el resultado de p1/branches/br1 rama
  8. Cambiar al tronco. Actualiza a HEAD.
  9. Combinar desde p1/branches/br1 to trunk.
    1. Verás line1, line2line2 y en readme.txt. Entonces, tienes "line2" dos veces, lo cual es incorrecto. SVN no muestra ningún conflicto. Por lo tanto, es muy peligroso porque la fusión se realizó sin errores y tiene la impresión de que todo está bien.

La solución aquí es que la combinación de la etapa 9 se debe hacer uso de la opción --reintegrate. La opción de reintegración le dice a SVN que compare br1 con el enlace troncal y aplique solo br1 cambios al enlace troncal. En este caso particular, no hemos hecho ningún cambio en br1. El resultado en trunk debe ser dos líneas "line1" y "line2".

Otra observación útil. La rama p1/branches/br1 ya no se debe usar para el desarrollo después del paso 9. Si desea continuar el desarrollo en sucursales, cree una nueva rama, por ejemplo, p1/branches/br2. Otra combinación de trunk a p1/branches/br1 causa muchos conflictos.

+2

Acabo de hacer esta prueba usando SVN 1.7.0 y no veo que esto suceda. Lo que veo en su lugar es SVN filtrando automáticamente los conjuntos de cambios que ya existen en las ramas relacionadas, independientemente de la dirección de la fusión (de tronco a rama o de rama a tronco). ¿Ha cambiado el comportamiento de SVN en esta área de una manera que no se refleja en la documentación? – Neutrino

+2

También hice tu prueba con Netbeans 7.3.1 (que debería usar SVN 1.7), mi servidor SVN es 1.6.17 y no tengo ningún problema con las filas duplicadas. – betatester07

0

Creo que Mark significa que evita comparar dos archivos que se han modificado, uno para reintegrar desde la rama y su archivo correspondiente en el tronco, cuando ambos se han sincronizado (y no se han cambiado localmente en su rama respectiva).

Supongamos que tenemos trunk/a.c y branches/dev/a.c, con trunk/a.c modificado en algún momento y reintegrado en la rama más adelante con una combinación. Como señaló, es una buena práctica hacerlo antes de volver a poner todo en el baúl.

Así que el siguiente paso sería la fusión de nuevo a la troncal, donde a.c son "diferentes" en ambos lados, ya que han cambiado en ambas ubicaciones. Sin la opción habrá una comparación innecesaria, mientras que el --reintegrate hará que SVN vea que el cambio no fue solo local.

+2

Sí, puedo entender la "comparación innecesaria". Pero no el "conflicto innecesario", que es de lo que está hablando la documentación. –

0

Es ’ s nunca es necesario utilizar --reintegrate — es ’ s simplemente un alias. Si usted tiene una copia de trabajo de trunk, entonces

svn merge --reintegrate url://feature-branch workingcopy

es lo mismo que

svn merge url://trunk url://feature-branch workingcopy

Usted puede usar lo que uno se siente más cómodo con.

+0

Hmm. No estoy 100% seguro, pero creo que te equivocas con este. Al menos el svnbook da una imagen bastante diferente de él. http://svnbook.red-bean.com/nightly/en/svn.branchmerge.basicmerging.html#svn.branchemerge.basicmerging.stayinsync – Jonik

+0

@Michael: ¿De verdad estás seguro? En la documentación de SVN, es bastante claro que el comportamiento es diferente, ¿quiere decir que lo detecta automáticamente al especificar las dos URL? – RedGlyph

+3

Eso está de acuerdo con el enlace especificado en el PO. "La nueva opción de reintegración es una versión abreviada de la fusión de 2 URL ... En otras palabras, reintegrar es solo una nueva sintaxis más algunas verificaciones de seguridad" Me disculpo, pero no tengo experiencia de primera mano con esta opción . –

3

Nunca es necesario usar --reintegrate; es una conveniencia.Si su combinación más reciente de trunk a feature-branch fusionó todos los cambios que ocurrieron en trunk desde que se ramificó a la revisión rev, entonces podría usar el siguiente comando.

svn merge url://[email protected] url://feature-branch . 

Tenga en cuenta que este comando se ejecuta en la raíz de una copia actualizada al día de trabajo de trunk sin cambios pendientes que se ha comprometido.

Permítanme ampliar mi respuesta para responder más directamente a la pregunta "¿Hay algún ejemplo de cuándo dejar de reintegrar me da conflictos innecesarios?"

Esto es lo que significa el artículo por "Si incluimos esas revisiones sincronizadas, entonces fusionamos los cambios que ya existen en el tronco. Esto produce conflictos innecesarios y confusos".

Incluyendo las revisiones sincronizados sería el siguiente:

svn merge -r N:HEAD url://feature-branch . 

Dónde . es una copia de trabajo limpia del tronco y N es la revisión que feature-branch fue creado de trunk. Ese comando de fusión combina todos los cambios comprometidos con el feature-branch ya que fue ramificado, incluidos los cambios que se combinaron de trunk después de que se creó feature-branch. Eso significa que los cambios ya realizados en trunk se incluirán en la combinación anterior. Le diría a Subversion que aplique los cambios al trunk que en realidad se originó en trunk, lo que genera conflictos.

+0

Bueno, eso es lo que no entiendo. ¿Por qué los cambios que existen tanto en la rama como en el tronco generan conflictos, si esos cambios son idénticos? –

+2

@Tor, vería un conflicto si hubiera realizado algún cambio en la bifurcación al código modificado. En otras palabras, esos cambios pueden no ser más idénticos. Imagine que agregó 5 líneas en el tronco, sincronizadas con la rama y luego las modificó en la rama. Una combinación mostraría un conflicto: 5 líneas en el tronco frente a 5 líneas diferentes en la rama. Pero si usaste --reintegrate, simplemente notaría la diferencia en la rama y la fusionaría sin preguntar. –

+0

Esto significa que al fusionar sin reintegrar, diga "svn merge -r 1: 100 url: // feature-branch". encontrará todos los cambios realizados en url: // feature-branch de rev 1 a rev 100, y aplicará cada uno de ellos a. uno a uno. Mientras se reintegre, SVN solo comparará la diferencia entre rev 100 y rev 1, y tratará estas diferencias como cambios, luego se aplicará a. ? – CarmeloS

Cuestiones relacionadas