Empezar con Git

¿Qué es un software de control de versiones?

Un sistema de control de versiones es un programa de software que monitorea todos los cambios que se realizan dentro de un sistema de archivos, también conocido como repositorio. Todo ello con el objetivo de poder mantener copias de seguridad a las que, en caso de pérdida del programa, poder recurrir sin ningún tipo de problema. En caso de querer recuperar una versión anterior del programa bastará con cargar una de estas copias de seguridad.

Gracias al uso de un VCS como Git podemos no solo volver a una versión anterior de nuestros archivos, sino que también vamos a poder comparar todos los cambios que se han realizado sobre estos archivos. A la hora de desarrollar proyectos esto nos será de gran utilidad, dado que cualquier cambio que produzca un crash en el programa podrá ser corregido inmediatamente, ya sea o bien volviendo a una versión anterior del programa o bien comparando los cambios realizados con respecto de la versión seleccionada.

Método tradicional vs Git

Por norma general, cuando una persona que desconoce Git quiere realizar una copia de seguridad de un archivo suele hacer un copia/pega de dicho archivo. Así, en caso de crash del programa, bastará con eliminar el archivo estropeado y seguir utilizando la copia previamente realizada (aunque antes se ha de volver a hacer una nueva copia de este archivo). Sin embargo, esta técnica de creación de archivos temporales suele tener una serie de inconvenientes como el hecho de eliminar estos archivos por accidente. Dado que serán archivos que no vayamos a usar con mucha frecuencia, puede darse el caso de que en un momento dado pensemos que cierto archivo no sirve para nada cuando en realidad se trata de una importante copia de un programa que queríamos mantener. De este modo, será imposible poder recuperar el archivo eliminado.

No obstante, este problema se soluciona mediante el uso de Git. Con Git nunca se crea un archivo temporal dentro de nuestro sistema de archivos, por lo que no habrá que preocuparse de borrar archivos importantes como copias de seguridad. En su lugar, Git se encargará de almacenar todas las versiones de nuestro proyecto en su propio servidor, para que en caso de querer recuperar una de las versiones de nuestro proyecto, solo tengamos que realizar una solicitud a dicho servidor. Mientras que el repositorio no se borre intencionadamente del servidor, no habrá manera de perder nuestro proyecto.

Por otra parte, habrá ocasiones en las que un proyecto necesite ser elaborado por varios desarrolladores. Para proyectos grandes es muy difícil conseguir que todos los colaboradores del proyecto sean capaces de reunirse en un mismo sitio y a una misma hora. Es aquí donde entra en juego otra de las cualidades de Git, el cual nos va a permitir trabajar en remoto con personas de todo el mundo, dado que todas estas personas van a poder conectarse al repositorio del proyecto. Para conseguir esto, se hace necesario el uso de un servidor centralizado capaz de servir el repositorio a todo aquel colaborador que lo solicite. Gracias al uso de este servidor central todo el mundo podrá colaborar en el mismo proyecto.

No obstante, hay un problema con el hecho de trabajar con un servidor central. Al depender de un servidor central, un VCS estará expuesto en todo momento a que el servidor se colapse, suponiendo la pérdida completa del proyecto. Al no haber repositorio sobre el que trabajar, habrá que empezar todo el proyecto de nuevo. Sin embargo, es aquí donde Git vuelve a proporcionar una funcionalidad muy potente. Con Git, en lugar de trabajar directamente sobre el servidor central, el desarrollador hace una copia de todo el proyecto dentro de su sistema, de modo que pasa a tener un repositorio local. Ahora, todos los cambios que realice sobre el repositorio local solo serán visibles por él. Una vez comprobado que los cambios realizados no estropean o dañan el proyecto, se encargará de cargar esos cambios en el repositorio remoto, pasando a estar disponible para todos los demás desarrolladores. De este modo, en caso de que el servidor central se colapse no habrá riesgo de pérdida, ya que como cada desarrollador tiene una copia completa del proyecto bastará con que uno solo suba de nuevo el proyecto al servidor central.

El ser capaz de tener una copia total del proyecto no solo da una mayor seguridad al desarrollador, sino que también le permite poder acceder al historial de cambios sin necesidad de estar conectado al servidor central. Únicamente deberá conectarse al servidor cuando quiera actualizar su repositorio local (para cargar el cambio realizado por alguno de sus compañeros) o cuando quiera subir sus cambios al repositorio remoto (permitiendo al resto del equipo poder trabajar a partir de los cambios que este ha realizado).

Por tanto, podemos observar claramente cómo Git nos ayuda tanto a proteger nuestro proyecto de pérdidas inesperadas, como a trabajar simultáneamente con personas de cualquier parte del mundo.

Historia de Git

De acuerdo con el propio manual que nos encontramos en la página oficial de Git, la creación de Git está directamente relacionada con el desarrollo del Sistema Operativo Linux. El kernel de Linux formaba parte de un proyecto muy complejo que desde 1991 necesitaba constantemente de la modificación de archivos y de la creación de parches para mejorar el funcionamiento y rendimiento del mismo.

En 2002, la comunidad de desarrollo del kernel de Linux decide empezar a emplear el sistema de control de versiones BitKeeper para poder organizar mejor el desarrollo del proyecto. Sin embargo, la relación entre la comunidad y la empresa se fue deteriorando con el tiempo, lo que llevó a la comunidad de desarrollo del kernel de Linux a crear su propio sistema de control de versiones (VCS). Para ello, tomaron todo lo que habían aprendido utilizando BitKeeper y lo implementaron para crear Git, un sistema cuyos objetivos principales fueron:

  • Velocidad
  • Diseño sencillo
  • Capaz de soportar proyecto complejos
  • Capaz de soportar programación no lineal (cada desarrollador trabaja en su propia rama)

¿Qué es Git?

Forma de trabajar de Git

Pese a que Git es un software de control de versiones, presenta formas de trabajar muy diferentes a como suele hacerse con cualquier VCS convencional. Una de estas grandes diferencias se encuentra en el modo que tiene Git de guardar el repositorio del proyecto dentro del historial. Con un VCS convencional, cada vez que se guarda una versión del proyecto, únicamente se hace una copia de los archivos que han sido modificados dentro del repositorio con respecto de su versión anterior. De este modo, se trabaja centrándose en cada archivo de forma individual sin tener en cuenta el conjunto del proyecto. Así, cada nueva versión únicamente va a contener una copia de los archivos modificados.

Por el contrario, Git no trabaja guardando solamente copias de los archivos que han sido modificados. En su lugar, Git guarda una copia completa del proyecto que incluye todos los archivos que conforman el repositorio de trabajo, independientemente de si todos los archivos han sido modificados o no. No obstante, con el fin de conseguir una mayor eficiencia, si el archivo que se quiere guardar no ha sido modificado, en lugar de hacer una copia de este, se crea una referencia al archivo de su versión anterior. De este modo, no se estará consumiendo espacio de forma innecesaria. Al trabajar de esta manera, cada versión va a tener una copia completa del proyecto.

Trabajar con el repositorio local

Toda operación que quiera realizarse en Git, salvo actualizar el repositorio local o interactuar con el repositorio remoto, puede realizarse sin necesidad de conectarse al servidor central. Incluso si se quiere acceder al historial de cambios, no será necesario tener acceso al servidor. Cuando un desarrollador clona el proyecto en su ordenador, Git crea una copia total del proyecto en su máquina local, por lo que este podrá realizar todo tipo de operaciones con Git sin necesitar de ninguna conexión. Esto permitirá al desarrollador poder trabajar en el proyecto cuando no tenga opción de conectarse a Internet. Del mismo modo, el hecho de no tener que conectarse con el servidor remoto permite que las operaciones se realicen de forma casi instantánea.

Integridad en Git

Para poder mantener el historial de cambios 100% funcional y evitar cualquier tipo de pérdida, toda la información recogida en nuestro proyecto es manejada por Git. Para ello, cada vez que hacemos un commit (subir nuestro proyecto al servidor remoto) de nuestro proyecto, antes de que este pase a formar parte del historial se le asigna un identificador, conocido como hash. Ahora, cuando otro desarrollador quiera acceder a esta versión en concreto deberá hacerlo especificando el identificador que le ha sido asignado. Así, todo cambio realizado dentro de nuestro repositorio tendrá siempre asociado un hash para poder  ser diferenciado del resto de cambios.

Los 3 estados de Git

Para que nuestro proyecto sea almacenado correctamente en Git, este debe pasar por tres etapas: modificado, preparado y cargado.

  • Modificado implica que los cambios han sido realizados en el repositorio local pero todavía no han sido almacenados en la base de datos de Git, por lo que nadie más del equipo puede acceder a estos cambios.
  • Preparado implica que el proyecto ha sido analizado para ser añadido a la base de datos de Git y poder así actualizar el repositorio remoto. En esta fase el resto de desarrolladores todavía no puede acceder a los cambios realizados. Esta etapa permite al desarrollador elegir los cambios que quiere cargar en el servidor remoto, ya que puede darse el caso de que solamente quiera actualizar algunos de los archivos que han sido modificados.
  • Cargado es la tercera fase, en la cual la nueva información es añadida de forma segura a la base de datos de Git y ya no solo forma parte del repositorio local del desarrollador. A partir de este punto, los nuevos cambios estarán disponibles para el resto de integrantes del equipo.

Instalación / Configuración de Git

Dado que la instalación de Git puede variar en función del tipo de OS que estés utilizando, he preferido dejar un enlace sobre el proceso de instalación de Git a su propia página web. En esta página se explica paso a paso cómo proceder a la instalación del sistema de control de versiones Git, teniendo en cuenta el uso de diferentes sistemas operativos. Todo el proceso de instalación se lleva a cabo desde la propia terminal y utilizando la línea de comandos. Todos los ejemplos dados en este curso se harán por medio de la terminal dado que es donde podemos obtener todas las ventajas que nos ofrece Git. Si en lugar de utilizar una CLI utilizásemos una GUI (Graphical User Interface), no podríamos explotar todas las características de Git que se abordarán en este curso.

git config

Una vez instalado Git lo primero que debes conocer es el comando git config. Con git config vas a poder leer, modificar o crear los parámetros de configuración que Git va a usar por defecto. Esto incluye cambiar el nombre de usuario asociado a tu Git, mostrar una lista con los parámetros de configuración establecidos, mostrar la ruta de los parámetros de configuración, etc.

git config –list

Muestra un listado de los parámetros de configuración establecidos a la hora de utilizar Git. Si añadimos el flag –show-origin, obtenemos la ubicación de estos parámetros.

git config –global user.name «pgomez-a»

Para modificar el valor de un parámetro de configuración o incluso crear un nuevo parámetro de configuración utilizamos este comando. De este modo le estamos indicando el nombre del parámetro de configuración y su valor correspondiente, siendo en este caso el nombre de usuario utilizado a la hora de trabajar en un repositorio de Git. La etiqueta –global sirve para darle un ámbito global, es decir, por defecto se va a trabajar con ese nombre de usuario en todos los repositorios de Git. Si no quisiéramos darle un ámbito global, eliminaríamos la etiqueta –global y ejecutaríamos el mismo comando dentro del proyecto en el que sí quisiéramos cambiar el nombre de usuario. Si en lugar de cambiar el nombre de usuario se quiere cambiar el email, se utiliza user.email.

git config –global init.defaultBranch main

Con git init se crea un repositorio de Git en el cual ubicaremos nuestro proyecto. Dado que Git trabaja con ramas, este comando creará una rama principal que por defecto se va a llamar master. Si quisiéramos cambiar el nombre de esta rama a main, deberíamos utilizar el comando especificado en el encabezado anterior. Con este comando estamos utilizando nuevamente un ámbito global, por lo que se aplicará al resto de proyectos que vayamos a crear.

git config user.name

Antes hemos visto que con git config –list obtenemos un listado de todos los parámetros de configuración presentes en Git. Si en lugar de listar todos estos parámetros queremos obtener el valor de uno solo de ellos, bastará con escribir git config más el nombre del parámetro correspondiente.

Git help

Git es un programa muy extenso capaz de utilizar una gran cantidad de comandos. Por ello, pese a que conozcamos en profundidad el funcionamiento de Git, habrá ocasiones en las que no nos acordemos de cómo realizar una tarea determinada. Para evitar quedarnos atascados en situaciones como estas, Git nos proporciona su propio manual de ayuda desde la propia terminal. Así, en caso de querer obtener ayuda sobre algún comando en concreto, tendremos hasta tres maneras diferentes de poder acceder a este manual de ayuda:

  • git help <key>
  • git <key> –help
  • man git-<key>

Lo más interesante de todo es que no necesitaremos estar conectados a Internet para poder acceder a los manuales de ayuda. Todos los manuales están presentes dentro del sistema, por lo que podemos acceder a ellos de forma completamente offline.

Resuelve tus dudas concepto a concepto

Documentación externa

Pro Git Book

Libro oficia de Git escrito por Scott Chacon y Ben Straub disponible de forma gratuita en la página oficial de Git. Este curso se basa en el contenido presente en este libro.

Manual Referencia

Manual oficial de Git para entender y estudiar los diferentes conceptos y comandos que podemos utilizar dentro de Git. Explicación paso a paso sobre cada término.

Videos de Git

Videos explicativos sobre qué es Git, qué es un sistema de control de versiones, cómo utilizar Git, etc. Los videos están disponibles desde la página oficial de Git.

Inspiración

Solo podemos ver poco del futuro, pero lo suficiente para darnos cuenta de que hay mucho que hacer.

Alan Turing

Todo individuo considera que los límites de su propia visión son los límites del mundo.

Arthur Schopenhauer

Contacto

pgomez-a@student.42madrid.com

GitHub: pgomez-a
Linkedin: pgomez-a

Anuncio publicitario
A %d blogueros les gusta esto: