Curso de programación

Clase 13 : Git

Introducción a Git

¿Qué es GIT?

Git es un software para control de versiones (VCS del inglés Version control system) diseñado por Linus Torvalds y es de código abierto.

¿Qué es el control de versiones?

El control de versiones se refiere al proceso de guardar diferentes versiones a lo largo de las etapas de un proyecto. No solo versiones completas, si no cambios en el código fuente.

Con el control de versiones podemos, en cualquier momento, volver a una versión anterior cuando queramos.

¿Es lo mismo que Github?

¡NO! Github es una plataforma para almacenar repositorios remotos de git. Hay muchas otras alternativas a GitHub siendo la mas relevante hoy en día GitLab.

¿Para qué sirve Git?

Imaginemos que estamos en un equipo de desarrollo de software de muchas personas trabajando sobre el mismo software. ¿Se imaginan compartir el código entre todos?.

Por ejemplo, si alguien abre un archivo en modo escritura, ninguna otra persona podría acceder con permisos de escritura. No habría seguimiento de cambios que hizo cada desarrollador.

    Un sistema de control de versiones nos permite:
  • Tener historial de los cambios
  • Almacenar el código
  • Trabajar en equipo
  • Nos permite rastrear errores

Hoy en día, el software de control de versiones mas popular es Git. Y es de suma importancia para los desarrolladores comprender su funcionamiento.

Arquitectura de Git

Git, que presenta una arquitectura distribuida (o descentralizada). En lugar de tener un único espacio para todo el historial de versiones del software (arquitectura centralizada), como sucede de manera habitual en los sistemas de control de versiones, como CVS o Subversion, en Git, la copia de trabajo del código de cada desarrollador es también un repositorio Es decir, cada desarrollador tendrá una copia del repositorio completo en su estación de trabajo.

Arquitectura de Git

La arquitectura distribuida presenta una ventaja, ya que si el servidor donde está alojado nuestro código por alguna razón llega a no estar disponible por un momento, podemos seguir trabajando al tener una copia en nuestra estación de trabajo.

Caso contrario, en una arquitectura centralizada NO podremos no solamente acceder a los nuevos cambios que introdujeron los otros desarrolladores, sino tampoco a nuestro código donde estábamos trabajando.

Otra ventaja es que en Git casi todas las operaciones son locales. Reduciendo el tráfico de la red.

¿Preguntas?

Definiendo Conceptos I

Definiendo conceptos I

  • Repositorio: Un repositorio es un lugar donde Git almacena y gestiona tus archivos y su historial. Puede ser local (en tu computadora) o remoto (en un servidor en línea).
  • Commit: Un commit es un "punto de control" en la historia de tu proyecto. Representa un conjunto de cambios realizados en tus archivos. Cada commit tiene un mensaje que describe los cambios que se realizaron.
  • Branch: Una rama es una línea de desarrollo independiente dentro de un repositorio. Puedes crear ramas para trabajar en nuevas características o solucionar problemas sin afectar la rama principal, llamada generalmente "master" o "main"
  • Merge (fusionar): Cuando dos ramas de desarrollo se combinan, se realiza una fusión (merge). Los cambios de una rama se integran en otra. Por lo general, esto se hace para incorporar nuevas características o correcciones en la rama principal.
  • Head: Se refiere al commit en el que estamos posicionado en cada momento. Por regla general HEAD suele coincidir con el último commit de la rama en la que estés, ya que habitualmente estás trabajando en lo último. Pero es posible movernos en el tiempo a otro commit, entonces el HEAD apuntará a otro commit.

Como se trabaja en Git

Commits

  • Cada círculo es un commit. (c1), (c2), etc...
  • Es posible volver a cada commit y ver el historial de cambios

Como se trabaja en Git

Commits

  • Cada círculo es un commit. (c1), (c2), etc...
  • Es posible volver a cada commit y ver el historial de cambios

Como se trabaja en Git

Commits

  • Cada círculo es un commit. (c1), (c2), etc...
  • Es posible volver a cada commit y ver el historial de cambios

Como se trabaja en Git

Commits

  • Cada círculo es un commit. (c1), (c2), etc...
  • Es posible volver a cada commit y ver el historial de cambios

Como se trabaja en Git

Commits

  • Para usar git es necesario utilizar comandos de consola o interface gráfica
  • El comando utilizado para crear un commit es:
    git commit -m "Mensaje de cambios"

Aprender Git

Como se trabaja en Git

Usando branchs

  • Hay dos branchs: main y new_feature
  • Merge de commit: En c3 se hizo un merge de new_feature con main.
    • *c3 = c1.2 + c2

Como se trabaja en Git

  • Hay tres branchs: main, new_feature y bug_fix
  • Merge de commits:
    • c2 = c1 + c1.a
    • c3= c2 + c1.2

Como se trabaja en Git

  • Es posible que otro branch sobrepase al main, de hecho la mayoría de veces algún branch está por delante del main
  • La rama main se usa para un código de producción o que es estable. En el resto de las ramas pueden ser pruebas, versiones de desarrollo o nuevas características (features).
  • Las nuevas características por lo general son branchs que parten de una rama de desarrollo.

Repaso de conceptos

  • Repositorio: Un lugar donde se almacenan cosas, en nuestro caso, código de programación.
  • Commit: Una instantánea (como una "foto") de nuestro código en un momento dado. Los commits tienen un comentario y es posible hacer un registro de cambios.
  • Merge (fusión): Es una fusión entre dos ramas o branchs.
  • Branch o rama: Es una bifurcación y va en paralelo a las demás ramas. Las ramas pueden "mergearse" o mezclarse para sumar los cambios realizados.
  • main: Es el nombre que se le conoce a la rama principal. Anteriormente llamada "master". Por lo general esta rama debe mantenerse limpia y el código que está en el main debe ser funcional.
  • Head: Es el commit donde estamos parados en un momento determinado. Recordar que es posible moverse entre ramas y anteriores commits.

Existen muchos mas conceptos asociados a Git. Estos son los conceptos mas básicos.

¿Preguntas?

Definiendo Conceptos II

Definiendo conceptos II

  • Clonar: Clonar un repositorio significa copiar todo el historial y los archivos de un repositorio remoto a tu máquina local. Esto te permite trabajar en el proyecto de forma aislada y tener una copia local.
  • Etiquetas (tags): Las etiquetas se utilizan para marcar puntos específicos en la historia del repositorio, generalmente versiones estables del software.
  • Pull: Cuando obtienes los cambios de un repositorio remoto y los mezclas con tu repositorio local, se llama "pull". Es común hacer esto para mantener tu copia local actualizada con los cambios realizados por otros colaboradores.
  • Push: Subir tus cambios locales a un repositorio remoto se llama "push". Esto permite que otros colaboradores vean tus cambios y colaboren con nosotros.

Definiendo conceptos II

  • Estado (status): Es el estado de tu repositorio en cualquier momento. Se consulta para ver qué archivos se han modificado, cuáles están pendientes de confirmación y otros detalles.
  • Historial (log): Es el historial de cambios realizados en tu repositorio, incluyendo quién hizo qué cambios y cuándo se hicieron.
  • Hash: Un hash es una función que dada una entrada de información, devuelve una cadena de longitud fija. Es altamente usado para realizar verificaciones de integridad de la información y así comprobar que la misma no se haya corrompido. Los commits se identifican con un hash.

Cada uno de los conceptos citados tiene una forma de consultarlos. Por lo general es con comandos de git o mediante herramientas gráficas.

Comandos básicos

Agregar archivos para un commit


                        git add archivo.txt # Agrega un archivo en particular
                        git add * # Agrega todos los archivos
                    

Realizar un commit


                        git commit -m "Descripción del commit"
                    

Estos son los comandos que mas va a utilizar. Puede practicar en Learn Git Branch. Tenga en cuenta que para simplificar, en dicha página no hace falta hacer git add ni tampoco agregar un comentario al commit.

Comandos básicos

Crear un branch


                        git branch branch1 # Crea un nuevo branch
                        git checkout branch2 # Crea un nuevo branch o cambia a existente
                        git checkout -b branch3 # Crea un nuevo branch y cambia el HEAD
                    

Cambiar a un branch o commit


                        git switch branch1 # Cambia el HEAD al último commit de branch1
                        git checkout branch1 # Cambia el HEAD al último commit de branch1

                        git switch a123dd # Cambia al commit hash a123dd
                        git checkout a123dd # Cambia al commit con hash a123dd
                    

En Learn Git Branch algunos comandos pueden no funcionar como git checkout -b pero el resto es completamente funcional.

Comandos básicos

Hacer un merge


                        git switch main # Cambio al branch main
                        git merge develop # Fusiono desde develop a main
                    

Conflictos (Conflict): Los conflictos ocurren cuando dos ramas tienen cambios conflictivos en el mismo lugar del archivo. Debes resolver estos conflictos manualmente antes de fusionar las ramas.

Resumen

Git es una herramienta poderosa para el control de versiones que te permite colaborar en proyectos, realizar un seguimiento de cambios y mantener un historial detallado de tu trabajo.

Existen herramientas gráficas para ayudarnos a usar Git como GitHub Desktop (MIT), Git Kraken (Privativo), Git Graph (Extensión para VsCode)(License). Mas clientes GUI para Git.

Hoy en día es indispensable para cualquier desarrollador de software tener conocimientos de Git ya que es hoy por hoy la herramienta mas usada para versionar código a nivel mundial.

¿Preguntas?

Ejercicio en clase

Ejercicio en clase

Desde el sitio LearnGitBranching realizar lo siguiente:

  • Desde el branch main crear un nuevo branch llamado bugFix
  • Hacer un commit en bugFix
  • Volver al branch main y hacer otro commit
  • Mergear bugFix a main