Introducción al Control de Versiones ==================================== Los sistemas de control de versiones son herramientas fundamentales para el desarrollo de software, ya que permiten a múltiples colaboradores trabajar en un proyecto simultáneamente sin generar conflictos entre los cambios realizados. En esta sección, se introducirá el concepto de control de versiones y se discutirá su importancia en las prácticas de desarrollo de software modernas. Para este curso, utilizaremos `Git `_ como sistema de control de versiones. Aunque `GitHub `_ es el servicio más utilizado a nivel mundial, debido a su facilidad de configuración, optaremos por usar `GitLab `_ para alojar nuestros desarrollos. Introducción a Git ------------------ Git es un sistema de control de versiones distribuido diseñado para manejar proyectos de todos los tamaños con rapidez y eficiencia. **Breve historia de Git** Git fue creado por Linus Torvalds en 2005 para el desarrollo del kernel de Linux. Desde entonces, se ha convertido en el sistema de control de versiones más adoptado para el desarrollo de software. **Características Clave de Git** - Arquitectura distribuida - Soporta desarrollo no lineal - Manejo eficiente de proyectos grandes - Autenticación criptográfica del historial Uso de Git ---------- Para este curso, vamos a utilizar exclusivamente los servidores de `GITLAB `_, que es una plataforma de hospedaje para el control de versiones y la colaboración en proyectos de software. Permite a los usuarios y desarrolladores almacenar, gestionar y rastrear el código fuente de sus proyectos utilizando el sistema de control de versiones Git. Además de facilitar el trabajo colaborativo entre equipos, Gitlab ofrece características como la gestión de tareas, solicitudes de extracción (pull requests), revisiones de código y una variedad de herramientas integradas para mejorar la eficiencia del desarrollo. Es ampliamente utilizado en la comunidad de desarrollo de software para compartir y contribuir a proyectos de código abierto. Para utilizar este servicio, usaremos la autenticación de Google empleando nuestra cuenta de la Universidad. **Paso 1:** Accede a la página de `GitLab `_ y haz clic en 'Sign In'. .. image:: ./imágenes/sign_in.jpg :width: 600 **Paso 2:** Inicia sesión usando una cuenta de Google. Debes emplear la cuenta de la Universidad. .. image:: ./imágenes/sign_in_google.jpg :width: 600 **Paso 3:** Selecciona la cuenta de la Universidad Nacional. .. image:: ./imágenes/cuenta_unal.jpg :width: 600 **Paso 4:** Verifica tu cuenta ingresando el código de verificación enviado a tu correo electrónico. .. image:: ./imágenes/verificación.jpg :width: 600 **Paso 5:** Haz clic en "Next" para continuar. .. image:: ./imágenes/next.jpg :width: 600 **Paso 6:** Completa la información solicitada para que GitLab configure tu entorno de acuerdo con tus necesidades. Puedes guiarte por el ejemplo mostrado en la imagen siguiente. .. image:: ./imágenes/role.jpg :width: 600 **Paso 7:** Una vez completada la información, GitLab te guiará para crear tu primer repositorio. Llena los campos siguiendo el ejemplo a continuación y haz clic en el botón 'Create Project'. .. note:: Es posible que el nombre del grupo utilizado en el ejemplo ya esté ocupado, por lo que deberás elegir otro nombre. .. image:: ./imágenes/primer_proyecto.jpg :width: 600 **Paso 8:** Dado que te registraste en GitLab utilizando la cuenta de Google de la Universidad, será necesario crear un token de acceso (que funcionará como una contraseña) para futuras acciones. Para ello, haz clic en el botón en la esquina superior izquierda para abrir la barra lateral. .. image:: ./imágenes/abrir_barra.jpg :width: 600 **Paso 9:** Haz clic en el ícono de tu usuario, como se muestra en la siguiente imagen. .. image:: ./imágenes/abrir_usuario.jpg :width: 600 **Paso 10:** Esto abrirá el menú de usuario, donde deberás seleccionar "Edit Profile". .. image:: ./imágenes/edit_profile.jpg :width: 600 **Paso 11:** En la nueva barra lateral, selecciona "Access Tokens". .. image:: ./imágenes/menu_tokens.jpg :width: 600 **Paso 12:** En la ventana que se abre, gestiona los tokens haciendo clic en "Add new token". .. image:: ./imágenes/add_token.jpg :width: 600 **Paso 13:** Asigna un nombre al token (puedes elegir cualquier nombre). Establece la fecha de expiración del token y otorga los permisos `read_repository` y `write_repository`. Finalmente, crea el token de acceso personal. .. image:: ./imágenes/create_personal_token.jpg :width: 600 **Paso 14:** El token generado funcionará como tu contraseña para acceder al repositorio. Puedes visualizarlo haciendo clic en el ícono del ojo, o copiarlo haciendo clic en el ícono de copiar. Es importante guardar este token, ya que no será posible volver a verlo una vez que cierres esta ventana. Si lo pierdes, deberás regenerarlo. .. image:: ./imágenes/copy_token.jpg :width: 600 Descargar el repositorio recién creado -------------------------------------- Para acceder a la ventana principal, abre la barra lateral, igual que en el paso 8, y haz clic en el símbolo de GitLab (un zorro anaranjado). .. image:: ./imágenes/gitlab.jpg :width: 200 En esta ventana principal, podrás ver todos los proyectos en los que estés trabajando. Haciendo clic en el proyecto correspondiente, podrás acceder a él: .. image:: ./imágenes/ventana_principal.jpg :width: 600 Para descargar el repositorio, necesitamos su dirección. Esta se encuentra haciendo clic en el botón azul que dice "Code". .. image:: ./imágenes/ventana_principal_code.jpg :width: 600 Esto abrirá un menú. En la parte que dice "Clone with HTTPS", encontrarás la dirección del repositorio con la que vamos a trabajar. Puedes copiarla haciendo clic en el icono de copiar: .. image:: ./imágenes/proyecto_copiar.jpg :width: 600 En una terminal, escribe lo siguiente: .. code:: bash git clone https://gitlab.com/curso-2024-02/primer-repo.git En este caso, "https://gitlab.com/curso-2024-02/primer-repo.git" es la dirección del repositorio de ejemplo. Para cada proyecto, la dirección será diferente. Al ejecutar este comando en una terminal, se te pedirá tu usuario de GitLab, que es tu correo electrónico de la universidad (usuario@unal.edu.co), y la contraseña, que es el token que debes tener guardado. .. image:: ./imágenes/terminal_clone.jpg :width: 600 Esto creará una carpeta llamada "primer_repo" en este caso, pero con el nombre del repositorio que hayas creado, en la carpeta en la que te encuentres en la consola. Añadir Archivos al Repositorio ------------------------------ Después de clonar el repositorio en tu máquina local, puedes comenzar a añadir archivos y realizar cambios. A continuación, te mostramos cómo hacerlo utilizando `git` desde una consola de Linux. **Paso 1:** Navegar al directorio del repositorio clonado Primero, abre una terminal y navega al directorio del repositorio que acabas de clonar. Por ejemplo, si tu repositorio se llama `primer_repo`, usa el siguiente comando: .. code:: bash cd primer_repo **Paso 2:** Crear o copiar archivos en el repositorio Añade o crea los archivos que deseas agregar al repositorio dentro de este directorio. Por ejemplo, si deseas crear un nuevo archivo llamado `archivo.txt`, puedes hacerlo con el siguiente comando: .. code:: bash touch archivo.txt **Paso 3:** Verificar el estado del repositorio Antes de añadir los archivos al control de versiones, es una buena práctica verificar el estado del repositorio para ver qué cambios se han realizado. Esto se hace con el comando: .. code:: bash git status Este comando mostrará una lista de archivos nuevos, modificados o eliminados en el repositorio. **Paso 4:** Añadir archivos al área de preparación (staging area) Para añadir los archivos al área de preparación, usa el comando `git add`. Esto prepara los archivos para el commit. Puedes añadir un archivo específico o todos los archivos modificados: Para añadir un archivo específico: .. code:: bash git add archivo.txt Para añadir todos los archivos nuevos y modificados: .. code:: bash git add . **Paso 5:** Confirmar los cambios (commit) Una vez que los archivos están en el área de preparación, es necesario confirmar los cambios con un commit. Un commit es un registro de los cambios que has realizado en tu repositorio. Para hacer un commit, usa el siguiente comando: .. code:: bash git commit -m "Descripción de los cambios realizados" Es importante escribir una descripción clara y concisa de los cambios realizados en el mensaje del commit. **Paso 6:** Subir los cambios al repositorio remoto (push) Finalmente, para que los cambios sean visibles en el repositorio remoto en GitLab, debes subirlos usando el comando `git push`: .. code:: bash git push origin main En este comando, `main` es el nombre de la rama principal donde estás trabajando. Si estás trabajando en otra rama, reemplaza `main` con el nombre de tu rama. **Paso 7:** Verificar los cambios en la interfaz de GitLab Después de realizar el `git push`, los cambios se reflejarán en la interfaz de GitLab. Para ver los archivos subidos y los commits realizados: 1. Abre el navegador web y accede a tu proyecto en GitLab. 2. En la página principal del proyecto, verás una lista de archivos en el directorio raíz. Aquí deberían aparecer los nuevos archivos que acabas de subir. 3. Puedes hacer clic en el nombre de un archivo para ver su contenido. 4. En la sección "Code/Commits", ubicada en el menú lateral izquierdo, puedes ver un historial de todos los commits realizados, incluyendo el mensaje que proporcionaste durante el commit. .. image:: ./imágenes/gitlab_interfaz_principal.jpg :width: 600 .. image:: ./imágenes/gitlab_lista_commits.jpg :width: 600 Este es un ejemplo de cómo se ve la lista de archivos y el historial de commits en GitLab. Cada commit muestra el mensaje que escribiste, el nombre de la rama y la hora en que se realizó. **Resumen de Comandos** A continuación, un resumen de los comandos utilizados: .. code:: bash cd primer_repo touch archivo.txt # Crear un nuevo archivo git status # Verificar el estado del repositorio git add archivo.txt # Añadir un archivo específico git add . # Añadir todos los archivos modificados git commit -m "Descripción de los cambios realizados" # Confirmar los cambios git push origin main # Subir los cambios al repositorio remoto Siguiendo estos pasos, habrás añadido archivos a tu repositorio y los habrás subido al servidor de GitLab, permitiéndote compartir tus cambios con otros colaboradores o simplemente mantener un historial de versiones de tu proyecto. Ejercicio Guiado: Modificar Archivos en el Repositorio Local y Verificar los Cambios en GitLab ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ En este ejercicio, seguiremos una serie de pasos para modificar el contenido de los archivos `README.md` y `archivo.txt` en tu repositorio local (en tu computadora). Luego, subiremos los cambios al repositorio remoto en GitLab y verificaremos que los cambios sean visibles en la interfaz web de GitLab. **Paso 1:** Modificar los archivos en el repositorio local 1. Abre una terminal y navega al directorio de tu repositorio local. Utiliza el siguiente comando: .. code:: bash cd primer_repo 2. Usando un editor de texto como `nano`, `vim`, o cualquier otro de tu preferencia, abre el archivo `README.md` y realiza algunos cambios. Por ejemplo, podrías añadir una línea que describa brevemente el propósito del proyecto. .. code:: bash nano README.md 3. Guarda los cambios en `README.md` y repite el proceso con `archivo.txt`. Añade o modifica el contenido de este archivo también. .. code:: bash nano archivo.txt **Paso 2:** Añadir y confirmar los cambios 1. Una vez que hayas hecho las modificaciones, verifica el estado de los archivos para ver qué cambios ha detectado Git. .. code:: bash git status Observa cómo Git lista los archivos modificados en rojo. 2. Añade los archivos modificados al área de preparación (staging area) usando el comando `git add`: .. code:: bash git add README.md archivo.txt 3. Ahora, confirma los cambios con un commit. Incluye un mensaje descriptivo sobre los cambios realizados. .. code:: bash git commit -m "Actualización de README.md y archivo.txt con nueva información" **Paso 3:** Subir los cambios al repositorio remoto 1. Sube los cambios al repositorio remoto en GitLab usando el comando `git push`: .. code:: bash git push origin main **Paso 4:** Verificar los cambios en la interfaz web de GitLab 1. Abre tu navegador web y accede al proyecto en GitLab. 2. En la página principal del proyecto, verifica que los archivos `README.md` y `archivo.txt` muestran los cambios que realizaste. 3. Haz clic en cada archivo para revisar su contenido y asegurarte de que los cambios se han aplicado correctamente. Actualización del Repositorio Local con Cambios Realizados por Otros -------------------------------------------------------------------- En un entorno colaborativo, es común que otros usuarios realicen cambios en el repositorio remoto directamente desde la interfaz de GitLab, o que suban cambios realizados en su propio PC. Para mantener tu repositorio local actualizado y sincronizado con estos cambios, es necesario descargar (o "bajar") los cambios más recientes al repositorio local. En esta sección, aprenderás cómo hacer esto. **Paso 1:** Realizar o visualizar cambios en la interfaz de GitLab 1. Accede a la página del proyecto en GitLab usando tu navegador web. 2. En la lista de archivos del proyecto, selecciona un archivo y haz clic en su nombre y luego click en "edit -> Edit single file", para editarlo directamente en la interfaz de GitLab. 3. Realiza los cambios deseados en el archivo y añade un mensaje descriptivo para el commit, luego guarda los cambios. El commit se realiza con el botón de abajo que dice "Commit changes" y en este caso no hay necesidad de hacer add. .. note:: Estos cambios podrían haber sido realizados por otro usuario, y tú necesitas actualizar tu repositorio local para reflejar los cambios más recientes. .. warning:: No usar por el momento el "Web IDE", que es una herramienta más completa, pero para este ejercicio complicaría las cosas. **Paso 2:** Verificar que hay cambios en el repositorio remoto 1. Desde la interfaz de GitLab, puedes ver un historial de commits en la sección "Commits" en el menú lateral izquierdo. Aquí, puedes verificar los cambios realizados, tanto por ti como por otros colaboradores. **Paso 3:** Actualizar el repositorio local 1. Abre una terminal y navega al directorio de tu repositorio local. .. code:: bash cd primer_repo 2. Para actualizar tu repositorio local con los cambios realizados en GitLab, utiliza el comando `git pull`. Este comando descarga y aplica los cambios del repositorio remoto al repositorio local: .. code:: bash git pull origin main Este comando asegura que todos los cambios realizados por ti o por otros colaboradores en la rama `main` se reflejen en tu copia local. 3. Git descargará los cambios y los integrará en tu repositorio local. Si todo va bien, verás un mensaje confirmando que se han aplicado los cambios. **Paso 4:** Verificar los cambios en el repositorio local 1. Revisa los archivos en tu repositorio local para asegurarte de que los cambios se han aplicado correctamente. 2. Puedes usar el comando `git log` para ver un historial de los commits y confirmar que los cambios más recientes se han incorporado a tu repositorio local. .. code:: bash git log **Conclusión:** Actualizar tu repositorio local es una práctica esencial para asegurarte de que estás trabajando con la versión más reciente del proyecto, especialmente en entornos donde múltiples colaboradores están realizando cambios. Siguiendo estos pasos, te aseguras de que tu trabajo esté alineado con el de tus compañeros y que todos los cambios se sincronicen correctamente. .. note:: **Cómo evitar que Git pida la contraseña** 1. **Configura Git para almacenar credenciales:** - Abre una terminal y ejecuta: ``` git config --global credential.helper store ``` 2. **Haz un pull:** - La próxima vez que Git te pida credenciales: - Ingresa tu nombre de usuario de GitLab. - Pega el Token de Acceso Personal (que creamos en un principio) en lugar de la contraseña. Git guardará estas credenciales y ya no te pedirá la contraseña en futuras operaciones. Conflictos entre Cambios ------------------------ Los conflictos en Git pueden ocurrir cuando dos o más cambios contradictorios se realizan en la misma parte de un archivo. A continuación, te mostramos un ejemplo de cómo se puede generar un conflicto entre un cambio hecho directamente en la interfaz web de GitLab y otro cambio hecho en tu repositorio local. **Situación Inicial:** Supongamos que tienes un archivo llamado `archivo.txt` en tu repositorio con el siguiente contenido: .. code-block:: text Línea 1 Línea 2 Línea 3 **Paso 1:** Realizar un cambio en la interfaz web de GitLab 1. Accede a tu proyecto en GitLab y edita `archivo.txt` directamente desde la interfaz web. 2. Cambia el contenido de la línea 2 a: .. code-block:: text Línea 2 (cambio desde GitLab) 3. Guarda el cambio y confirma el commit. **Paso 2:** Realizar un cambio en el repositorio local 1. Sin saber que alguien ha modificado `archivo.txt` en GitLab, abre tu copia local del archivo. 2. Modifica la línea 2 de `archivo.txt` a: .. code-block:: text Línea 2 (cambio local) 3. Guarda el archivo y haz un commit en tu repositorio local: .. code-block:: bash git add archivo.txt git commit -m "Modificación de línea 2 desde local" **Paso 3:** Intentar subir los cambios locales al repositorio remoto 1. Ahora intenta hacer `git push` para subir tus cambios a GitLab: .. code-block:: bash git push origin main 2. Git te dará un error porque tu copia local está desactualizada respecto al repositorio remoto. Necesitas hacer un `git pull` para traer los cambios remotos antes de poder subir los tuyos. .. code-block:: bash git pull origin main .. warning:: Es posible que aparezca un mensaje como este: .. code-block:: bash ayuda: Hacer un pull sin especificar cómo reconciliar las ramas es poco ayuda: recomendable. Puedes eliminar este mensaje usando uno de los ayuda: siguientes comandos antes de tu siguiente pull: ayuda: ayuda: git config pull.rebase false # hacer merge (estrategia por defecto) ayuda: git config pull.rebase true # aplicar rebase ayuda: git config pull.ff only # aplicar solo fast-forward ayuda: ayuda: Puedes reemplazar "git config" con "git config --global" para aplicar ayuda: la preferencia en todos los repositorios. Puedes también pasar --rebase, ayuda: --no-rebase, o --ff-only en el comando para sobrescribir la configuración ayuda: por defecto en cada invocación. Puedes resolver esto ejecutando el siguiente comando: .. code-block:: bash git config pull.rebase false Esto configurará Git para realizar un merge por defecto al hacer un `git pull`. Para continuar vuelve a ejecutar el pull **Paso 4:** Resolver el conflicto 1. Al ejecutar `git pull`, Git detectará un conflicto en `archivo.txt` porque los cambios en la línea 2 desde GitLab y desde tu repositorio local son contradictorios. .. code-block:: bash Auto-merging archivo.txt CONFLICT (content): Merge conflict in archivo.txt Automatic merge failed; fix conflicts and then commit the result. 3. Abre `archivo.txt` en tu editor de texto. Verás algo similar a esto: .. code-block:: text Línea 1 <<<<<<< HEAD Línea 2 (cambio local) ======= Línea 2 (cambio desde GitLab) >>>>>>> origin/main Línea 3 Las líneas entre `<<<<<<< HEAD` y `=======` representan los cambios que hiciste localmente. Las líneas entre `=======` y `>>>>>>> origin/main` representan los cambios que vienen del repositorio remoto (GitLab). 4. Ahora debes decidir cómo resolver el conflicto. Tienes varias opciones: - **Mantener el cambio local:** Borra las líneas correspondientes al cambio desde GitLab. - **Mantener el cambio desde GitLab:** Borra las líneas correspondientes al cambio local. - **Combinar ambos cambios:** Edita las líneas para incorporar ambas modificaciones. Supongamos que decides combinar ambos cambios: .. code-block:: text Línea 1 Línea 2 (cambio local y cambio desde GitLab) Línea 3 5. Guarda el archivo después de resolver el conflicto. **Paso 5:** Confirmar la resolución del conflicto 1. Añade el archivo modificado al área de preparación: .. code-block:: bash git add archivo.txt 2. Realiza un commit para finalizar la resolución del conflicto: .. code-block:: bash git commit -m "Resuelto conflicto en archivo.txt combinando cambios" 3. Finalmente, sube los cambios al repositorio remoto: .. code-block:: bash git push origin main **Conclusión:** Has resuelto con éxito un conflicto entre un cambio hecho en la interfaz web de GitLab y un cambio hecho en tu repositorio local. Este proceso es común en entornos colaborativos y es esencial saber cómo manejarlo para mantener la integridad del código en un proyecto compartido. Autorizar a otro usuario a un repositorio propio: ------------------------------------------------- En la pagina del repositorio, abrir la barra de menú de la izquierda y abrir Manage->Members hacer click en Invita Members Poner el correo electrónico del miembro a invitar Poner role de desarrollador (Maintainer) Una vez esta persona acepte la invitación, el proyecto le aparecerá en su GITLAB, y podra subir y bajar cambios. Autorizar a otro usuario en un repositorio propio ------------------------------------------------- Para dar acceso a otro usuario a tu repositorio en GitLab, sigue estos pasos: 1. **Abrir la configuración de miembros:** 2. - En la página principal del repositorio, abre la barra de menú a la izquierda. - Navega a `Manage` y luego selecciona `Members`. 3. **Invitar a un nuevo miembro:** 4. - Haz clic en el botón `Invite Members`. 5. **Agregar el correo electrónico y asignar un rol:** 6. - Introduce el correo electrónico del usuario que deseas invitar. - Selecciona el rol de `Developer` (Desarrollador) para que pueda subir y bajar cambios en el repositorio. 7. **Finalizar la invitación:** 8. - Haz clic en `Invite` para enviar la invitación. Una vez que el usuario acepte la invitación, el proyecto aparecerá en su cuenta de GitLab, y podrá realizar operaciones de subida y descarga de cambios en el repositorio. Ejercicio: Trabajo en Grupo ---------------------------- 1. **Crear un repositorio compartido:** - Un miembro del grupo debe crear un nuevo repositorio en GitLab. - Ese miembro debe invitar al menos a otro estudiante al repositorio, siguiendo las instrucciones para autorizar a otro usuario. 2. **Realizar cambios sin conflictos:** - Cada estudiante debe clonar el repositorio en su máquina local. - **Antes de realizar cualquier cambio**, cada estudiante debe hacer un `git pull` para asegurarse de que tienen la versión más reciente del repositorio. - Asegúrense de que cada estudiante trabaje en archivos diferentes o en diferentes secciones del mismo archivo para evitar conflictos. - Cada estudiante debe realizar un commit y hacer push de sus cambios al repositorio remoto en GitLab. 3. **Generar un conflicto intencionado:** - **Antes de hacer nuevos cambios**, cada estudiante debe hacer un `git pull` para asegurarse de que tienen la versión más reciente del repositorio. - Ambos estudiantes deben editar la misma línea de un archivo en el repositorio. - Cada estudiante debe intentar hacer commit y push de sus cambios, lo que probablemente resultará en un conflicto. 4. **Resolver el conflicto:** - **Antes de resolver el conflicto**, el estudiante que va a realizar la corrección debe hacer un `git pull` para traer los cambios más recientes del repositorio remoto. - Siguiendo las instrucciones para resolver conflictos en Git, uno de los estudiantes debe corregir el conflicto en su máquina local, combinando o seleccionando las versiones de los cambios. - Una vez resuelto, ese estudiante debe hacer commit de la resolución y hacer push al repositorio remoto. 5. **Verificar la solución:** - El otro estudiante debe hacer un `git pull` del repositorio para obtener la versión corregida. - Ambos estudiantes deben verificar que los cambios se han integrado correctamente y que el conflicto ha sido resuelto. Este ejercicio les ayudará a familiarizarse con el trabajo en equipo utilizando GitLab, así como a manejar y resolver conflictos que pueden surgir en un entorno colaborativo.