UC3M

Grado en Ing. Telemática/Sist. Audiovisuales/Sist. de Comunicaciones

Arquitectura de Sistemas

Septiembre 2017 - Enero 2018

15.9. Resolución de conflictos con kdiff3

Supongamos que en el depósito remoto de Subversion existe una versión que denominaremos A de un fichero. Un miembro del equipo hace unos cambios en una zona del fichero y envía estos cambios al depósito con el comando commit. A esta nueva versión le llamaremos B. Al mismo tiempo, en tu copia local, que es idéntica a la versión A del depósito remoto, haces unos cambios en la misma zona del fichero que tu compañero. Cuando intentas mandar estos cambios al depósito, la operación marca el fichero con la letra C, se ha encontrado un conflicto (ver sección 15.4). Subversion ha intentado mezclar los cambios de tu compañero con los tuyos, pero no ha sido capaz, con lo que deja el fichero modificado y preparado para que tú resuelvas esta mezcla. La siguiente figura ilustra esta situación.

Supongamos que el fichero en el que ha aparecido el conflicto se llama writenumbers.c. Tras crear la versión C (copia local modificada) y enviar los cambios al depósito con el comand commit se nos informa de que el fichero está sin actualizar (hay una nueva versión). Al actualizar con el comando update se produce el conflicto y se ofrecen varias posibilidades a lo que respondemos con la letra p para posponer la resolución. Si consultamos el estado del fichero con el comando status, vemos que refleja el conflicto. Además, en el directorio se han creado tres ficheros adicionales: writenumbers.c.mine, y dos ficheros más con el sufijo r seguido de un número (que es el número de versión). La siguiente figura muestra esta situación.

El fichero writenumbers.c.mine contiene la versión con tus modificaciones locales (versión C), y los dos ficheros con el sufijo r seguido de un número son las versiones A y B del depósito remoto. El fichero con número de versión menor es el más antiguo.

El programa kdiff3 es un editor preparado para mezclar el contenido de de estas tres versiones en una versión definitiva. El programa se invoca de la siguiente forma:

kdiff3 writenumbers.c.mine writenumbers.c.r151 writenumbers.c.r153 -o writenumbers.c

Como argumentos del comando se dan los tres ficheros (versiones A, B y C) y con la opción -o se selecciona el fichero en el que guardar el resultado. El editor muestra en tres ventanas los tres ficheros y en la parte inferior el fichero resultante. La siguiente figura muestra esta herramienta editando este conflicto.

Con la flechas de la parte superior se puede mover entre conflictos (en este caso sólo hay uno). Para cada conflicto se puede seleccionar el contenido de cada una de las tres versiones (botones A, B y C de la parte superior) para incluir en el fichero resultante, o directamente escribir en este fichero el texto correcto. Una vez se termina se salva el fichero final sin conflictos. Tras esta operación, el estado del fichero todavía sigue mostrando el conflicto. Esto es porque Subversion requiere que se confirme la resolución de un conflicto de forma explícita mediante el comando resolved, tal y como se muestra en el siguiente ejemplo:

svn resolved writenumbers.c

Tras este comando, el fichero está listo para ser enviado al depósito centrar con el comando commit.