tortoise tag subversion hacer entre diferencia create crear branches svn version-control merge three-way-merge

svn - tag - Subversión: ¿cómo fusionar solo revisiones específicas en el tronco cuando se hacen múltiples cambios consecutivos en una rama?



merge svn (8)

He estado usando TortoiseSVN, svn y subclipse y creo que entiendo los conceptos básicos, pero hay una cosa que me ha estado molestando por un tiempo: la fusión introduce código no deseado. Aquí están los pasos.

trunk/test.txt@r2 . Se creó un archivo de prueba con ''A'' y un retorno:

A [EOF]

branches/TRY-XX-Foo/test.txt@r3 . Ramificó el trunk para TRY-XX-Foo :

A [EOF]

branches/TRY-XX-Foo/test.txt@r4 . Hizo un cambio no deseado en TRY-XX-Foo y lo comprometió:

A B (unwanted change) [EOF]

branches/TRY-XX-Foo/test.txt@r5 . Hizo una corrección de error importante en TRY-XX-Foo y lo comprometió:

A B (unwanted change) C (important bug fix) [EOF]

Ahora, me gustaría fusionar solo la importante corrección de errores en trunk. Por lo tanto, corro fusión para la revisión 4:5 . Lo que termino en mi directorio de trabajo es un conflicto.

trunk/test.txt :

A <<<<<<< .working ======= B (unwanted change) C (important bug fix) >>>>>>> .merge-right.r5 [EOF]

En contra de mi voluntad, Subversion ha incluido ahora "cambios no deseados" en el código de troncal, y necesito eliminarlos manualmente. ¿Hay alguna forma de fusionar solo las revisiones especificadas cuando se realizan varios cambios consecutivos en la rama?

La parte del problema es que B (cambio no esperado) está incluido en .merge-right y no puedo distinguir la diferencia de la revisión de la que proviene. Usualmente uso TortoiseMerge y así es como se ve.


Fusionando solo las revisiones 4,7 y 11-15 con svnmerge :

svnmerge.py merge -r4,7,11-15

Y con svn regular:

svn merge -c4,7 -r10:15 http://.../branches/TRY-XX-Foo


Si no desea el cambio no deseado, no combine la revisión 4: 5, sino solo la revisión 5. Significa que fusiona el cambio confirmado en la revisión 5.


Creo que está incluyendo las revisiones que desea correctamente, pero el algoritmo de fusión no encuentra el lugar para insertar el cambio deseado y, por lo tanto, también incluye la línea que se encuentra encima. Estos son los mismos pasos pero con un conjunto diferente de cambios, y creo que funciona como esperaba originalmente:

$ svnadmin create repo $ svn mkdir -m '''' file://`pwd`/repo/trunk Committed revision 1. $ svn mkdir -m '''' file://`pwd`/repo/branches Committed revision 2. $ svn co file://`pwd`/repo/trunk co.trunk Checked out revision 2. $ cat > co.trunk/test.txt << EOF > A > B > C > EOF $ svn add co.trunk/test.txt A co.trunk/test.txt $ svn commit -m '''' co.trunk Adding co.trunk/test.txt Transmitting file data . Committed revision 3. $ svn copy -m '''' file://`pwd`/repo/trunk file://`pwd`/repo/branches/testbr Committed revision 4. $ svn co file://`pwd`/repo/branches/testbr co.testbr A co.testbr/test.txt Checked out revision 4. $ cat > co.testbr/test.txt << EOF > A > A1 unwanted > B > C > EOF $ svn commit -m '''' co.testbr Sending co.testbr/test.txt Transmitting file data . Committed revision 5. $ cat > co.testbr/test.txt << EOF > A > A1 unwanted > B > B1 wanted > C > EOF $ svn commit -m '''' co.testbr Sending co.testbr/test.txt Transmitting file data . Committed revision 6. $ svn merge -r 5:6 file://`pwd`/repo/branches/testbr co.trunk --- Merging r6 into ''co.trunk'': U co.trunk/test.txt $ cat co.trunk/test.txt A B B1 wanted C


Otra cosa que podría hacer sería deshacer manualmente la confirmación incorrecta en la rama, lo que le permitiría volver a fusionar la rama en el tronco como lo haría normalmente.

TortoiseSVN

Usando TortoiseSVN abre la vista de registro en un archivo, selecciona la versión ofensiva y elige "Revertir cambios desde esta revisión" desde el menú del botón derecho. Confirme los cambios que realiza en su copia de trabajo y luego puede fusionar la rama fácilmente.

Línea de comando

Para hacer esto con el cliente de la línea de comandos, realiza una fusión inversa (esto se toma de Pragmatic Source Control usando el libro de Subversion) donde fusiona los cambios entre la versión ofensiva y la versión anterior en la copia de trabajo del archivo. Entonces, como arriba, comprometerías los cambios y luego puedes ramificar normalmente. En tu ejemplo, harías algo como:

svn merge -r 4:3 test.txt


Bueno, para aclarar algo acerca de la fusión es que en realidad tiene 2 pasos.

  1. Unir
  2. Cometer

Entonces eso significa que después de que termine su fusión, puede hacer una diferencia manual contra la cabeza y la otra rama para asegurarse de que la fusión sea correcta. Y si algo anda mal con él, como en su caso, puede corregirlo manualmente antes de la confirmación.

/ Johan


El problema es que ambos svn

A <<<<<<< .working ======= B (unwanted change) C (important bug fix) >>>>>>> .merge-right.r341

y TortoiseSVN está tratando la situación como una fusión bidireccional. He oído hablar del término fusión tripartita, así que le di una oportunidad a Beyond Compare . Con la configuración rápida con TortoiseSVN, Editar Conflicto ahora muestra la siguiente pantalla. Esto no es perfecto, ya que todavía requiere la intervención humana, pero al menos puedo decir qué cambios vienen de dónde.

Ver captura de pantalla .


En TortoiseSVN, solo debe especificar las revisiones que desea fusionar. A diferencia del cliente de línea de comando donde tiene que especificar, por ejemplo, -r4: 5 para combinar los cambios entre r4 y r5, solo tiene que especificar ''5'' como el número de revisión para fusionar en el cuadro de diálogo de fusión de TortoiseSVN. Si no está seguro, utilice siempre el diálogo de registro en el cuadro de diálogo de fusión y seleccione las revisiones que desea fusionar en ese diálogo de registro (luego haga clic en Aceptar y las revisiones seleccionadas se establecerán automáticamente en el cuadro de diálogo de fusión).

En cuanto a la resolución de su conflicto en TortoiseMerge: de acuerdo con la captura de pantalla en su pregunta, TortoiseMerge le muestra dos líneas en conflicto (las que se muestran como ''????'' en la vista inferior). Lo que quiere es incluir el cambio ''C'' pero no ''B''?

  • Haga clic izquierdo sobre el primer ''???'' línea para seleccionarlo, luego haga clic derecho, elija ''usar bloque de'' mina '''' desde el menú contextual
  • Haga clic izquierdo en el segundo ''???'' línea para seleccionarla, luego haga clic derecho, elija ''usar bloque de'' ellos '''' desde el menú contextual
  • Haga clic en el botón Guardar (o Archivo-> Guardar)
  • Opcionalmente, haga clic en el botón "Marcar como resuelto"

Como señalaron otros usuarios (no me atribuiré el mérito de haberlo notado porque no lo hice), la naturaleza trivial de esta fusión (es decir, la falta de contexto en torno al cambio) puede confundir las herramientas.

Hago mucha fusión y, como descubriste, la herramienta de fusión proporcionada por Tortoise es horrible. Una herramienta de combinación de tres vías es una necesidad absoluta si haces esto muy a menudo. Beyond Compare es mi favorito personal, pero hay otros que son gratuitos (Meld, KDiff3) y otros que no (Araxis).

Notará que Beyond Compare hizo lo correcto al final, ¡incluso si hace que verifique manualmente su corrección!