Arquitectura de Git | Curso de Git (clase 3)

39

En la anterior clase sobre cómo Instalar Git, revisamos la instalación de Git en los 3 sistemas operativos más utilizados en la actualidad: Linux, Windows y OS X. Además, validamos nuestra instalación y configuramos la herramienta.

Antes de continuar con el uso de los comandos, me gustaría que revisemos la arquitectura de Git, en orden de entender cómo funciona internamente y cuál es la filosofía detrás del sistema de gestión de versiones que ha enamorado a la industria. En esta clase revisaremos un poco de la arquitectura de Git.

Generalidades

Uno de los objetivos de Git es empoderar a los equipos de desarrollo en cuanto a la flexibilidad con la que trabajan, así como darles la capacidad de regresar a diferentes momentos del proyecto en el tiempo de forma casi transparente. Para ello, implementa una arquitectura que permite los espacios de trabajo distribuidos, fomenta la colaboración y la entrega continua. La arquitectura de Git puede definirse de la forma más simple mediante la figura 1, misma que se explicará en las siguientes secciones de esta clase.

Fuente: http://ds.cs.ut.ee/courses/previous/seminar-materials/git-vcs.pdf

Índices

A diferencia de muchos de los sistemas de control de versiones, Git no guarda la carpeta de código fuente como tal, para gestionar el proyecto. En lugar de ello, Git cuenta con un sistema de índices que mediante nombres y rutas de archivos le permite identificar los cambios en cada uno de los archivos, el momento en que los cambios fueron realizados y el usuario que los realizó. Esta capacidad permite ir atrás y adelante en los momentos del tiempo del proyecto con mucha facilidad.

Base de datos de objetos

Esta base de datos, guarda una referencia a los objetos comprimidos del repositorio. Git cuenta con 4 tipos de objetos, con los cuales se construye cualquier repositorio, mismos que tienen tipo, peso y contenido:

  • Árbol.- representa contenido en el directorio que puede estar ligado a otro árbol o blob.
  • Blob.- representa un archivo guardado en el repositorio.
  • Commit.- apunta a un árbol un nivel inicial que representa el estado del código fuente en ese momento.
  • Tag.- un tag apunta a un commit específico de la historia del repositorio. Representa un momento importante en el proyecto.

Los objetos descritos puedes apreciarse en la siguiente figura:

Fuente: http://www.aosabook.org/en/git.html

Compresión

Git comprime la información en archivos empaquetados para optimizar la forma en la que guarda su información y así optimizar el espacio en disco ocupado. Estos archivos son referenciados mediante los índices de la base de datos de objetos, de tal modo que Git puede buscar la información de forma eficiente, cuando se requiere.

Commits

Un commit de Git es un comando que le indica al repositorio guardar el estado actual del proyecto en el repositorio local. Esta funcionalidad permite a los desarrolladores avanzar en sus asignaciones de forma segura y contar con un registro de ello. Los commits realizados pueden ser publicados en un repositorio remoto para que estén visibles al resto del equipo y se integren con el código de los demás desarrolladores.

Branches (ramas)

Las branches, o en español ramas, son una funcionalidad de Git que le permite a los desarrolladores trabajar sobre líneas independientes de desarrollo en las modificaciones al proyecto sin afectar a la rama principal, en la cual se integra el trabajo de todo el equipo.

El objetivo de la ramificación es unir las modificaciones realizadas una vez que se consideren estables en una sola rama, asegurando que no se afectarán las ramas trabajadas anteriormente, mientras se desarrolla. Además, se tendrá una historia muy puntual de los cambios realizados por cada desarrollador.

Fuente: https://git-scm.com/book/en/v2/Git-Branching-Basic-Branching-and-Merging

Merge

Como se menciona en el punto anterior, el objetivo de la ramificación es trabajar en líneas dependientes de desarrollo sin afectar al resto de las ramas estables con el objetivo de fusionarlas cuando las modificaciones estén listas. A este proceso se le llama merge ó en español fusión y permite unir los cambios realizados en una rama dentro de otra.

Existen dos tipos diferentes de merge. En el primero, la herramienta (Git) realizará la fusión de los cambios de forma independiente. Esta sucede cuanto no existen conflictos en el código. En el segundo, el desarrollador tendrá que elegir de forma manual los cambios que deben quedarse cuando existan conflictos en el código.

Flujo de trabajo en Git

El flujo de trabajo en Git, está diseñado para permitir a equipos de trabajo no solo administrar sus versiones de código fuente sino también administrar la colaboración en el proyecto. A continuación se abarcan la descripción de algunas de las funcionalidades y prestaciones de la herramienta, más importantes.

Área de ensayo

Todo repositorio local de Git, cuenta con un área de ensayo en la cual todos los cambios realizados serán guardados, aún sin realizar un commit al repositorio local. Esta área permite a los desarrolladores trabajar en sus asignaciones de forma independiente y asegura la integridad de la información guardada en los repositorios del equipo.

Áreas de trabajo distribuidas

Git permite el trabajo en repositorios distribuido, funcionalidad que le da la habilidad a cada uno de los desarrolladores de tener un repositorio público en el cual podrá publicar los cambios realizados derivados de sus asignaciones. A partir de los repositorios públicos de cada desarrollador, el manejador de integración, unirá las modificaciones en cada uno de ellos y lo publicará en un repositorio global del equipo.

Fuente: https://git-scm.com/book/en/v2/Distributed-Git-Distributed-Workflows

Hooks

Los hooks son scripts que viven dentro del repositorio y se ejecutan automáticamente cuando sucede un evento relevante de Git, como un commit o un push, por ejemplo. Los hooks se pueden editar para que tengan la funcionalidad que esperamos, de acuerdo a las necesidades del equipo. En ocasiones, son utilizados para la distribución a servidores y operaciones de desarrollo.

Servidores remotos

Un servidor remoto de Git, es un repositorio público que le permite al equipo de desarrollo integrar los cambios realizados en el código. No obstante muchos de los proveedores de este servicio en la nube, agregan funcionalidades que facilitan la administración del proyecto en cuanto a asignaciones, historias de usuario, administración de backlog, tiempos y objetivos.


Si quieres conocer más sobre este tema para entender Git aún más a fondo, sigue los enlaces externos:

En la próxima clase, revisaremos los comandos en terminal que ofrece Git.

Comments

comments