miércoles, abril 02, 2014

PlasticSCM: El merge sustractivo como reemplazo del borrado

Por: Fernando D. Bozzo

Hay situaciones en las que necesitamos borrar uno o varios cambios (changesets), pero queremos borrarlos con la opción de poder recuperarlos luego, o queremos borrarlos definitivamente pero nos es imposible porque no es el último changeset, sino uno o varios intermedios que ya forman parte del historial, y que por cuestiones de integridad referencial Plastic no permite borrarlos.

En estas situaciones lo que se puede hacer es un "merge sustractivo", o sea, un merge para deshacer cambios, que funciona exactamente al revés del merge común, que agrega cambios.

Aunque son exactamente la operación opuesta, tienen un punto en común, y es que en ambos puede darse el caso de requerir una intervención manual, o sea, de resolver algo a mano, bien desactivando los cambios de un panel en la ventana de merge o bien modificando a mano valores directamente.

En esta nota vamos a ver el merge sustractivo automático, ya que la parte manual es la misma que ya comenté en el merge normal, excepto que en vez de agregar cambios, quitaríamos cambios.


Cómo deshacer un changeset


Supongamos que hemos agregado un archivo en un changeset que no debíamos agregar e hicimos algunos cambios que no queremos, y que nos damos cuenta luego de haber hecho otros cambios que hemos guardado en otro changeset posterior y que no queremos borrar, solo queremos quitar el changeset del archivo agregado y los cambios anteriores.


Imagen 1: Cambios a mantener del nuevo botón "Pag.4" (click en la imagen para agrandar)



Imagen 2: Los mismos cambios, pero vistos en el código, luego de hacer doble-click en el changeset de la flecha verde




Imagen 3: Cambios a descartar del label verde (click en la imagen para agrandar)



Imagen 4: Los mismos cambios, pero vistos en el código, luego de hacer doble-click en el changeset de la flecha verde



1.  Para deshacer este changeset, lo marcamos (flecha verde de la imagen 4), elegimos click-derecho, "Merge Avanzado" y "Merge sustractivo de este changeset...", lo que mostrará esta pantalla en la que se puede observar que se borrará el archivo antes agregado y se desharán cambios en el form:



2.  Procesamos el merge, y nos quedarán los binarios, ya que solo podemos trabajar con versiones texto en un merge, y en este caso los cambios han sido todos automáticos (aunque no siempre es así):



3.  Seleccionamos los binarios que queden e indicamos dejar los que ya hay en el workspace:




4.  Como hemos hecho el merge sustractivo sobre la versión texto, y por suerte ha sido automático, debemos regenerar los binarios desde los textos. Nunca olvidar que en un merge "el texto manda" y el binario se regenera:



Y esperar el mensaje de confirmación:




5.  Hacemos el checkin y confirmamos que en la vista del Explorador de ramas que ha quedado una línea roja de merge sustractivo, que saltea al changeset que queríamos mantener:



6.  Finalmente, confirmamos que tanto el archivo agregado antes ahora se quita, como el código del label verde:


Como podemos ver, en el form no hay rastros del label verde y el botón "Pag.4" se mantiene.




Cómo deshacer un grupo de changesets


La forma de operar es la misma que para uno, pero con una única excepción: en vez de elegir un changeset se deben elegir dos.
Si que queremos deshacer los changesets marcados en naranja, debemos marcar (click) el de la izquierda (flecha verde) y luego marcar el de la derecha con ctrl+click (la otra flecha verde). Visualmente se puede comprobar la selección porque el fondo azulado del changeset es un poco más claro y porque el borde redondeado deja de ser gris claro y es gris oscuro:


Ejemplo 1 - Cuando los changesets a Deshacer están en la misma rama

En este caso todos los cambios están en la misma rama, por lo que el merge sustractivo también se hace en la misma rama.



Ejemplo 2 - Cuando los changesets a Deshacer están en distintas ramas

En este caso todos los cambios se han hecho en una rama secundaria (fdbozzo2), luego fueron integrados en la rama de tarea con un merge (punto A - flecha verde) y luego fueron deshechos con un merge sustractivo de la rama secundaria (fdbozzo2) pero con destino en la primaria (punto B - flecha roja)



El motivo de elegir un changeset más a la izquierda de la selección, es que se trata de un intervalo abierto-cerrado, donde la parte abierta (flecha verde izquierda) se selecciona pero no está incluida, y la parte cerrada (flecha verde derecha) se selecciona y está incluida.

El resto es igual que lo visto para un changeset.


Hasta la próxima!

Artículos relacionados:
PlasticSCM: ¿Qué es el Merge?
Control de Código Fuente: Terminología común que hay que conocer
PlasticSCM: ¡Houston, tenemos problemas!

No hay comentarios:

Publicar un comentario