Codificación inteligente con Git y GitFlow: Un tutorial para una mejor gestión del código

/* by Tirth Bodawala - June 14, 2023 */

En la era digital actual, el desarrollo de software se ha convertido en un potente motor que impulsa la innovación y el crecimiento. Y para impulsar este motor de forma eficiente, necesitamos herramientas sólidas que faciliten una colaboración fluida, realicen un seguimiento de los cambios y proporcionen copias de seguridad seguras. Dos de estas potentes herramientas son Git y GitFlow. Esta entrada del blog desmitificará estas herramientas y destacará su papel vital en nuestra rutina de codificación.

Git: Tu máquina del tiempo de codificación

Git es como una máquina del tiempo para tu código. Lleva un registro de todos los cambios realizados en el código a lo largo del tiempo. Si tropiezas con un error, puedes volver atrás fácilmente y ver qué lo causó.

Git también permite que varios desarrolladores trabajen en el mismo proyecto sin pisarse unos a otros. Esto se hace utilizando “ramas”, espacios separados donde puedes jugar con el código sin estropear el proyecto principal.

¿Y qué más? Git sirve como red de seguridad en caso de fallos de hardware. Como todo el código se almacena en tu máquina local, puedes restaurar fácilmente tu trabajo incluso si se estropea tu hardware.

La subestimada brillantez de Git

Git brilla como sistema de control de versiones distribuido que presume de velocidad y eficacia. Pero su importancia va más allá de sus características principales. He aquí las funciones cruciales que desempeña Git en la codificación cotidiana:

Seguimiento histórico: Git permite a los desarrolladores hacer un seguimiento de las alteraciones del código a lo largo del tiempo. Desentrañar los orígenes de un fallo se convierte en una tarea simplificada con la capacidad de rastrear los cambios.

Colaboración unificada: Git permite a varios desarrolladores trabajar en armonía en un proyecto compartido. Lo consigue mediante entornos aislados conocidos como ramas, que permiten a los desarrolladores trabajar de forma independiente en sus fragmentos de código.

Copia de seguridad y restauración fiables: Un aspecto infravalorado de Git es su robustez frente a fallos de hardware. Con Git, cada fragmento de tu código vive en tu máquina local, proporcionando una copia de seguridad fiable. En caso de fallo del hardware, tu trabajo permanece seguro e inalterado.

Comprométete a menudo, empuja a diario: Un Mantra Recomendado

Comprometer tu trabajo y enviarlo diariamente a un repositorio compartido es una práctica que cultiva la seguridad, la integración y la colaboración continua. Los commits regulares generan un registro exhaustivo de la evolución del proyecto, manteniendo a todo el equipo al día de los cambios recientes. Además, evita las complicaciones derivadas de grandes e intrincadas fusiones en el futuro.

Navegando por el laberinto de GitFlow

Diseñado por Vincent Driessen, GitFlow ha encontrado popularidad por su compatibilidad con equipos de desarrollo colaborativos y escalables. Aquí tienes un desglose conciso de su estructura:

Rama Maestra: Hogar del código fuente que existe en producción.

Rama de desarrollo: Rama derivada de la maestra, donde se desarrolla y prueba el código.

Ramas de características: Ramas individuales que surgen de la rama de desarrollo para cada característica o corrección de errores. Así, cada adición queda aislada, evitando interferencias con el código principal.

Ramas de lanzamiento: Estas ramas albergan funciones de la rama de desarrollo que han alcanzado la estabilidad y están listas para su publicación. Cualquier error descubierto se rectifica aquí antes de la fusión final con las ramas maestra y de desarrollo.

Ramas Hotfix: Creadas a partir de la rama maestra, están destinadas a corregir errores urgentes en el código de producción. Tras las pruebas, se fusionan de nuevo con las ramas maestra y de desarrollo.

Convenciones mejoradas para nombrar las ramas

Cuando trabajas en grandes proyectos, es posible que utilices un sistema de tickets como Jira o GitHub issues para realizar el seguimiento de tareas y errores. En estos casos, puede ser beneficioso incluir el número de ticket en el nombre de la sucursal. Esto crea una conexión inmediata y clara entre la tarea y el código.

A continuación te explicamos cómo puedes ajustar la convención de nomenclatura anterior para incluir los números de las entradas:

  • Para las características: feature/TICKET_NUMBER-short-feature-description. Por ejemplo, si vas a añadir una función de inicio de sesión correspondiente al número de ticket 1234, la rama podría llamarse feature/1234-login.
  • Para corregir errores: bugfix/TICKET_NUMBER-short-bug-description. Por ejemplo, si estás arreglando un fallo en el sistema de inicio de sesión que corresponde al número de ticket 1235, la rama podría llamarse bugfix/1235-login-issue.
  • Para las correcciones: hotfix/TICKET_NUMBER-short-fix-description. Por ejemplo, si necesitas solucionar un problema urgente en el sistema de pagos relacionado con el número de ticket 1236, la rama podría llamarse hotfix/1236-pago-problema.

Esta convención de nomenclatura facilita el seguimiento del progreso de los distintos tickets, ya que el número del ticket y el nombre de la rama están directamente conectados.

Ventajas de incluir números de billete en los nombres de las sucursales

Incluir los números de billete en los nombres de las sucursales ayuda a:

  • Mejora la trazabilidad: Puedes rastrear fácilmente los cambios en el código hasta la tarea o error específico, facilitando un mejor seguimiento y responsabilidad.
  • Mejora la comunicación: Cuando se habla de una función concreta o de la corrección de un error, hacer referencia al número de ticket y al nombre de la rama proporciona a todos un contexto claro.
  • Aumenta la eficacia de las revisiones de código: Durante las pull requests, los revisores pueden comprender inmediatamente el propósito de los cambios, y verificarlos con los detalles mencionados en el ticket correspondiente.
  • Adoptar una convención de nomenclatura estructurada para tus ramas que incorpore números de ticket es un paso hacia prácticas de desarrollo más eficientes y rastreables. Estos pequeños refinamientos, con el tiempo, pueden dar lugar a mejoras significativas en la productividad de tu equipo y en la eficacia de la gestión de proyectos.

Pautas para redactar mensajes de compromiso

  • Sé conciso: La primera línea de tu mensaje de confirmación debe ser un breve resumen de los cambios, idealmente de no más de 50 caracteres.
  • Detalle en el cuerpo: Si la confirmación es compleja y requiere una explicación, añade una descripción detallada en el cuerpo del mensaje de confirmación, que debe ir separada del resumen por una línea en blanco.
  • Utiliza el modo imperativo: Escribe tu mensaje de confirmación como si estuvieras dando una orden. Por ejemplo, utiliza “Corrige error” en lugar de “Corrige error” o “Corrige error”.
  • Haz referencia a los números de ticket: Si utilizas un sistema de tickets, haz referencia al número de ticket en tu mensaje de confirmación. Esto mejora la trazabilidad y ayuda a vincular tus commits a las tareas con las que están relacionados.

Patrones para escribir mensajes de compromiso

Un patrón común que se utiliza para los mensajes de confirmación es:

Type(scope): Subject

Aquí tienes un desglose:

  • Tipo: Significa el tipo de cambio realizado. Los tipos más comunes son feat (para una nueva función), fix (para corregir un error), style (para cambios en el formato del código que no afectan a la funcionalidad), refactor (para cambios en el código que ni corrigen un error ni añaden una función), y otros.
  • Ámbito: Esta es una parte opcional en la que puedes mencionar qué parte del código base modifica la confirmación.
  • Asunto: Se trata de un breve resumen de los cambios, escrito en modo imperativo.

Por ejemplo: feat(auth): Add login via Facebook

Este mensaje de confirmación comunica que se trata de una nueva función (feat) relacionada con la autenticación (auth) y que añade la funcionalidad de inicio de sesión en Facebook.

En el caso de confirmaciones relacionadas con un ticket o incidencia concretos, puedes incluir el número del ticket en el asunto de la forma siguiente

  • fix(123): Resolver el problema con el correo electrónico de restablecimiento de contraseña

Esto nos indica que se trata de una corrección de errores (fix) relacionada con el ticket número 123 y que resuelve un problema con el correo electrónico de restablecimiento de contraseña.

Redactar mensajes de confirmación claros, concisos e informativos es una habilidad esencial en el desarrollo de software. No sólo mejoran la productividad personal, sino también la colaboración en equipo y la mantenibilidad de los proyectos. Si sigues las directrices y pautas compartidas anteriormente, tu historial de commits se convertirá en un valioso recurso para comprender la evolución de tu proyecto.

Explorar las solicitudes Pull/Merge

Supón que estás trabajando en una nueva función de tu aplicación, por ejemplo, “autenticación de usuarios”. Has creado una rama independiente (llamémosla ‘feature/651-user-auth’) y has implementado la nueva función. Tras probarlo en tu entorno local, decides que está listo para su revisión. Empujas tus cambios al repositorio remoto y luego creas una Pull Request.

En la Solicitud de Extracción, explicas lo que has hecho, por qué lo has hecho y cómo se ha probado. Esta es tu oportunidad para dar contexto a tus cambios, facilitando la tarea a los revisores. Después de crear la Solicitud de Extracción, tus compañeros de equipo pueden revisar tu código y darte su opinión. Pueden sugerir mejoras, hacer preguntas o aprobar los cambios.

Una vez que los cambios han sido aprobados por tu equipo, y se han superado todas las comprobaciones (como las pruebas automatizadas), tu código puede fusionarse en la rama principal (por ejemplo, “desarrollo” o “maestra”, según tu flujo de trabajo).

En conclusión, el uso eficaz de Git, GitFlow y la adopción coherente de las convenciones de nomenclatura de ramas y confirmaciones desempeñan un papel fundamental en la estructuración, seguridad y gestión de tu base de código. Adoptar estas herramientas y prácticas conllevará mejoras significativas en la productividad del equipo, la colaboración y la mantenibilidad general del proyecto.