GIT

GIT es un sistema de control de versiones diseñado y desarrollado por Linus Torvalds para el desarrollo del núcleo Linux. Es una herramienta de software libre, y partió de la necesidad de poder gestionar el trabajo de todos los desarrolladores que participaban en el desarrollo de Linux.

Con GIT trabajamos con el concepto de ramas o «branches», lo que hace que podamos trabajar en diferentes versiones del código sin tocar el principal.

Con GIT podemos trabajar directamente desde la consola de comandos, aunque existen herramientas gráficas como Egit en Eclipse.

Las ventajas de un sistema como GIT frente a otro centralizado son:

  • GIT es un software libre bajo la licencia de código abierto GPL. Por lo que además de ser gratuito podemos modificarlo fuese necesario.
  • GIT no es centralizado, por lo que no tenemos la necesidad de interactuar con un servidor para cada cambio.
  • Al ser un sistema descentralizado cada cliente es una copia del servidor, por lo que es muy difícil perder todos los datos.
  • GIT utiliza una criptográfica (SHA1) para nombrar e identificar objetos por lo que aporta seguridad.
  • La gestión de ramas en un servidor GIT es muy rápida y sencilla, al ser incremental no copia todo, si no solo los cambios.

Componentes y funciones de GIT

En un sistema de control de versiones GIT podemos identificar los siguientes elementos:

Local repository:  Cada programador tiene su propio repositorio versionado, donde puede ir almacenando sus cambios, además de crear ramas o descargar versiones del repositorio remoto. Esto aporta una gran ventaja frente a otros sistemas centralizados.

Workspace: El directorio de trabajo es el lugar  donde el programador puede realizar cambios. Con GIT el desarrollador puede elegir que archivos quiere marcar para ser subidos al repositorio o subir todo el proyecto.

Esta información es almacenada en el «stage index», de modo que al realizar un commit solo se tendrán en cuanta los archivos listados en dicho index.

Staging index:  Área donde se controlan los cambios. Aquí se almacenan los cambios en el árbol de trabajo  antes de la confirmación.

Repositorio remoto: Siendo un sistema distribuido, este es otro repositorio. Aquí podemos guardar cualquiera de las ramas o la última. Un ejemplo de uso podría ser GitHub.

Commits:  Sirven para mantener el estado del repositorio. Se nombran con un  id codificado con la función hash SHA1. Cada vez que realizamos un commit estamos creando una versión en el repositorio.

Branches: Las ramas o “branch” son veriones que se crean en paralelo. A partir de una rama podemos ir generando nuevas versiones o nuevas ramas sin que afecten al hotorico de la principal.  Cada rama se referencia con un “HEAD”, que enlaza con el último “commit” en la rama.

Tags: Cada “tag” es un nombre o alias que le damos a una versión, dado que GIT nombra las versiones con un código numérico, resulta útil poder etiquetar algunas de las versiones a las que podemos acceder con regularidad.

En el siguiente gráfico podemos ver el funcionamiento de GIT con las funciones asociadas a cada proceso.

En el gráfico vemos como diferenciamos los diferentes lugares donde actúa GIT para ir guardando la información de las versiones.

En el entornos de desarrollo o worskspace, es donde esta el código que se esta desarrollando. Desde este entorno listamos los archivos en el index, para que se pasen al repositorio local.

En el repositorio local, podemos tener varias versiones de nuestro proyecto y decidiremos cúal subir al repositorio remoto, que ya estará en el server y podrán acceder otros programadores que estén trabajando en el proyecto.

Para ejecutar estos cambios entre los diferentes estados, GIT proporciona una serie de funciones, a continuación nombramos las mas usuales:

Add: Añade archivos al índice sin producir el commit. Podemos ir añadiendo diferentes documentos mientras realizamos nuestro desarrollo, que se subirán cuando realicemos el commit.

Commit: Realiza el guardado de la versión en el repositorio.  Una de las opciones del commit es poner un nombre a la versión almacenada, así como una descripción del trabajo realizado.

Push: Copiar los cambios de una instancia del repositorio local a uno remoto. Sirve para almacenar los cambios de forma definitiva en el repositorio GIT.

Pull: Copiar los cambios de una instancia del repositorio remoto a uno local.

Checkout: Copia en nuestro espacio de trabajo una versión elegida del repositorio.

HEAD: (Checkout HEAD): Cuando realizamos un checkout, la indicación HEAD se refiere al último commit realizado.

Diff HEAD: Muestra los cambios entre una versión indicada y la versión en la que nos encontramos actualmente.

Diff: Podemos comparar las versiones indicando sus índices almacenados en el repositorio.