viernes, 10 de octubre de 2014

PARTE 4 - Resolución de conflictos del merge

Link de emergencia (siempre buscar primero aquí cualquier error):

En el panel derecho del Blog tienen el índice de prácticas >>


En la PARTE 3 seguimos trabajando con ramas, pero esta vez haciendo merges de los cambios.

En esta parte veremos la resolución de algunos conflictos de un Merge.
Recuerden la Terminología común que hay que conocer

Las dudas preguntarlas en el hilo de la PARTE 4 en el foro.


Antes de continuar, leer el apartado "¿Qué son los conflictos de un Merge?" en el artículo sobre merge.

Si ya lo habían leído, denle una nueva lectura, ya que suelo actualizarlos con algunas explicaciones extra o incluso algún ejemplo más, y recuerden que ese artículo es orientativo y no debe tomarse como el paso a paso de este ejercicio.


También leer:

[Artículo] PlasticSCM: El merge sustractivo como reemplazo del borrado

[Artículo] PlasticSCM: Qué es el Cherry Pick y cómo se usa


Vamos a generar conflictos a propósito en el merge para aprender a resolverlos, equivocarnos, ejecutar y ver si todo sigue funcionando y volver a intentarlo.




A) INTEGRACIÓN DE OBJETOS


En esta parte vamos a agregar 2 controles, uno en cada rama de trabajo, simulando a un usuario distinto trabajando en el mismo componente, y luego mezclaremos los cambios.

Cada uno, en su rama de trabajo "usuario" hagan lo siguiente:

1.  Creen una nueva rama con su "usuario" + "2" (ej: fdbozzo2) desde la rama de tarea y pásense a ella. Ahora tendrán 2 ramas paralelas de trabajo: usuario (la que ya tenían) y usuario2 (la nueva).

2. Modifiquen su form agregando un botón cmdBoton_B y caption "Boton B" con un MESSAGEBOX("cmdBoton_B") en el evento click, y a continuación hagan checkin y el merge en la rama de tarea (no olvidar la vista texto). Este merge será automático.

3. Pásense a la otra rama de trabajo ("usuario") y agreguen un botón cmdBoton_A y caption "Boton A" con un MESSAGEBOX("cmdBoton_A") en el evento click, y a continuación hagan el merge en la rama de tarea. Aquí deberán mantener ambos cambios, y antes de hacer el checkin ejecuten el form para estar seguros de que funciona bien.

4. Sincronizar el repositorio



B) INTEGRACIÓN DE MÉTODOS


En esta parte vamos a simular un cambio de 2 usuarios en el mismo método, donde se quieren mantener ambos cambios.


1.  En vuestra rama de trabajo "usuario2" modificar el evento click de cmdBoton_B, agregar lo siguiente al final y luego hagan checkin de los cambios:

IF _SCREEN.StartMode = 1 THEN && CON ERROR PROVOCADO!
   MESSAGEBOX( "Modo Objeto" )
ENDIF

2. Pásense a vuestra otra rama de trabajo ("usuario") y en el evento click de cmdBoton_A, agregar lo siguiente al final y luego hagan checkin de los cambios

IF _VFP.StartMode = 0 THEN
   MESSAGEBOX( "Modo Desarrollo" )
ENDIF

3. Desde la misma rama "usuario", hagan el merge a la rama de la tarea (debería ser automático) y luego hacer el checkin.


4. Desde la rama "usuario2", hagan el merge a la rama de la tarea, donde deben quedar ambos cambios y luego hacer el checkin.


5. Probar el form: el boton A debería funcionar bien, el botón B debería dar un error (ignorarlo), finalmente sincronizar el repositorio




C) DESINTEGRACIÓN DE UNA RAMA


En esta parte vamos a simular una funcionalidad que se quiere quitar para resolver un error, por lo que vamos desintegrar los últimos cambios de vuestra rama usuario2 (el boton B), para que solo queden los de la rama usuario.


1.  Con la casa en la rama de tarea, elegir el intervalo necesario para desintergar los changesets de vuestra rama usuario2 (recordar cómo deshacer un grupo de changesets) y hacer un Merge Sustractivo del mismo. Esto creará un nuevo changeset en la rama tarea que excluirá los cambios de vuestra rama usuario2, o sea que deberá quedar el IF correspondiente a "Modo Desarrollo" de vuestra rama usuario. Seguramente requiera intervención manual para quitar todo lo relacionado el botón B que agregamos en la rama usuario2.



2. Luego de regenerar el binario, por haber hecho un merge, abran el form con VFP y verifiquen que funciona y que muestra el Botón A con el messagebox de Modo Desarrollo y no muestra el Botón B.

3. Si todo es correcto, hacer el checkin y sincronizar todo.




D) ARREGLO DEL ERROR EN LA RAMA DESINTERGADA


En esta parte vamos a arreglar el error provocado del botón de la rama desintegrada de antes.


1. En vuestra rama usuario2, abrir el form en el evento click de cmdBoton_B y cambiar _SCREEN por _VFP.

2. Probar el form y comprobar que el Botón B muestra un messagebox y ningún error

3. Si todo es correcto, hacer el checkin y sincronizar todo.



E) REINTEGRACIÓN DE CHANGESETS DESINTEGRADOS


En esta parte vamos a reintegrar el último changeset desintegrado y posteriormente arreglado.
Para reintegrar algo que se quitó con un merge sustractivo, es necesario usar el cherry pick, que es otro tipo de merge, e indicarle a Plastic que ignore el merge tracking.


1. Con la casa en la rama de tarea, elegir la rama de trabajo (no un changeset) donde se originó el merge sustractivo y elegir "Cherry Pick de esta rama", ignorando el merge tracking, como se explicó en artículo de Cherry Pick, aceptar y Recalcular el merge (el botón de al lado), ya que de otra forma, no mostrará archivos, porque ya habían sido quitados antes.




2. Al finalizar el merge, donde se reincorpora todo lo relativo al Botón B, no olviden rehacer los binarios

Nota: Al hacer el merge manual, es conveniente ordenar los procedimientos y objetos alfabéticamente (primero el Boton A y luego el B), para evitar futuras diferencias, ya que al regenerar luego el binario, si se hiciera nuevamente la versión texto, FoxBin2Prg haría ese ordenamiento y marcaría diferencias. No es imprescindible ni es una cambio funcional, sino sólo para evitar esas diferencias. Recordar que marcando/desmarcando los cambios con el título de la ventana de merge, se logra que un cambio pase de arriba a abajo (probarlo en ambos paneles para comprobarlo). Modificar el código manualmente en el panel inferior, debe ser siempre el último recurso a usar.

3. Si todo es correcto, hacer el checkin y sincronizar todo.

Listo, ya podrán comprobar los cambios de los últimos changesets, y lo que se ha agregado y quitado en cada uno, incluyendo el agregado final.



Para cuando terminen esta parte, ya sabrán:


- Integrar métodos de 2 o más ramas
- Integrar objetos de 2 o más ramas
- Resolver algunos conflictos manuales y automáticos en el merge de 2 o más ramas
- Desintegrar un changeset y una rama
- Volver a integrar un changeset o una rama con el Cherry Pick




Nos vemos en el foro! :D