¿Qué es GitHub y cómo utilizarlo?
Si te dedicas al desarrollo web, aunque sea de modo ocasional, seguro que has oído hablar de GitHub o habrás caído en su página web alguna vez por ahí cuando consultas algún proyecto de código abierto. Habrás visto algún botón invitando a hacer un fork o enviar un pull request. ¿Es así? ¿Aún tienes dudas sobre qué significa todo eso? Pues por fin te las vamos a despejar en este post.
¿Qué es GitHub y por qué es tan importante en el desarrollo de software?
GitHub es un sitio web de alojamiento de repositorios remotos gestionados por Git. Quizás si te lo describimos de esta manera, un poco técnica, no despeje todavía tus dudas. Así que vamos por partes.
Qué es Git
Antes de entender GitHub necesitas saber lo que es Git. Git no es más que un software que permite controlar las versiones de otros proyectos de software. Git es extremadamente importante porque nos permite saber en todo momento cómo han ido evolucionando los archivos de código de un proyecto. Es esencial para saber qué cosas se cambiaron en cada actualización del código, lo que aporta mucha información a la hora de revisar los proyectos. Git también nos ofrece mucha tranquilidad cuando editamos el código, ya que sabemos que podemos volver hacia atrás siempre que sea necesario.
Adicionalmente, Git es una herramienta indispensable para poder trabajar de manera colaborativa en los proyectos de software, ya que cada componente del equipo puede aportar código sin temor a machacar los cambios realizados por otras personas. A la vez, permite obtener de manera sencilla las actualizaciones que han realizado sobre el código cualquiera de los componentes del equipo de desarrollo.
Qué es GitHub en relación a Git
Ahora que has conseguido entender qué es Git, será muy sencillo comprender la función que hace GitHub en la gestión de los proyectos de software. GitHub no es más que un servicio de alojamiento de proyectos gestionados por Git. Permite tener una copia del proyecto en la nube, de modo que cualquiera de los componentes del equipo de desarrollo pueda enviar cambios al repositorio remoto o sincronizarse con los cambios enviados por otros desarrolladores a él.
La importancia de GitHub en el desarrollo de software radica en su capacidad para hacer que los equipos de trabajo puedan colaborar en los proyectos y realizar una gran cantidad de acciones de gestión que vamos a describir a continuación.
Funciones principales de GitHub
Bajo el sencillo concepto de Hosting de repositorios Git, existen toda una serie de servicios adicionales ofrecidos por GitHub para la gestión de los proyectos.
Repositorios para creación y gestión de proyectos
La función principal de GitHub consiste en el alojamiento de repositorios y la gestión de los mismos. Los repositorios de software nos permiten llevar las versiones de cada uno de los archivos de código de los proyectos y gestionar muchas de sus facetas. Los repositorios Git pueden ser públicos o privados. El software libre generalmente tiene repositorios públicos y cualquier persona puede acceder al código de esos proyectos. Por su parte las empresas utilizan repositorios privados para mantener y gestionar el código propietario.
Colaboración para control de versiones y trabajo en equipo
Entre las gestiones que podemos realizar mediante GitHub encontramos muchas funcionalidades dedicadas a la colaboración entre programadores. Existen muchas herramientas dadas por el ecosistema de Git, como los forks (bifurcaciones) y las ramas (branches) que nos permiten gestionar el código de una manera eficiente. Gracias a estas herramientas se pueden desarrollar numerosos aspectos o funcionalidades de los proyectos sin interferir en el trabajo de otras personas. Esa misma organización también nos permite verificar los estados de código antes de incorporarlos al proyecto en su rama principal.
Seguimiento de problemas y solicitudes de extracción (Pull Requests)
Una de las ventajas de Git es la posibilidad de realizar seguimiento a los problemas de código, verificando cuáles son los cambios que se realizaron en los archivos, quién los realizó y para qué se alteraron. En este contexto, otra de las funcionalidades que nos aporta GitHub consiste en la realización de solicitudes de extracción, que todo el mundo conoce con la denominación de «pull requests». Esta operativa permite sugerir cambios en proyectos de software libre, aunque no tengamos ninguna relación con el equipo de desarrollo de ese proyecto. También se suele usar para el código propietario, ya que abriendo un pull request se puede generar una conversación entre los componentes del equipo encaminada a revisar la funcionalidad aportada.
Conceptos clave de GitHub
Vamos ahora a describir algunas de las dinámicas más importantes a la hora de trabajar con GitHub, qué son heredadas en su gran parte directamente del propio sistema de control de versiones Git.
Commits: registro de cambios en el código
Los commits son confirmaciones de cambios en el código. Cuando realizamos cualquier cambio que sea representativo en un proyecto de software podemos crear un commit. Este commit guarda una instantánea del proyecto en el momento actual y a partir de ella, podemos saber qué archivos se modificaron y en qué puntos exactos de los ficheros se alteró el código. Esto permite a los desarrolladores rastrear con precisión cualquier cambio en el código del proyecto.
Branches (ramas): desarrollo paralelo de funcionalidades
Las ramas sirven para poder llevar varios estados de un mismo proyecto simultáneamente. Son muy útiles en muchos momentos, como por ejemplo la experimentación de nuevas funcionalidades, la creación de proyectos en estados inconsistentes que no provoquen fallos en el software en producción, o simplemente para alterar el código sin interferir el estado del proyecto general.
Forks (bifurcaciones): copias independientes de un repositorio
Un fork es una copia de un repositorio, lo que nos permite hacer evolucionar un proyecto de manera totalmente independiente, gestionando las versiones a partir de otro repositorio con funcionalidades completas, idénticas a las del repositorio original. El fork es la base de la colaboración en los proyectos de código abierto. Puedes crear un fork en cualquier momento y modificarlo libremente como si fuera tuyo.
Usos básicos de GitHub
Ahora vamos a describir algunos usos básicos que podremos hacer con GitHub en nuestro día a día.
Creación de una cuenta y configuración del perfil
Si queremos utilizar GitHub debemos comenzar por registrarnos, creando una nueva cuenta de usuario. El registro es perfectamente gratuito. Una vez que tengamos nuestra cuenta podemos configurar nuestro perfil de desarrollador, añadiendo toda la información que queramos, ya sea personal o profesional. Los perfiles de github son muy importantes, ya que muchas veces son tenidos en cuenta por los reclutadores a la hora de analizar las habilidades de los solicitantes de empleo.
Creación de un nuevo repositorio
Una vez que tenemos nuestra cuenta de GitHub podemos crear nuevos repositorios. No existe un límite de repositorios en las cuentas y podemos hacerlos tanto públicos como privados.
Clonación y descarga de repositorios existentes
Cuando pasamos a formar parte de un equipo de desarrollo generalmente comenzaremos por clonar los repositorios de código del proyecto. Con ese clonado lo que hacemos es descargar de manera completa el estado del proyecto actual en nuestro ordenador de desarrollo. Una vez tenemos el repositorio en local ya somos capaces de comenzar a trabajar sobre los archivos de código.
Realización de commits y sincronización con el repositorio remoto
Como hemos dicho antes, una vez tengamos funcionalidades relevantes que queramos incorporar al proyecto, podemos hacer commit. También son básicas las operaciones de sincronización con el repositorio remoto:
- La operación «pull» nos permitirá atraernos los cambios que otros desarrolladores hayan publicado en los repositorios remotos.
- La operación «push» nos permitirá enviar los cambios que tengamos del local hacia el repositorio remoto.
Gestión de ramas (branches) y fusiones (merges)
Otra tarea muy común es la gestión de las ramas, de modo que podamos realizar aportaciones de código de manera independiente y segura. Una vez tenemos claro que queremos que los cambios de la rama sobre la que estamos trabajando pase a formar parte de la rama principal de desarrollo debemos hacer una operación de fusión, conocida habitualmente con el término «Merge».
Colaboración y trabajo en equipo con GitHub
Como ya adelantamos, una característica principal de GitHub es permitir a los equipos de trabajo a participar de manera colaborativa en un proyecto. Vamos a ver qué funciones podrán realizar los integrantes del equipo.
Invitación de colaboradores a un repositorio
Todo comienza por invitar a otros colaboradores para formar parte del equipo. En este paso el administrador del repositorio tendrá que otorgar permisos a los nuevos desarrolladores que quiera que participen en él. Esto se hace desde la sección «Settings» y luego «Collaborators and teams».
Solicitud y revisión de cambios mediante Pull Requests
Cuando los desarrolladores realizan cambios en los proyectos es muy habitual que los introduzcan en ramas creadas por ellos mismos. Una vez que están seguros de que esa rama debe ser integrada en la rama principal realiza una operación de solicitud de integración de cambios, conocida por «pull request».
Gracias a los Pull Requests, los colaboradores pueden revisar el código antes de que se fusione con la rama principal, facilitando la discusión sobre el código propuesto. Esto también permite estar más seguro que el código cumple con los estándares del proyecto y realiza bien las funciones introducidas.
Resolución de conflictos y fusiones de ramas
Es normal que cuando se intenta fusionar ramas surjan conflictos. Esto ocurre cuando dos personas han tocado un mismo archivo en los mismos lugares. Cuando trabajamos con GitHub tenemos una completa interfaz para saber qué conflictos han surgido y cuáles son las opciones disponibles para solucionarlos.
Integración continua y despliegue automatizado (CI/CD) con GitHub Actions
Hemos hablado mucho sobre repositorios y modificaciones en el código de los proyectos, pero dentro de las funcionalidades del núcleo de GitHub también encontramos las herramientas para la integración continua (CI) y el despliegue continuo (CD) de proyectos de software.
Todo eso se lleva a cabo con las «GitHub Actions», que pueden especificar paso por paso los procesos necesarios para verificar las incorporaciones de código en los proyectos. A través de las GitHub Actions también podemos automatizar tareas como las pruebas o el despliegue.
Buenas prácticas y consejos para utilizar GitHub de manera efectiva
Ya para finalizar vamos a ver algunas buenas prácticas a la hora de trabajar con GitHub de una manera efectiva.
1. Organización y estructuración de repositorios
A la hora de mantener un proyecto es importante que ofrezcamos una buena estructura, incluyendo algunos archivos básicos como los README, que permiten ofrecer información a los componentes de los equipos. En los propios repositorios de código también es importante llevar la documentación. Además, en los proyectos de software libre también se suelen incluir guías para contribuir en los proyectos y códigos de conducta.
2. Uso adecuado de etiquetas y descripciones en los commits
En los commits es importante hacer unas descripciones detalladas sobre cuáles fueron los cambios realizados en los archivos y sus motivos. Además existe otra funcionalidad de la que no hemos hablado todavía llamada «tags» o etiquetas, que nos permiten marcar un commit en particular. Estos tags se utilizan muy frecuentemente para señalar las releases del software.
3. Mantenimiento y limpieza periódica de repositorios
Los administradores de los repositorios deben también realizar mantenimiento de manera periódica, lo que incluye eliminar ramas que ya no se usan, cerrar aquellos Pull Requests antiguos que no se van a integrar, y revisar los issues generados por otros usuarios, cerrando los que se han resuelto o los que no se consideran relevantes.
4. Configuración de permisos y colaboradores en los repositorios
Cuando queremos integrar componentes nuevos al equipo de desarrollo debemos asignarles como colaboradores. Es muy importante que esta asignación incluya solo las funciones necesarias para el trabajo de ese integrante del equipo. Si una persona deja de formar parte del equipo de desarrollo debemos acordarnos de eliminarlo entre los colaboradores.
5. Implementación de flujos de trabajo eficientes con ramas y Pull Requests
Cuando gestionamos un proyecto también es muy importante implementar flujos de trabajo que nos permitan garantizar la calidad del código o que no se introduzcan errores con las actualizaciones. Para ello es básico definir las recetas adecuadas en Github Actions, de modo que esos flujos de trabajo puedan ser lo más automatizados posible.