Commits Atómicos: ¿Qué son?

Commits Atómicos: ¿Qué son?

Una práctica que juega un papel crucial en el desarrollo de software es el control de versiones. Sin él, sería mucho más complejo realizar un seguimiento de los cambios, revertir los cambios no deseados, implementar nuevas funciones y trabajar en equipo.

En este contexto, surge la necesidad no solo de adoptar buenas prácticas en la escritura de código, sino también de implementar buenas prácticas en el versionado. De esta forma, podemos dar cabida al desarrollo de Commits Atómicos, aplicando conceptos similares a los patrones de diseño en la escritura de código, como el Principio de Responsabilidad Única, en el que cada unidad de código es responsable de una única tarea.

Las buenas prácticas son esenciales


Los repositorios de control de versiones (como los creados en GitHub o GitLab) tienen capacidades que, cuando se usan de manera responsable, pueden ahorrarle un valioso tiempo de desarrollo. Ao enviar um commit, estamos registrando uma parte da história do repositório, que é armazenada cuidadosamente com informações importantes, como o autor, o momento do envio, as alterações realizadas, a mensagem atribuída a essa alteração e um identificador único para o commit, entre otras informaciones.

Con la conciencia de que toda esta información se registra en un compromiso, podemos comenzar a practicar el desarrollo de commits atómicos, que se pueden describir como unidades lógicas e independientes que representan de manera cohesiva un cambio realizado en el repositorio.

En el desarrollo de commits atómicos, cada confirmación se considera completa e independiente. En otras palabras, cada confirmación representa un solo cambio e idealmente representa el cambio completo. Es importante recalcar que el desarrollo de commits atómicos no es un conjunto de reglas rígidas e inflexibles, sino una práctica que se puede mejorar según el contexto de cada equipo y proyecto.

Ejemplo práctico: Implementación de una función de conversión de moneda.

Utilizando la CLI (Interfaz de Línea de Comando) para la creación de commits atómicos

Para ejemplificar la creación de commits atómicos, digamos que tenemos el siguiente problema a resolver en Python: implementar y probar una función que convierte un valor en dólares a un valor en real, recibiendo como parámetros el valor en dólares a convertir y el tipo de cambio del dólar en el día. En este ejemplo, asumimos que ya existe un repositorio git inicializado.

Podemos comenzar creando un archivo converter.py o conversor.py vacío (en este caso, estoy usando una distribución de Linux como sistema operativo y el comando para crear un archivo que usaré será touch <nombre_de_archivo>, pero hay otras formas de hacerlo en consecuencia con cada sistema operativo) y agregarlo al repositorio usando el comando git add converter.py, escribiendo en un mensaje indicando la creación de este archivo usando el comando git commit -m ‘<mensaje>’  y reemplazando <mensaje> con el nuestro.

💡
Nota: feat en el mensaje de commit indica que se introdujo una nueva funcionalidad con los cambios.
Figura 1. Creando y añadiendo el archivo conversor.py.

Podemos comenzar escribiendo el esbozo de lo que será implementado:

Figura 2. Esbozo de la implementación.

El comando git add -p (o git add –patch) puede ser muy útil al desarrollar commits atómicos, ya que permite revisar y seleccionar partes específicas de los cambios que luego se incluirán en la confirmación.

En este primer commit, queremos poner solo las primeras 2 líneas, que crean la función que usaremos. Si usáramos el comando git add converter.py o git add ., estaríamos agregando el archivo completo y no es lo que queremos. Entonces en la terminal escribimos el comando git add -p:

Figura 3. Comando git add -p.

Ese comando nos da algunas opciones. Para saber lo que significa cada una, podemos insertar ?:

Figura 4. Explicación de las opciones del comando git add -p.

Conforme se muestran las opciones, podemos editar manualmente este apartado con e, y se abrirá el editor de texto do git en la terminal:

Figura 5. Edición manual del fragmento de código.

En este caso, como solo queremos agregar las 2 primeras líneas, podemos eliminar las restantes.

Figura 6. Se dejan apenas las líneas deseadas.

Después de guardar, podemos usar el comando git status -v para ver el resultado:

Figura 7. Uso del comando git status -v.

Como podemos ver, solo se agregaron las primeras 2 líneas. Ahora podemos crear este nuevo commit con un mensaje usando nuevamente el comando git commit -m ‘<mensaje>’ y escribiendo el nuestro.

Figura 8. Creando el commit con un mensaje.

Como nuestro próximo commit va a añadir todo lo que resta del archivo (que corresponde a la función test_convertir_dolar_en_real (test_converter_dolar_em_real), podemos agregar simplemente todos los cambios en el archivo conversor.py con el comando git add conversor.py y crear enseguida un mensaje para nuestro próximo commit.

Figura 9. Agregar los cambios y creación del commit.

Ahora podemos implementar la función convertir_dolar_en_real (converter_dolar_em_real). La implementación es, simplemente, la multiplicación del valor en dólares para la cotización del dólar en Real. Al implementa la función, puede ser interesante agregar a nuestra función type hints (consejos de tipo) para nuestras variables y para lo que va a indicar la función.

Figura 10. Implementando la función converter_dolar_em_real.


Utilizar VSCode para crear commits atómicos


Los IDE que usamos para escribir nuestro código generalmente también están preparados para admitir funciones de control de versiones. En este ejemplo, usaré Visual Studio Code para mostrar cómo realizar los mismos pasos con la ayuda del IDE.

Como hicimos 2 cambios independientes, uno para agregar las type hints y otro para implementar la función, haremos 2 commits, una para cada cambio.

Figura 11. Cambios en el IDE.

En la barra derecha, tenemos un ícono marcado con un número “1”, que corresponde a la cantidad de archivos modificados. Si hacemos clic en él, veremos una lista de estos archivos modificados.

Figura 12. Archivos modificados.

En esta pestaña, si hacemos clic en el archivo converter.py, podemos ver los cambios realizados en él.

Figura 13. Alteraciones en los archivos.

Ahora podemos seleccionar la línea en la que queremos agregar los cambios y hacer clic con el botón derecho del mouse.

Figura 14. Opciones al hacer clic con el botón derecho del mouse.

Como fue seleccionada apenas la primera línea, vamos con la opción Stage Selected Ranges. Si observarmos, después de elegirla, se muestra en la pantalla que aún temos pendiente el cambio en la segunda línea. Pero antes crearemos um commit para el cambio de la primera línea, escribiendo en el apartado de texto a la derecha y después haremos clic en el botón Commit.

💡
Nota: Utilizamos refactor para indicar que el cambio representa una refactorización de código que no añade ninguna funcionalidad ni corrige algún bug.

Figura 15. Creando el commit.

Hecho lo anterior, el último commit que requerimos es el de la implementación de la funcionalidad que hicimos en la segunda línea. Para ello, podemos simplemente hacer clic en el botón + que aparece en las opciones al lado del nombre del archivo.

Figura 16. Añadiendo cambios mediante la interfaz gráfica del IDE.

Escribimos entonces nuestro mensaje para el último commit y seleccionamos nuevamente Commit.

Figura 17. Creación del último commit.


Conclusión y resultados


Al seguir estos pasos, creamos commits atômicos que realizan solo un cambio por commit, lo que nos ayudará con la claridad, legibilidad, rastreabilidad, reversibilidad e implementaciones, entre outros beneficios.

Podemos observar el histórico de todo lo hecho mediante el comando git log:

Figura 18. Comando git log.


Con esta información, podemos consultar, rastrear y revertir cualquier cambio realizado. Todos estos procesos se vuelven mucho más eficientes cuando usamos commits atómicos, además de tener un historial limpio e incremental en nuestro repositorio.

¡Espero que este artículo sea útil! ¡Éxito!

💡
Las opiniones y comentarios emitidos en este artículo son propiedad única de su autor y no necesariamente representan el punto de vista de Listopro.

Listopro Community da la bienvenida a todas las razas, etnias, nacionalidades, credos, géneros, orientaciones, puntos de vista e ideologías, siempre y cuando promuevan la diversidad, la equidad, la inclusión y el crecimiento profesional de los profesionales en tecnología.