viernes, 1 de agosto de 2014

Control de versiones con GIT y Eclipse



Qué es GIT

GIT es un sistema de control de versiones que facilita que muchas personas trabajen sobre un mismo proyecto. Para que esto sea posible, se introduce el concepto de branch. Generar un branch sobre un proyecto nos permite copiar su contenido y modificarlo y/o agregar cierta funcionalidad. En forma simultánea, otra persona pudo haber generado otro branch y haber agregado otra funcionalidad. De este modo tenemos un proyecto base y muchos branches que agregan diferentes funcionalidades. Para generar una nueva versión del proyecto con todas las funcionalidades de cada uno de los branches aplicada, se realiza el proceso de merge. Mediante este proceso se van "mezclando" uno a uno los branches, GIT nos indicará las porciones de código que cambiaron y una persona deberá decidir cómo hacer la mezcla para que la nueva versión del proyecto funcione correctamente.

Qué necesitamos para utilizar GIT

Para usar el sistema GIT, necesitamos instalar un servidor git, o utilizar uno online. El sevidor GIT online más popular es GIT-HUB el cual es completamente gratuito si dejamos públicos nuestros proyectos. En este servidor estará nuestro proyecto y todos los branches que realicemos. Es importante destacar que cada programador trabajará en forma local, y cuando lo decida, copiará su trabajo al servidor. Copiar el branch sobre el que se trabaja al servidor se conoce como push.

Creando un repositorio en GIT-HUB

Después de registrarnos, presionamos el botón "add repository" le ponemos un nombre, una descripción y lo creamos. En este ejemplo creamos "proyectoPrueba1"

Configurando Eclipse para trabajar con GIT

A continuación, mostraremos cómo configurar eclipse para trabajar con GIT, para ello hay que instalar un plug-in de Eclipse, esto no es especifico de ningún lenguaje en particular. En este post utilizaremos Eclipse y un proyecto C, pero es válido para cualquier tipo de proyecto sobre Eclipse (Java,Python, etc.)

Para instalar el plug-in en el Eclipse, vamos a Help->Install new Software y colocamos la URL: http://download.eclipse.org/egit/updates elegimos "Eclipse Git Team provider" y seguimos los pasos para instalar el plug-in.

Creamos un proyecto C con Eclipse como el que se muestra en la figura:


Luego en la lengüeta “git repositories” (si no la vemos, podemos agregarla en: Window->show view-> other-> git-> git repositories) del Eclipse y hacemos click en “clone a git repository”:


Para cargar los datos de conexión contra github, tomaremos los datos proporcionados al crear el repositorio, elegimos como protocolo "https" y cargamos el nombre del host "github.com" y el path a nuestro repositorio, también ponemos nuestro usuario y clave de github:

 
Al presionar next nos dirá que el repositorio esta vacío. Al presionar next nuevamente, nos permitirá elegir el path donde se guardará la información requerida por el control de versiones para nuestro proyecto, por defecto, creara una carpeta "git" en nuestro home. Presionamos finish para terminar.

Ahora que estamos trabajando con el repositorio, debemos agregar el proyecto al mismo, para ello, hacemos click derecho sobre el proyecto->Team->share project. Luego seleccionamos "GIT" como tipo de repositorio y presionamos next. En la ventana que nos aparece, elegimos nuestro repositorio del combo "Repository":


Finalizamos presionando "finish".

 

Branch Master y primer Commit

Anteriormente mencionamos que un branch era una copia del proyecto sobre el cual trabajamos para aplicarle cambios y luego lo podíamos "mezclar" junto con otros branches para generar una nueva versión del proyecto. Como todavía no tenemos el proyecto base en nuestro repositorio, debemos crearlo, y esta "base" no es más que otro branch, el primero, también llamado "branch Master".

Para copiar el proyecto al server y generar el primer branch, debemos realizar previamente un commit. Un commit es una especie de punto de restauración de cambios que realizamos sobre el proyecto. Cuando nosotros estamos trabajando sobre un branch y terminamos una modificación, podemos ejecutar un commit para que el control de versiones genere un punto de restauración, al cual podremos volver ante algún error futuro. Los commits se realizan en forma local. Para copiar el branch modificado al servidor, debemos ejecutar un push.

Ambas acciones son las que realizaremos a continuación para copiar y generar nuestro primer branch ( que es el proyecto base ) en nuestro server github.

Hacemos click derecho sobre el proyecto->Team->Commit, debemos escribir un mensaje que describa qué cambios se aplicaron, y seleccionar los archivos del proyecto.


Luego presionamos "Commit"

Notaremos que a la derecha de nuestro proyecto, aparecerá la palabra "master" y si navegamos la ventana de git, dentro del proyecto, en branches->local nos aparece el branch "master".


De este modo creamos el primer branch del repositorio, pero todavía no se encuentra en nuestro server de github, solo en forma local, para subirlo, debemos hacer un push, para ello, click derecho sobre el proyecto->Team->Push branch. Nos aparecerá una ventana en donde podemos elegir el repositorio remoto y cambiar el nombre del branch, presionamos next, finish y OK, y el proyecto comenzará a copiarse al servidor de github. Nuestra primera versión del proyecto ya se encuentra online.

 

Agregando un segundo programador al equipo de desarrollo.

Lo explicado a continuación sera válido para todos los programadores que trabajen en el proyecto, el programador que generó el proyecto base (branch master) ya tendrá su proyecto en forma local, pero un segundo o tercer programador que quiera trabajar, no tiene nada en forma local, de modo que lo primero que se debe hacer es copiar el proyecto que se encuentra en el server git en forma local a su PC, este procedimiento se conoce como clone. Clonar un branch (en este caso el branch master). 

Partiendo de un workspace de Eclipse vacío, debemos hacer lo mismo que hizo el primer programador para conectarse al repositorio: en la lengüeta “git repositories” del Eclipse hacemos click en “clone a git repository", cargamos los mismos datos de github que antes, pero ahora nos aparecerá una ventana (en la que antes nos decía que el repositorio estaba vacío) en donde aparecerá el branch "master". Seleccionamos ese branch, presionamos next y luego finish.

Ahora que el branch master se copió en forma local, debemos importar el proyecto para poder verlo en nuestro Project Explorer, para ello en la lengüeta “git repositories” navegamos “working directory” y hacemos click derecho sobre el proyecto y seleccionamos “import project”.


El proyecto aparecerá en nuestro área de trabajo y ya nos encontramos en las mismas condiciones que el primer programador que generó el branch master.

NOTA: Si un programador se suma al proyecto cuando ya existe una versión más avanzada del mismo, solo debe seleccionar el branch que corresponde a esa versión en vez del primero (master) de esta forma "clona" en forma local esa versión en particular.

Trabajando con branches

Ahora que tenemos dos programadores en el equipo trabajando sobre el mismo proyecto, planteamos el siguiente escenario: cada programador debe agregar una funcionalidad diferente al proyecto, cada uno trabajará en forma local generando un branch en particular, y al terminar ambos, generaremos la versión 2.0 del proyecto.

Tanto el programador 1 como el 2, debe generar un branch a partir del branch master, cada branch tendrá un nombre diferente, por ejemplo el programador 1 generará el "branch1" y el programador 2 generará el "branch2".

Supongamos que somos el programador 1, de modo que hacemos click derecho sobre el proyecto->Team->switch to->new branch. Nos aparecerá una ventana donde nos pregunta el source (partiendo de qué branch queremos generar uno nuevo) en este caso dejamos master porque es el único existente, y luego debemos ingresar el nombre de nuestro nuevo branch "branch1":


Como dejamos tildado "Checkout new branch" automáticamente estaremos parados sobre el nuevo branch, en git, hacer un checkout significa cambiarse de branch y también puede realizarse manualmente en cualquier momento haciendo click derecho sobre el branch al que queremos pasarnos (en nuestra lista de branches locales) y seleccionando "checkout".


Si nos fijamos a la derecha del nombre del proyecto, ahora ya no dice "master" sino "branch1". Ya podemos hacer modificaciones sobre el proyecto y realizar commits cuando se crean convenientes hasta terminar la funcionalidad del branch. Lo mismo deberá hacer el programador 2.

NOTA: No necesariamente cada programador debe trabajar sobre un solo branch, de echo es conveniente separar los branches por funcionalidad mas allá de quién es el que los programa, de este modo podemos tener 2 o 3 programadores trabajando sobre 10 branches diferentes.

Supongamos que realizamos una modificación en el archivo PruebaGit.c y agregamos un mensaje más en el código:


Luego hacemos un commit, al igual que se explicó anteriormente, click derecho sobre el proyecto->Team->Commit. Colocamos un mensaje y presionamos "Commit". 
Hasta aquí el cambio fue aplicado en forma local, para copiar los cambios de este branch al server git, debemos hacer un push. Click derecho sobre el proyecto->Team->push branch. Luego presionamos next,finish y OK.

Generando la versión 2.0 : Merge

Supongamos que tenemos 3 branches generados por diferentes programadores y que ya están en el server git, no es importante quién los genero, pero sabemos que están terminados, cada uno agrega una línea en nuestro archivo PruebaGit.c imprimiendo un mensaje diferente por pantalla.

Ahora estamos en condiciones de generar la versión 2.0 de nuestro proyecto, para ello uno de los programadores deberá realizar el merge del branch master con los branches branch1 branch2 y branch3.

Supongamos que somos el programador que creó el branch1, de modo que solo conocemos el branch "master" y el branch "branch1", si queremos obtener los otros branches que se generaron y que están en el server, debemos ejecutar un pull. Mediante pull obtendremos la lista de los branches que están en el servidor. Click derecho sobre el proyecto->Team->pull. Nos aparecerán los otros dos branches que estaban en el servidor.


Ahora en nuestra lista de "Remote tracking" aparecerán todos los branches que están en el servidor. 

Y en la lista de "Local", solo los que tenemos en forma local, el branch "master" y el branch "branch1". No es necesario tener local los otros branches para poder hacer el merge.

Para hacer el merge, primero debemos crear un nuevo branch que llamaremos "master2.0" y lo haremos tomando como base "branch1" (para no tener que hacer luego el merge entre master y branch1). Para esto hacemos click derecho sobre el proyecto->Team->swicth to->new branch. Ponemos como source el "branch1" y como nombre "master2.0". De esta forma generamos en forma local al branch "master2.0" que tiene el mismo contenido que "branch1".

Ahora haremos merge con el branch2, para ello hacemos click derecho sobre el branch local "master2.0" y seleccionamos merge:



En la ventana que nos aparece, deberemos elegir contra qué branch queremos hacer la mezcla, elegimos "branch2"


Presionamos "Merge"y luego OK. Nos aparecerán en rojo los archivos que tienen conflicto, en este caso, PruebGit.c. Si lo abrimos podremos observar que debemos elegir manualmente las líneas de código que deben quedar en esta nueva versión, ya que ambos branches modificaron el mismo archivo:


Podemos notar que entre los tags de "HEAD" tenemos la línea que originalmente ya estaba en nuestro branch master2.0, mientras que entre "===" y ">>>>" nos aparece la línea incluida por el branch2. De este modo decidimos que las dos líneas deben quedar en la versión 2.0 y solo borramos los tags:
El archivo PruebaGit.c seguirá en rojo. Para aplicar los cambios, hacemos click derecho sobre el archivo->Team->add to index

Luego hacemos un commit indicando que ya se realizó el merge con el branch2. En este caso el mensaje del commit ya estará cargado indicando los cambios realizados por el merge.

Este proceso lo repetimos para el branch3, de modo que al terminar, tendremos el branch master2.0 listo para subir al server, para ello recordar ejecutar un "push branch" como se indicó anteriormente.

Modos de trabajo con GIT

Existen muchas formas de trabajar con git, el post publicado trata del modo Feature Branch Workflow en el cual se genera un branch dedicado para cada funcionalidad que se quiere agregar al proyecto, pero también es válido el modo Centralized Workflow en el cual existe un repositorio centralizado al estilo SVN.

Bibliografía:


No hay comentarios:

Publicar un comentario en la entrada