Node:Detección y resolución de conflictos, Next:, Previous:Números de revisión, Up:Un día con CVS



Detección y resolución de conflictos

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$