SpanishTutorial - fusionando cambios conflictivos
Ya hemos aprendido cómo realizar fusiones de código simples en SpanishTutorialMerge.
Mercurial es capaz de manejar también casos de fusión de código más complejos. No es tan raro el caso de que dos personas editen exactamente las mismas líneas de un fichero, y entonces haya que decidir qué hacer ¿cuál de los dos cambios predominará?. Cuando se dan estos casos los denominaremos conflictos; cuando se ha decidido qué hacer al darse un conflicto, se dice que se ha resuelto el conflicto.
Vamos a crear una situación artificial de conflicto. Comenzamos haciendo un clon de hola-mio:
$ cd .. $ hg clone hola-mio hola-mio-no-cvs
Ahora añadimos una nueva línea de salida en hello.c:
$ cd hola-mio-no-cvs
Cambiaremos main para que ponga lo que sigue:
int main(int argc, char **argv) { printf("hello, world!\n"); printf("sure am glad I'm not using CVS!\n"); return 0; }
Y hacemos un Commit del cambio:
$ hg commit -t'Doy gracias de esquivar las balas'
Recordar que en SpanishTutorialFirstChange creamos un ChangeSet en hola-mio-nueva-salida que también añadía una segunda línea a la salida. ¿Que ocurrirá cuando tratemos de propagar ese cambio aquí?
$ hg pull ../hola-mio-nueva-salida/ pulling from ../hola-mio-nueva-salida/ searching for changes adding changesets adding manifests adding file revisions modified 1 files, added 1 changesets and 1 new revisions (run 'hg update' to get a working copy)
Por ahora todo bien. Tratemos de hacer la actualización de ficheros en el directorio de trabajo (Update).
$ hg update this update spans a branch affecting the following files: hello.c (resolve) aborting update spanning branches! (use update -m to perform a branch merge)
Al igual que en SpanishTutorialMerge, tenemos que ejecutar update -m. Pero aquí las cosas cambian. Ahora Mercurial no puede fusionar automáticamente, porque la misma línea del mismo fichero de código se ha modificado de manera distinta en cada ChangeSet (el que acabamos de introducir con un Commit, y el que acabamos de propagar mediante Pull).
$ hg update -m
En este punto lo que ocurra puede depender de la suerte. Si tenemos suerte, y tenemos un programa para fusionar (MergeProgram) instalado, se pasará a ejecutar dicho programa. En él podremos ver los conflictos que hay entre los distintos cambios y decidir cómo resolverlos.
Si no tenemos suerte, y no tenemos un programa de fusionado instalado (MergeProgram), pasaremos a nuestro editor de texto, el cual mostrará el fichero que necesitamos fusionar. Hacer ésto a mano es muy proclive a errores además de tedioso. Es mejor salir del editor y usar el comando hg undo para invertir el efecto de la propagación de cambios con Pull, y luego instalar un programa para gestionar las fusiones (MergeProgram) y probar de nuevo.
Ahora continuaremos en SpanishTutorialConclusion.