Node:El método lento de deshacer cosas, Next:El método rápido de deshacer cosas, Previous:Examinar y deshacer cambios, Up:Un día con CVS
Este método utiliza la combinación de opciones -p y -r al hacer la actualización. La opción -p envía el contenido de la revisión indicada a la salida estándar.
De por sí, no es que esto sea algo terriblemente útil, dado que el contenido del fichero desaparecerá rápidamente por la ventana, dejando intacta la copia de trabajo. Sin embargo, redirigiendo la salida estándar al fichero, el fichero terminará recibiendo el contenido de la antigua revisión. Sería lo mismo que haber editado el fichero a mano para llevarlo a ese estado.
Primero, sin embargo, mperez necesita ponerse al día respecto al
repositorio:
paste$ cvs update cvs update: Updating . U hello.c cvs update: Updating a-subdir cvs update: Updating a-subdir/subsubdir cvs update: Updating b-subdir paste$ cat hello.c #include <stdio.h> void main () { printf ("¡Hola, mundo!\n"); printf ("ENTRE HOLA Y ADIÓS.\n"); printf ("¡Adiós, mundo!\n"); } paste$
Lo siguiente que hace es emplear la opción -p al invocar la actualización,
para asegurarse de que la revisión 1.3 es justo la que quiere:
paste$ cvs update -p -r 1.3 hello.c =================================================================== Checking out hello.c RCS: /usr/local/cvs/miproyecto/hello.c,v VERS: 1.3 *************** #include <stdio.h> void main () { printf ("¡Hola, mundo!\n"); printf ("entre hola y adiós\n"); printf ("¡Adiós, mundo!\n"); }
Ooops, hay algunas líneas inútiles al comienzo. En realidad estas líneas
no se envían a la salida estándar sino al flujo de error estándar, así que
son inofensivas. Aún así, estas líneas hacen más difícil interpretar la
información, y pueden ser suprimidas con -Q:
paste$ cvs -Q update -p -r 1.3 hello.c #include <stdio.h> void main () { printf ("¡Hola, mundo!\n"); printf ("entre hola y adiós\n"); printf ("¡Adiós, mundo!\n"); } paste$
Ahí estamos - esto es exactamente lo que mperez quería obtener. El
siguiente paso es poner ese contenido en el fichero de la copia de
trabajo, usando una redirección Unix (que es lo que hace el signo ">"):
paste$ cvs -Q update -p -r 1.3 hello.c > hello.c paste$ cvs update cvs update: Updating . M hello.c cvs update: Updating a-subdir cvs update: Updating a-subdir/subsubdir cvs update: Updating b-subdir paste$
Al hacer ahora la actualización, el fichero aparece como modificado, lo
cual tiene sentido dado que su contenido ha cambiado. Específicamente,
tiene el mismo contenido que la antigua revisión 1.3 (no es que CVS se
dé cuenta de que es idéntica a la revisión antigua, tan sólo se da
cuenta de que se ha modificado). Si mperez quiere estar aún más seguro,
puede hacer un diff para comprobarlo:
paste$ cvs -Q diff -c Index: hello.c =================================================================== RCS file: /usr/local/cvs/miproyecto/hello.c,v retrieving revision 1.4 diff -c -r1.4 hello.c *** hello.c 1999/04/20 04:14:37 1.4 --- hello.c 1999/04/20 06:02:25 *************** *** 4,9 **** main () { printf ("¡Hola, mundo!\n"); ! printf ("ENTRE HOLA Y ADIÓS.\n"); printf ("¡Adiós, mundo!\n"); } --- 4,9 -- main () { printf ("¡Hola, mundo!\n"); ! printf ("entre hola y adiós\n"); printf ("Adiós, mundo!\n"); } paste$
Sí, esto es exactamente lo que él quería: una verdadera vuelta atrás.
De hecho, es lo contrario del diff que obtuvo previamente. Satisfecho,
lo envía:
paste$ cvs ci -m "devuelto al código 1.3" 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.5; previous revision: 1.4 done paste$