Git Workshop

¿Qué es Git? ¿Qué es GitHub?

¿Y esto... para qué me sirve?

¿Qué es Git?

  • Sistema de Control de Versiones Distribuído
  • Software libre, creado por Linus Tolvards 
  • Favorece desarrollos no lineales y distribuídos 

¿Sistema de Control de Versiones?

source: git-tower.com

  • Qué
  • Quién
  • Cuándo
  • Para qué

Las versiones son como fotografías que registran su estado en ese momento del tiempo y se van guardando a medida que se hacen modificaciones al código fuente.

Y... ¿para qué me sirve un Sistema de Control de Versiones?

source: git-tower.com

  • Almacenamiento y backup
  • Control de acceso mediante permisos
  • Deshacer ilimitado
  • Mezclar aportaciones de distintos colaboradores
  • Todos se mantienen sincronizados fácilmente
  • Histórico de cambios
  • Versiones en paralelo

Si eres diseñador gráfico o web,

y quieres mantener cada versión de

una imagen o diseño

Si eres desarrollador de software,

y quieres mantener versiones en tus

aplicaciones

etc.

Copiar y Pegar 

NO

es Control de Versiones !!!

¿Y por qué Git?

Distribuído, no centralizado

Centralizado

DiDistribuído

¿Y por qué Git?

Fotografías (snapshots), no diferencias

Guardando diferencias entre ficheros

Guardando snapshots de ficheros

¿Y por qué Git?

Rápido trabajas en local (incluso sin conexión a internet), sistema de branching muy ligero

Añadir, pero no borrar nunca borra información, lo que hace que sea muy difícil romper algo por error

Git comprueba todo todo es guardado con suma de comprobación de sus contenidos (SHA-1). Así que si se corrompe algo, Git se entera

Empecemos a trabajar con Git!!

Instalando Git ...

Configuración inicial

Configura tu nombre y email

$ git config --global user.name "Ada Lovelace"
$ git config --global user.email "adalovelace@barcelonajs.org"

$ git config --global user.name
"Ada Lovelace"

$ git config --global user.email
"adalovelace@barcelonajs.org"

git config

Primeros pasos

Convertir una carpeta en un repositorio Git

git init

Esta carpeta escondida contiene la información de Git para nuestro repositorio. ¡Rara vez tendremos que tocar esto!

Estado del repositorio

Consultar el estado del repositorio

git status

Staging area

Cuando un fichero está listo para el siguiente commit (ya sea nuevo, o existente pero modificado), lo añades al Staging Area

git add​
git commit

Staging area

Añadir al staging area

git add

git add <file> # Añade el fichero <file>

git add . # Añade todos los ficheros

commit & history

Grabar cambios en el repositorio

git commit -m "Message"

Historial de cambios del repositorio

git log

¿Qué hemos hecho exactamente?

Snapshot

Refleja el estado del proyecto en un determinado punto en el tiempo

Tú decides cuándo guardar un snapshot

Commit

Acción de crear un snapshot

Conceptos

La evolución de un proyecto puede verse a través de sus commits

Un commit guarda:

  • Cómo han cambiado los ficheros desde el commit previo
  • Referencia al commit padre (commit anterior)
  • Código hash id revisión
    1c002dd4b536e7479fe34593e72e6c6c1819e53b

¿Qué hemos hecho exactamente?

Repositorio

Colección de todos los ficheros (proyecto) y la historia de esos ficheros

  • Ficheros del proyecto (el trabajo del equipo)
  • Los commits que ha hecho el equipo del proyecto

Puede estar almacenado en local, en remoto (GitHub) o ambos!

Conceptos

Todos los commits viven en una rama

Puede haber muchas ramas

La rama principal de un proyecto Git se llama master

Branch (rama)

... de esto hablaremos luego

¿Qué hemos hecho exactamente?

Conceptos

HEAD

Apunta al commit más reciente (casi siempre)

Repositorios remotos

Trabajo en equipo!!!

source: git-tower.com

Git != GitHub

Source: jahya.net

GitHub es un hub de repositorios Git, permite almacenar gratis repositorios Git

GitHub

Acceso web para repositorios Git

Gratuito para proyectos libres

"Red social" para programadores,  el código es la estrella

Source: jahya.net

Git y repositorios remotos

git clone

Clonar un repositorio es descargar una copia en local

git push

Subir commits locales al repositorio remoto

git pull

Actualizar la copia local con nuevos cambios remotos

Ejemplo:

  1. Clonar repositorio
  2. Hacer un commit
  3. Subir cambios al repositorio remoto
  4. Bajar cambios del repositorio remoto

Ejemplo:

  1. Clonar repositorio
  2. Hacer un commit
  3. Subir cambios al repositorio remoto
  4. Bajar cambios del repositorio remoto

git push origin master

origin apunta al repositorio remoto (url)

master es la rama de trabajo

Trabajemos con repositorios remotos!

Utilizaremos GitHub

Para ello necesitamos:

¿Qué es un fork?

Un fork es una copia de un repositorio

Normalmente, cuando se quiere contribuir a un proyecto de open source, no se pueden subir commits al repositorio remoto por falta de permisos

La manera de trabajar es: 

  1. Crear el fork con tu cuenta de GitHub
  2. Clonar el fork en local
  3. Hacer los cambios en local
  4. Subir cambios al fork remoto
  5. Crear el pull request

git clone

git add, git commit

git push

¿Qué es un pull request?

Petición de que el repositorio destino haga pull del nuestro

Solicitamos al repositorio padre que acepte los cambios que hemos hecho en nuestro fork

Los pull request se hacen desde GitHub

 

Normalmente hay revisores, que aceptan el pull request si están de acuerdo con los cambios

Ejercicio

  1. Clona tu fork en local
  2. Añade un fichero que se llame "nombre_apellido".txt (ejemplo ada_lovelace.txt)
  3. Haz un commit con este cambio
  4. Comprueba el histórico de cambios, para comprobar que tu commit está bien hecho
  5. Comprueba que no haya cambios en el repositorio remoto
  6. Sube este cambio al repositorio remoto
  7. Haz un pull request

Branching

Cuando un desarrollador empieza una nueva funcionalidad o resuelve un bug, crea una nueva rama donde trabaja, y cuando la termina, fusiona su rama con la rama principal (master)

Las ramas sirven para trabajar en varias features (funcionalidades) de un proyecto a la vez

source: atlassian.com

Crear/movese entre ramas

git branch

git branch <branch_name>

git branch -d <branch_name>

Listado de todas las ramas

Crear una rama llamada <branch_name>

Borrar la rama <branch_name>

git checkout <branch_name>

git checkout -b <branch_name>

Cambiar a rama <branch_name>

Crear y hacer check out de la rama <branch_name>

Mergear ramas

Cuando el desarrollo de la rama termina, se suele mergear con la rama principal (master, por ejemplo)

Esto significa llevar los cambios hechos de una rama a la principal, junto con su historia de commits

source: atlassian.com

Mergear ramas

git checkout rama_destino

git merge rama_origen

Trae los cambios de rama_origen a la rama en la que estamos situados

Ejercicio 2

4. Oh no!! Un bug en producción!! Resulta que el link no está apuntando a GitHub, sino que apunta a Bitbucket!!

2. El jefe ha pedido aplicar estilos a index.html. Para ello, crearemos una nueva rama "feature_style". Trabajaremos en ella.

3. Haz la rama "feature_style", centra el contenido y haz el primer commit.

5. Hay que dejar la rama "feature_style", volver a la rama "master" y crear una nueva rama "bugfix" para solucionar el problema!!

6. Lo dicho, crea la rama "bugfix", sitúate en ella, soluciona el bug, y haz commit.

7. Ya está corregido? Comprueba que el link ahora te redirige a GitHub! Es el momento de mergear los cambios a la rama principal "master"

8. Sitúate en master, y haz un merge de la rama "bugfix" sobre "master". El fix deberá estar resuelto en master

9. Ahora vuelve a terminar tu trabajo en "feature_style". Cuando termines, mueve los cambios a master!!

Avanzado!!!

En Git hay mucho más!!!

.gitignore

git stash

git rebase

git reset

Algunos recursos

Tutorial introductorio interactivo

Chuleta de git interactiva

Gracias!!!