Control de versiones

¿Porque usar control de versiones?

  1. Podemos mantener una versión estable que sabemos que funciona, y seguir iterando con la capacidad de comparar para ver como surgen bugs, o como un bug se resolvio anteriormente.
  2. Podemos crear versiones alternas, por ejemplo si necesitamos que un workflow tenga cambios especificos que no necesitamos en el resto.
  3. Facilita la colaboración en proyectos grandes con multiples componentes.

Git

Gran Innovación Tecnologica o Gasto Inutil de Tiempo, dependiendo de como les funcione.

Git es una herramienta de control de versiones que se basa en el principio de un arbol de grafos. Esto permite que sea un control distribuido, sin depender de un sistema central (aunque a menudo este es el caso). Los cambios son a nivel del contenido de los archivos, lo que permite que operaciones como cambios de nombre o la adición de unas pocas lineas sean eficientes en memoria y ancho de banda.

Limitaciones

  1. La interfaz de git es nefasta. Existen prefacios en libros sobre lo nefasta que es. Afortunadamente, varios programas como VS Code incorporan plugins que facilitan la interacción
  2. Ciertos formatos (ehem notebooks en Jupyter ehem) hacen cambios segun estados, lo que en efecto es que cambios pequeños en una linea afecten grandes secciones de codigo, removiendo visibilidad del cambio
  3. Los cambios en git se guardan por snapshoot, lo que significa que cambios individuales, o progreso que se haya hecho internamente y no guardado como commit, no son visibles en el historial de git.
  4. Git no es colaboración en tiempo real, y de hecho el trabajar en tiempo real puede causar conflictos de merges. Existen otros sistemas que nos sirven para trabajar estilo Google Docs, como Live Share o Teletype

XKCD 1597 - git

Instalando Git

En Windows

Utilizando Chocolatey como habiamos visto en la sesión pasada.

choco install git --yes

Alternativamente, aquí esta la descarga para Windows.

En Linux

En la mayor parte de las distros ya viene preinstalado. Sino, se puede instalar siguiendo esta guia.

Comprobando la instalación

git version # muestra la versión
git version 2.29.2.windows.1

Creando una cuenta en Github y configurandola al git local

Github es un servicio de hosting de codigo. Ofrece la capacidad de crear repositorios imilitados como OpenSource, crear repositorios en estructuras predefinidas, guardar codigo en una boveda en el Artico, colaborar con más gente, etc.

Una gran cantidad de codigo OpenSource esta disponible en github.

Se puede crear una cuenta gratuita, asociada a un correo

Github acepta varias formas de verificar identidad. La más simple puede ser usar un token de identificación. El token se saca de Settings/Tokens.

Deberia ser una cadena como afb12ab124578ac121223asd1213as1212as12120

GITHUB_TOKEN=afb12ab124578ac121223asd1213as1212as12120
git config --global url."https://$GITHUB_TOKEN:x-oauth-basic@github.com/".insteadOf "https://github.com/" 

Usando git

git init y git clone

Para iniciar un repositorio de git, usamos git init dentro de la carpeta del repositorio.

git clone <direccion> <carpeta> permite clonar repositorios, desde un remoto local (aka. otra carpeta) o un remoto disponible en linea.

Para este taller haremos

git clone <github.tallerdemo.git> taller-git

git commit

Un commit es un snapshot del estado actual del repositorio, y usualmente representa un cambio funcional que estamos haciendo sobre el codigo.

Por ejemplo, añadir una nueva sección de procesamiento, nuevos graficos son un commit, o una nueva función.

Para crear un commit, necesitamos especificar que archivos vamos a añadir. Esto es porque usualmente modificamos más archivos de los que implican nuestro cambio funcional, especialmente si es más de uno a la vez.

Siguiendo el ejemplo, los archivos modificados para añadir nuevos graficos y crear una nueva funcion debiesen ir en commits separados.

# Añadiendo archivos especificos
git add arhivo1.txt archivo2.Rmd archivo3.csv

# Añadiendo un grupo de archivos con cierto nombre
git add figura* *.png

# Usualmente solo añadimos todos los cambios
git add .

Teniendo esta lista de cambios, podemos crar un commit. Es recomendable darle una descripción detallada.

# Para commit simples usamos solo un titulo corto
git commit --message "Titulo del commit"

# Para cambios más complejos es recomendable escribir una descripción
git commit # Esto abrira un editor de texto
Titulo del commit

Una breve descripción de los cambios hechos y cambios 
por hacer; en texto plano. Git recomienda hacer lineas
cortas de maximo 72 caracteres, dado que nativamente no
es capaz de romper las lineas. 

- Una lista de cambios
- Como este
- O este otro

TODO: 
- Una lista de cosas por hacer

git pull

Es la sincronización desde un remoto, para bajar los cambios que otros colaboradores han hecho.

# Bajar los cambios del remoto principal
git pull origin master

# Por defecto git pull usa el origen
# y autoshtash permite omitir evitar conflicto
git pull --autostash

git push

Al clonar desde un repositorio, como https:github.git, se crea automaticamente un remote origin con sus branches, como master.

git push origin master
git push origin main

En el caso de github, se requiere autorización previa e identificación para poder hacer push a un repo.

.gitignore

El archivo .gitignore es una lista de cosas que por defecto git ignorara para cambios. Lo usamos para evitar sincronizar scrips locales, información personal, pruebas, o datasets de gran tamaño que no es necesario mantener en un repositorio.

# Ignora los archivos comprimidos
**/*.gz
**/*.tgz
**/*.tar
**/*.zip

# Ignora archivos con un flag local de ignorar
**/ignora*
**/test*

# Ambiente y desarrollo de cuadernos
*.ipynb_checkpoints
*.RData
*.Rhistory
**/tmp

La sintaxis **/ significa cualquier subdirectorio.

.gitignore puede estar en cada directorio del proyecto, marcando archivos dentro de esos directorios; pero usualmente esta en el directorio raiz del proyecto, para así ser aplicado a todos los subdirectorios.

git config

El archivo de configuración guarda información, preferencias y alias que podemos usar diariamente. Es recomendable personalizarlo a nuestra necesidad, para un workflow más eficiente con el programa.

Para acceder a -editar el archivo

git config --global -e
# Esto abrira Nano o Vi
[user]
        email = <MAIL@MAIL.COM>
        name = <NOMBRE>
        username = <USERNAME>
[url "https://<TOKEN-BASICO>@github.com/"]
        insteadOf = https://github.com/
[core]
        editor = nano
[alias]
        a = commit --all
        m = commit --all --message
        fk = commit --amend
        l = log --oneline
        ls = log --graph --decorate
        s = status
        ss = status --short
        sv = status --verbose
        pa = pull --autostash
        pom = push origin master
        r = remote
        ru = remote get-url --all
        rrm = remote remove
        ge = config --global --edit

Podemos añadir configuraciones desde comandos sin entrar a editar

  • git config --global user.name "NOMBRE APELLIDO" configura el nombre que firmará git
  • git config --global user.email "MAIL@MAIL" configura el mail que firmará git

Demo - Experimento colaborativo de filogenia

Coronavirus! Pasando de las noticias y la vida diaria a su taller de bioinformatica

# Clonando un repositorio desde git
git clone https://github.com/DeepenData/talleres-programacion.git talleres

Aqui existen varios cuadernos con distintos parametros para ordenar una filogenia reducida de SARS-Cov2-19, con varios genomas ya alineados.

Modifiquen el chunk

# Variables
nombre_figura <- ".*.png" 
...

Corran todo el cuadeno, esto generara una figura nombre_figura.jpg. Luego vamos a pushear solo la imagen.

# Subiendo el archivo
# solo la figura que queremos modificar
git add figuras/nombre_figura.png  # En Linux/Mac
git add figuras\\nombre_figura.png # En Windows


# Git commit, para guardar el snapshoot
git commit --message "Crea figura nombre_figura"

# Git push
git push # asume que es origin main

Para descargar las figuras de los demas se puede hacer un pull desde el remoto

git pull

De momento omitimos comandos más complejos como merge, checkout, diff, blame, etc.

Colaboración en tiempo real

Git es un sistema diseñado para controlar cambios, como muchas personas trabajando en distintos componentes de un proyecto. No esta pensado para trabajar en tiempo real, a la Google Docs, y el usarlo así usualmente es una receta para llamar a merge conflicts y errores más esotericos.

Para colaboración en tiemo real pueden usar Live-Share, una extensión de VS Code que permite compartir un espacio y trabajar colaborativamente en tiempo real.

Los cambios se guardan en el espacio del host, y despues de esto es recomendable correr git add commit push pull para sincronizar todo con otros colaboradores y el historial de desarrollo.

Inicio rápido

Recitando comandos magicos de Git

  • git clone https://github.com/DeepenData/clases.git permite descargar el repo. Solo se hace al inicio.
  • git remote add clases https://github.com/DeepenData/clases.git añade el repo de GitHub a la lista de remotes, para de ahi hacer los push. El formato <url…> indica un remote de nombre y dirección. Por defecto, al hacer clone, se crea un remote origin que es de donde clonamos el codigo.
  • git pull --rebase --autostash para bajar la ultima versión del repo. Util cada clase y cada vez que alguien modifica algo. --autostash archiva los cambios locales durante el pull. git commit -m "MENSAJE DEL COMMIT" crea un commit con cambios e idelamente un mensaje explicativo. Son snapshots para la historia.
  • git push -u <remote> <branch> empuja esta versión al remoto. En github, requiere autorización previa.

  1. FONDECYT Postdoctoral Fellow, Universidad de Chile, ↩︎

  2. Pregrado, Universidad de Chile↩︎