Node:Detección y resolución de conflictos, Next:Averiguar quién hizo qué (leyendo informes de cambios), Previous:Números de revisión, Up:Un día con CVS
Detectar un conflicto es bastante sencillo. Al invocar una actualización,
CVS le dice, bien a las claras, que existe un conflicto. Pero primero,
creemos el conflicto en sí: editemos el fichero hello.c para insertar
la línea
printf ("este cambio generará un conflicto\n");
exactamente donde mperez introdujo esto:
printf ("entre hola y adiós\n");
En este momento, el estado de nuestra copia de hello.c es
floss$ cvs status hello.c =================================================================== File: hello.c Status: Needs Merge Working revision: 1.2 Mon Apr 19 02:17:07 1999 Repository revision: 1.3 /usr/local/cvs/miproyecto/hello.c,v Sticky Tag: (none) Sticky Date: (none) Sticky Options: (none) floss$
lo que significa que ha habido cambios tanto en la copia del repositorio
como en nuestra copia de trabajo, y que estos cambios necesitan ser
fusionados (CVS no es aún consciente de que los cambios entrarán en
conflicto, porque aún no hemos intentado hacer una actualización).
Cuando hagamos una actualización, veremos esto:
floss$ cvs update hello.c RCS file: /usr/local/cvs/miproyecto/hello.c,v retrieving revision 1.2 retrieving revision 1.3 Merging differences between 1.2 and 1.3 into hello.c rcsmerge: warning: conflicts during merge cvs update: conflicts found in hello.c C hello.c floss$
La última línea es la clave. La "C" situada a la izquierda del nombre del
fichero indica que los cambios han sido fusionados [en nuestra copia de
trabajo], pero que entran en conflicto. El contenido de hello.c muestra
ahora ambos cambios:
#include <stdio.h> void main () { printf ("¡Hola, mundo!\n"); <<<<<<< hello.c printf ("este cambio generará un conflicto\n"); ======= printf ("entre hola y adiós\n"); >>>>>>> 1.3 printf ("¡Adiós, mundo!\n"); }
Los conflictos siempre se muestran delimitados por marcadores de
conflicto, en el siguiente formato:
<<<<<<< (nombre de fichero) (cambios en la copia de trabajo, todavía no enviados al repositorio) blah blah blah ======= (cambios procedentes del repositorio) blah blah blah etc. >>>>>>> (último número de revisión en el repositorio)
El fichero Entries también muestra que el fichero se encuentra en este
momento en un estado intermedio:
floss$ cat CVS/Entries /README.txt/1.1.1.1/Sun Apr 18 18:18:22 1999// D/a-subdir//// D/b-subdir//// /hello.c/1.3/Result of merge+Tue Apr 20 03:59:09 1999// floss$
La manera de resolver el conflicto es editar el fichero de forma que
tenga el texto que resulte apropiado, eliminando de paso los marcadores
de conflicto, y después enviarlo al repositorio. Esto no significa
necesariamente elegir entre uno o otro cambio; podría decidir que ninguno
de los dos cambios es satisfactorio y reescribir la sección donde aparece
el conflicto, o incluso el fichero al completo. En este caso, vamos a
favorecer el primero de los cambios, pero con una puntuación y uso de
las mayúsculas ligeramente distintos de los empleados por mperez:
floss$ emacs hello.c (editamos el fichero...) floss$ cat hello.c #include <stdio.h> void main () { printf ("¡Hola, mundo!\n"); printf ("ENTRE HOLA Y ADIÓS.\n"); printf ("¡Adiós, mundo!\n"); } floss$ cvs ci -m "alterada la línea del medio" cvs commit: Examining . cvs commit: Examining a-subdir cvs commit: Examining a-subdir/subsubdir cvs commit: Examining b-subdir Checking in hello.c; /usr/local/cvs/miproyecto/hello.c,v <- hello.c new revision: 1.4; previous revision: 1.3 done floss$