Laboratorio 1: Git 👾

MDS7202: Laboratorio de Programación Científica para Ciencia de Datos - Otoño 2023

Cuerpo Docente:¶

  • Profesores: Pablo Badilla, Ignacio Meza D.
  • Auxiliar: Sebastián Tinoco
  • Ayudante: Diego Cortez

Equipo: SUPER IMPORTANTE - notebooks sin nombre no serán revisados¶

  • Nombre de alumno 1: Johnny Godoy

Link de repositorio de GitHub: https://github.com/johnny-godoy/laboratorios-mds¶

Reglas:¶

  • Fecha de entrega: 6 días desde la publicación, 3 días de atraso con 1 punto de descuento c/u. Pueden utilizar días bonus sin descuento.
  • Grupos de 2 personas.
  • Ausentes deberán realizar la actividad solos.
  • Cualquier duda fuera del horario de clases al foro. Mensajes al equipo docente serán respondidos por este medio.
  • Prohibidas las copias. Cualquier intento de copia será debidamente penalizado con el reglamento de la escuela.
  • Pueden usar cualquer material del curso que estimen conveniente.
  • Asistencia obligatoria a instrucciones del lab (viernes 16.15). Luego, pueden quedarse trabajando en las salas o irse.

Objetivos del lab:¶

  • Conocer los elementos básicos que conformar Git
  • Clonar repositorios
  • Identificar ramas de un repositorio
  • Reconocer y solucionar problemas entre ramas
  • Subir cambios a un repositorio

Parte 1: Conocimiento Teórico (2 pts)¶

Responda las siguientes preguntas (0.2 pts c/u):

  1. ¿Qué es Git y cómo se relaciona con el control de versiones?

  2. Nombre y explique 3 diferencias entre Git y Github.

  3. ¿Qué es un hash y cómo se representa en un commit? De un ejemplo.

  4. ¿Que elementos componen a la estructura de datos de Git?

  5. ¿Que comandos de Git sirven para crear un repositorio y hacer seguimiento a cambios en los archivos?

Escriba sus respuestas acá:

  1. Git es un sistema de control de versionamiento distribuido (DVCS), que permite la gestión de repositorios y de versiones de código. Git es free open-source software que se creó para reemplazar al DVCS propietario BitKeeper para el desarrollo de Linux.
  2. Nombre y explique 3 diferencias entre Git y Github.
    1. Git es un DVCS, GitHub es un servicio de alojamiento de Internet, que utiliza Git.
    2. Git crea repositorios locales, mientras que GitHub es un espacio para subir copias de repositorios a la internet.
    3. Git es una herramienta de linea de comando, mientras que GitHub expone los comandos con una interfaz gráfica de uso simple.
  3. Un hash es un string que identifica a un objeto de manera esencialmente única, y nos ayuda para referenciar a dicho objeto. Para representar un commit, se utiliza su hash correspondiente.
  4. Se compone de 3 unidades:
    1. Los blob, que almacenan el contenido de un archivo de tal forma que si el archivo se modifica, entonces se crea otro blob asociado que guarda el contenido modificado.
    2. Los árboles, cuyos nodos representan directorios para blobs o para otros árboles (de forma recursiva).
    3. Los commit, que son capturas en el historial que registran y consolidan cambios.
    1. Creación: git init <repository-name>
    2. Ver cambios en archivos: git diff
    3. Ver registro de cambios: git log

Responda si las siguientes afirmaciones son Verdaderas (V) o Falsas (F). Justifique en cualquiera de los casos (0.2 pts c/u):

  1. Git siempre resuelve automáticamente los problemas de lineas al hacer merge entre diferentes ramas.
  2. Ejecutar git pull sobre un repositorio es equivalente a ejecutar git clone.
  3. Cada miembro del equipo trabaja en la misma copia del código fuente usando Git.
  4. En Git es posible deshacer cambios y volver a versiones anteriores del código.
  5. El comando git commit se utiliza para enviar cambios al repositorio remoto.

Escriba sus respuestas acá:

  1. Falso, no siempre es posible resolver este tipo de problemas sin ambigüedades que deba resolver el usuario.
  2. Falso, pull realiza actualizaciones locales de un repositorio que ya está clonado (es decir, para el cual ya tenemos una copia local)
  3. Falso, cada uno está trabajando en su propio clon local. Los miembros del equipo deben utilizar push para actualizar su trabajo y pull para recibir las actualizaciones de los otros miembros.
  4. Verdadero, existen varias opciones según a qué estado se quiere regresar. Si se quiere retornar los archivos a un commit anterior, podemos usar checkout. Si ya se subió remotamente (con push), también podemos obtenerlo del repositorio remoto (con pull). El comando reset también puede volver a un commit anterior y revertir todo su uso, dejándolo en la historia de versionamiento.
  5. Falso, commit guarda los cambios locales, no el remoto. Para pasar estos cambios locales al repositorio remoto, se debe usar push después de ya haber realizado commit.

Parte 2: Creando una presentación personal (2 pts)¶

Para empezar a "soltar las manos" con Git, se les encomienda crear un repositorio con una presentación personal. El repositorio debe contener un breve resumen de quienes son ustedes, sus gustos, experiencias, y cualquier otro detalle interesante que ustedes consideren relevante.

Para realizar esto, deben seguir los siguientes pasos:

  1. Contar con una cuenta de github (1 por persona)
  2. Crear un repositorio con su nombre de usuario
  3. Crear y modificar un archivo readme.md con la información que ustedes deseen compartir.

A modo de ejemplo, pueden guiarse por esta suculenta presentación.

Hint: Una buena opción es usar templates de presentación personal que encuentren en Google, como los que ofrece este sitio.

Entregable:

Enlace al repositorio con la presentación personal.

IMPORTANTE: DEBEN ADJUNTAR UN ENLACE POR PERSONA

Link Presentacion 1: https://github.com/johnny-godoy Me disculpo si no es muy breve, ya lo tenía hecho de antes!

Parte 3: Trabajando sobre un repositorio externo (2 pts)¶

Tras muchos dolores de cabeza, un grupo de entusiastas académicos decidieron aprender sobre Git y así trabajar colaborativamente de forma más ordenada y eficiente. Después de una infinidad de intentos y aprender de sus errores "a la mala", los académicos lograron levantar un repositorio en Github. Usando el repositorio de los académicos, responda las siguientes preguntas (incluya también los comandos en Git ocupados):

  1. Clone el repositorio a su ambiente local. (0.25 pts)

Escriba sus respuestas acá:

git clone https://github.com/MDS7202/lab1.git

  1. Inspeccione brevemente el repositorio: ¿Cual es el objetivo del proyecto? Explique brevemente la estructura del proyecto, asi como también de cada componente que lo conforma. (0.25 pts)

Escriba sus respuestas acá:

En el último commit, el repositorio contiene tres archivos:

  • readme.md, que explica el objetivo del proyecto, que es emular los sonidos de animales.
  • animales.py, que implementa la función animales, que recibe el nombre de un animal, e imprime el sonido que este hace (en distintas formas según el animal...)
  • main.py, que es un programa interactivo que le pregunta al usuario el nombre de un animal, y luego le imprime el sonido correspondiente
  1. Identifique los últimos cambios al repositorio, reconociendo las principales ramas de trabajo. ¿Son informativos los commit realizados? (0.25 pts)

Hint: Se recomienda usar los argumentos all, graph y decorate

Escriba sus respuestas acá:

Para ver las ramas:

git branch -av

En este caso hay 3 ramas remotas: main, fix-ifs y new_features. Además, está nuestro clon local de la rama main realizado en la parte 1, que se llama main también.

Para ver los cambios:

git log --all --graph --decorate

image.png

El último commit se realizó en fix-ifs, con una descripción no informativa "fix ifs", que no agrega nada al nombre de la rama. El anterior fue la separación en módulos que se realizó en main es más informativo, y explica que el proyecto se separó en módulos. Antes de eso igual es en main, y dice que agrega función. Esto solamente se entiende porque el proyecto tiene una única función, pero en general no sería un buen mensaje. Antes de eso estuvo el commit inicial de creación, cubriendo todos.

  1. Uno de los académicos se da cuenta que la rama principal de trabajo no se ejecuta correctamente para todos los argumentos. Señale el error en el código e identifique a la persona que lo cometió usando git blame (0.25 pts)

Hint: Le puede ser útil esta documentación.

Escriba sus respuestas acá:

El error está en la implementación de la función animales. Considerar el caso input="gato", que correctamente imprime "miau", pero luego se verifica que input!="zorro", por lo cual cae un error. Esto fue un error de uso de if en vez de elif.

Para determinar quién cometió el error, se usa git blame animales.py:

image.png

Vemos que la implementación incorrecta la hizo el usuario mezosky.

  1. Busque los siguientes commit:
  • c8b1a62d7299552b0654f930d695b33109214111
  • 362fe21ee44f53ee944cee4ba484600308f83d78
  • 25543a3baf77292baf849726784ca005473acab1

¿Qué diferencias existen entre cada uno? (0.25 pts)

Escriba sus respuestas acá:

Cada uno se busca con git show:

  1. Este implementa la función animales en main.py

image.png 2. (Output truncado) Este mueve la función animales al módulo animales.py image.png 3. Este corrige la implementación de la función animales. Notar que esto no es en la rama main, así que la función está en main.py. image.png

  1. Realice una merge de la rama fix-ifs con la rama main y describa lo que ocurre. ¿Qué parte del código podría estar ocasionando esto? (0.25 pts)

Escriba sus respuestas acá:

Al realizarlo hay un conflicto:

image.png

Esto ocurre porque el último commit en ambas ramas es una modificación de líneas de main.py, por lo cual no se puede resolver automáticamente con cual modificación quedarse.

  1. Cree una rama nueva y proponga una solución al problema anterior, adjuntando el código corregido y señalando las líneas modificadas. (0.5 pts)

Escriba sus respuestas acá:

Primero se crea la rama nueva con git branch jgodoy-fix-control_flow, y se mueve a esta rama con git checkout jgodoy-fix-control_flow. Notemos que esta se basa en la rama main, no en fix-ifs, por lo cual las modificaciones que hay que hacer son implementar los arreglos de fix-ifs en animales.py.

Si basáramos la rama en fix_ifs entonces la modificaciones serían más complejas, pues habría que mantener main.py de la misma forma que en la rama main, así que habría que repetir más cambios.

Entonces, solamente hay que realizar cambios pequeños en animales.py, los if por los elif tal como en fix-ifs, cambiando la línea 9 y 11: image.png

Luego, se agrega animales.py a staging usando git add animales.py y se guardan los cambios con git commit -m "fix: control flow bug":

image.png

Para terminar, se junta en la rama main con git merge jgodoy-fix-control_flow main:

image.png

Finalizando el arreglo.

Fin¶

Eso ha sido todo por ahora!! Esperamos que este laboratorio les haya gustado y servido para trabajar con Git. Recuerden los dias de plazo que tienen disponibles y que ante cualquier duda no duden en contactar al equipo docente.

Nos vemos!!