Viajando en el tiempo con Git

Santos Gallegos - [email protected]
@stsewd

$ WHOAMI

Git

Es un...

Más adelante lo descubriremos

Problemas del día a día

Problemas del día a día (1)

Escribiendo un texto (o código)

Algunas cosas pueden salir mal

  • Borrar un archivo
  • Olvidar qué fue lo último que hice y cuándo
  • Editar/eliminar la parte equivocada
  • Olvidar porqué edite/eliminé esa parte
  • Compartirlo con alguien más
  • Explicar porqué edité/eliminé esa parte

Solución

Tener todo la información en el presente es un caos

Tener una máquina del tiempo

Problemas del día a día (2)

Escribiendo un texto (o código)

¡En grupo!

Todo puede salir muy mal

  • Trabajar todos al mismo tiempo
  • Unir los cambios
  • Quién hizo qué

Solución

Tener todo la información y todas las personas en el presente es un caos

Tener muchas máquinas del tiempo

Sistema de control de versiones

  • Abreviado VCS
  • Darle seguimiento a los cambios hechos sobre un archivo
  • Restaurar un archivo a un estado anterior
  • Quién, Cuándo, Qué
  • Ramificaciones
  • Mezclar cambios

Git es...

¡Una máquina del tiempo!

Un sistema de control de versiones

Pero muy parecido a una máquina del tiempo

No es el único

Git

  • Linus Torvalds, 2005
  • Open source
  • VCS distribuído
  • Multiplataforma
  • Integración con varios editores e IDEs

¿Cómo funciona?

  • Le decimos a Git que mantenga un registro de nuestros archivos
  • Editamos nuestros archivos
  • Le decimos a Git que guarde nuestros cambios
  • Volvemos a editar nuestros archivos

Conceptos básicos

Repositorio (repo)

  • Es nuestro proyecto
  • Tenemos repos locales y remotos

Commit

  • Un punto de restauración (snapshot) de nuesto proyecto
  • Cada commit está identificado por un hash (SHA-1)
  • a906cb2a4a904a152e80877d4088654daad0c859.

Los 3 estados

  • Área de trabajo (working directory)
  • Área de staging (staging area)
  • Área del repositorio (repo area)

Los 3 estados

  • Working directory (los archivos editados)
  • Staging area (cambios a ser guardados)
  • Repo area (cambios guardados)

Los 3 estados

Instalación

https://git-scm.com/download/

git --version

Haciéndole saber a Git quién soy

Registrándonos como viajeros del tiempo

              
                git config --global user.name "Santos Gallegos"
                git config --global user.email "[email protected]"
              
            

Iniciando nuestro repo

Preparándo nuestra máquina del tiempo

              
                cd /home/mi-proyecto/
                git init
              
            

Git status

¿En qué estado están mis archivo?

                
                  git status
                
              

Archivos nuevos no son registrados por Git (untracked).

Cambios a ser guardados

                
                  git add <archivo>
                
              

Guardar nuestros cambios

                
                  git commit
                
              

¿Dónde están mis commits?

Explorando el pasado
              
                # Ver todos nuestros commits
                git log

                # Ver un commit específico
                git show <hash>
              
            

Ignorando archivos

Información no relevante para mis viajes en el tiempo
  • Archivos autogenerados
  • Archivos sensibles (contraseñas, configuraciones de producción)
  • Archivos del sistema operativo (*~, .DS_Store, Thumbs.db)
              
                # Archivo .gitignore

                # Archivos del SO
                *.DS_Store
                *~
                Thumbs.db

                # Otros archivos
                build/
                passwords.txt
              
            

¿Cuándo vamos a viajar en el tiempo?

Viajando en el tiempo

Abróchate el cinturón
            
              git checkout <hash>
            
          

GitHub

Un Dropbox para nuestras máquinas del tiempo

GitHub

  • Nos permite alojar nuestros repos
  • Aloja varios proyectos open source (Linux y Python)
  • Organizaciones, seguidores, estrellas
  • Bug tracker (issues)
  • Code reviews
  • Permisos sobre un repositorio
  • Pull requests (PR)

Clonando repositorios

¡Mamá, quiero esa máquina del tiempo!
            
              git clone <url del repo>
            
          

Remotos

  • Un repo que está en otro lado
  • Cuando hacemos un clone, se crea uno
  • Podemos agregar varios remotos
  • Nos sirven para interactuar con otros repos
              
                # Listar remotos
                git remote -v

                # Agregar un remoto
                git remote add <nombre> <url>
                
                # Eliminar un remoto
                git remote remove <nombre>
              
            

Publicar y obtener cambios

Para compartir nuestros cambios debemos subirlos a nuestro remoto, o sincronizar nuestro repo local en caso que alguien más haya subido sus cambios.

            
              # Publicar cambios a un remoto
              git push <remoto> <rama>
              
              # Obtener cambios de un remoto
              git pull <remoto> <rama>
            
          

Ramas

Creando líneas del tiempo alternativas
¿Qué pasaría si...?

Ramas

  • Nos permiten trabajar de manera paralela
  • Experimentar con nuevas características
  • Podemos mezclar los cambios a nuestra rama principal
  • Ideal para trabajar con otras personas
  • Por defecto tenemos una rama main o master
              
                # Crear una rama basada en la rama actual
                git branch <nombre> 

                # Cambiar entre ramas
                git checkout <nombre> 

                # Crear y cambiar a esa rama
                git checkout -b <nombre> 
              
            

Problemas de los viajes en el tiempo

Si tenemos cambios que no hemos guardado (commit). Y queremos cambiar de rama/commit, Git se quejará.

              
                # Guardar nuestros cambios sin confirmar
                git stash

                # Volver a aplicar nuestros cambios
                git stash pop
              
            

Mezclando ramas

Nuestra nueva funcionalidad funciona. Tiempo de mezclarla a nuestra rama principal.

              
                # Cambiar a la rama base
                git checkout <rama base>

                # Mezclar nuestras ramas
                git merge <otra rama>
              
            

Conflictos al mezclar

  • Cuando en ambas ramas se modificaron las mismas líneas de un archivo
  • Basta con abrir el archivo y buscar las marcas especiales
  • Quedarnos con los cambios necesarios
  • Hacer un git add para marcar los conflictos como resueltos
  • Hacer un commit para continuar con el merge

Forks

Si vemos un proyecto en GitHub que nos gustaría mejorar o colaborar en su desarrollo. Hacemos un fork. Se creará una copia del repositorio en tu tuenta.

Pull requests (PR)

Es la manera en que envias tus cambios a un proyecto.

  • Hacer un fork
  • Clonar el repositorio
  • Agregar un remoto
  • Crear una nueva rama local
  • Hacer los cambios
  • Enviar un pull requests

Clientes gráficos

No todas las máquinas del tiempo son blanco y negro
  • Es importante aprender lo básico desde la terminal
  • Lo aprendes una vez
  • Luego podrás usar cualquier cliente gráfico sin problema
  • Varios IDEs y editores cuentan con integración con Git

Recursos adicionales