Taller de GIT

Tomas Delvechio
tdelvechio@unlu.edu.ar
@tdelvechio

UNLu - 2015

(Como usar git sin tener que recurrir

a Stackoverflow a cada paso)

Agenda del curso

  • Sprint 0: Cuestiones generales
     
  • Sprint 1: Introducción al VCS y GIT
     
  • Sprint 2: Fundamentos de GIT
     
  • Sprint 3: Branching en GIT

Objetivo del Curso

  • Entender y usar Git
  • Poder conocer ventajas e inconvenientes entre Git y otros VCS
  • Usar Branching de forma cotidiana
  • Pensar esquemas de colaboración en base a componentes compartidos

Requisitos del Curso

  • Equipo con acceso de administracion (Instalar cosas)
  • Codigo de ejemplo

Este curso es una adaptación del contenido del Libro Pro Git Versión 2 en español

Recursos

Pagina Oficial: https://git-scm.com/

Libro Oficial: Pro Git (Versión en Español)

Plataformas de colaboración:

Github

Bitbucket

Sprint 1

Introducción a GIT y VCS

Resumen

  • Concepto de VCS
  • Terminología
  • Funcionamiento
  • Interfaz
  • Instalación y configuración

¿Que es GIT?

VCS Distribuido

Creado en 2005

Flujos de Trabajo dinámicos

Equipos de trabajos de cualquier tamaño

Objetivos de un VCS

Backup de código

Tracking de cambios

Colaboración

Conceptos fundacionales

  • Speed
  • Simple design
  • Strong support for non-linear development (thousands of parallel branches)
  • Fully distributed
  • Able to handle large projects like the Linux kernel efficiently (speed and data size)

Terminología principal

Repositorios

Commits

Branches

Profundizando ideas

  • Totalmente distribuido
    • Conectividad no limitante
  • Git (comando y sistema)
  • Github o Bitbucket:
    Plataformas de colaboración

Funcionamiento de GIT

VCS con Diffs vs Snapshot

GIT

SVN

Operaciones locales

Integridad de archivos y operaciones

Secciones

Workflow basico

Uso de GIT

CLI -> git (A usar en el taller)

Interfaces

  • GUI para todos los entornos
  • IDE's con soporte para las operaciones
  • Diff visualization tool (Meld)

Forma de uso de GIT

Instalación

$ lsb_release -a
No LSB modules are available.
Distributor ID:	Ubuntu
Description:	Ubuntu 14.04.2 LTS
Release:	14.04
Codename:	trusty
$ sudo apt-get install git
...
$ git --version
git version 1.9.1

Configuración

3 niveles de configuración

 

Sistema             /etc/gitconfig

Global               ~/.gitconfig

Local            <path_proyecto>/.git/config

Parámetros a configurar

# Nombre del desarrollador
$ git config --global user.name "Antonio Fargas"

# Correo de contacto del desarrollador
$ git config --global user.email huggy@bear.com

# Editor de commits
$ git config --global core.editor nano

# Proxy config
$ git config --global http.proxy http://proxy.unlu.edu.ar:8080
$ git config --global https.proxy https://proxy.unlu.edu.ar:8080

# Ver configuraciones
$ git config --list

# Ver valor de un parametro particular
$ git config user.name

Ayuda!!!!

# Ayuda sobre un comando
$ git help config
# o
$ git config --help

# Ver el manual
$ man git-config

# Ayuda para cualquier comando
$ git help <lo_que_sea>

# Manual para cualquier comando
$ man git-<lo_que_sea>

Sprint 2

Fundamentos de GIT

Resumen

  • Obtención de repositorio
  • Tareas locales básicas con archivos y commits
  • Introducción básica a branches y tags
  • Manejo básico de repositorios remotos

Obtención de repositorios

Init vs clone

Casos de uso diferentes

 

Si hay código sin versionar y se desea comenzar a versionarlo, se usa init

 

Si se quiere comenzar a trabajar en un repositorio git existente, se usa clone

Manos a la obra

Buscar un proyecto sin versionar

Iniciar un repositorio

Primeros commits

Iniciar un repositorio

# Moverse al proyecto
$ cd <proyecto_sin_versionar>

# Iniciar el repositorio
$ git init

# Añadir los archivos al nuevo repo
$ git add *

# Commit inicial
$ git commit -m 'Iniciando nuevo repo'

Clonar un repo

$ git clone https://github.com/SIU-Toba/docker-toba docker-toba-local
$ cd docker-toba-local

¿Clone vs SVN checkout?

Ciclo de vida de los archivo

Archivos: Tracked y untracked

Estados

# Moverse al proyecto
$ cd <proyecto-git>

# Crear un nuevo archivo
$ echo "Licencia de USO" > LICENSE

# Estado del nuevo archivo: Untracked
$ git status

# Untracked -> tracked y staged
$ git add LICENSE
$ git status

# Staged -> Commited
$ git commit -m 'Agregado nuevo archivo'
$ git status

Modificando archivos

# Modificar el archivo
$ echo "Agregar contenido" >> LICENSE

# Estado: Tracked (Modified)
$ git status

# Modified -> Staged
$ git add LICENSE
$ git status

# Se vuelve a modificar el archivo
$ echo "mas contenido agregado" >> LICENSE

# Estados: Modified y Staged (?)
$ git status

git add (usos)

  • Untracking -> Tracking
    (Agrega archivos nuevos al VCS)
  • Modified -> Staging
    (Prepara cambios para el commit)
  • Resolución de conflictos

Git status resumido

Ignorar archivos

<proyect_path>
    |-> README
    |-> code.c
    |-> .git/
    |-> tmp/
    |-> .gitignore

Ejemplo de archivo .gitignore:

*.so        *.[oa]
*~          tmp/
*.pdf       *.bkp
!*.c        build/

¿Mas ejemplos?

https://github.com/github/gitignore

Git diff

  • Control de cambios de grano fino
  • No mira quien cambio, sino que cambios se hicieron
# Sin cambios -> Modified
$ echo "Algunos cambios" >> README
$ git status

# Modified -> Staged
$ git add README
$ git status

# Modified and Staged
$ echo "Otros cambios mas" >> README
$ git status

# Ver cambios
$ git diff # Solo modified
$ git diff --staged # Solo staged
$ git diff --cached # Sinónimo de staged

Git commit

  • Genera un snapshot del proyecto
  • Ingresa definitivamente en el proceso de VCS
# Commits con mensajes largos
$ git commit

# Commits con mensajes cortos
$ git commit -m 'Cierro issue #113'

# Commits vacíos (ERROR)
# Mas detalle (status + diff)
$ git commit -v

# Ahorrarse el Add
$ echo "Cambio nuevo" >> README
$ git commit -a -m 'Commit de cosas sin add'

Git output

# Salida generica
$ git commit -m 'Agregos diversos cambios'
[master 721d54f] Agregos diversos cambios
 2 files changed, 3 insertions(+), 1 deletion(-)
 create mode 100644 UnArchivoMas.txt

Elementos:

  • Branch y numero de commit
  • Comentario
  • Resumen de los cambios
  • Metadatos de archivos

Eliminación de archivos

# Borrar el archivo del filesystem
$ rm LICENSE 
$ git status
On branch master
Changes not staged for commit:
  (use "git add/rm <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	deleted:    LICENSE

no changes added to commit (use "git add" and/or "git commit -a")

# Revertir cambios no agregados
$ git checkout -- LICENSE

# Borrar archivo del filesystem y del VCS
$ git rm LICENSE

# Archivos no commiteados?
$ echo "Archivo nuevo" > BORRAR.txt
$ git add BORRAR.txt
$ git rm BORRAR.txt # ERROR
$ git rm -f BORRAR.txt

Otros comandos

# Mover archivos dentro del repositorio
$ git mv <source_path> <destination_path>

# Ver histórico de operaciones
$ git log
$ git log --graph

Deshacer cambios

# Agrega contenido al commit anterior
$ git commit --amend

# Staging -> modified
$ git reset HEAD some_added_file

# Modified -> unmodified
#    En este comando se pierde información
$ git checkout -- archivo_a_deshacer.txt

Repositorios remotos

Gestión de remotos

  • Desde un remoto podemos recibir cambios realizados por otros desarrolladores
  • Podemos enviar cambios a un remoto
  • Pueden diferir los remotos de los cuales se reciben cambios y a los que se envían
  • Sobre un remoto podemos tener dos niveles de permisos (Lectura y Escritura)
  • Se pueden recibir y enviar cambios desde N remotos de forma simultanea, sin tener que modificar el workflow de trabajo
  • Para incorporar un remoto, debemos agregarlo a nuestro repositorio. Si se usó git clone, esa operación ya se ocupo de agregar uno.

git remote add [nombre] [url]

[nombre]: Una referencia local a un remoto, para no tener que escribir la url en cada operación

[url]: La url del remoto sobre los que se aplican las operaciones

Recuperar de remotos

git pull master origin

git fetch origin

git merge master

origin: Un remoto "especial" que es interpretado como el default (Para no tener que escribirlo en el comando)

 

El comando de clonar lo crea para facilitar el workflow de trabajo

Enviar a remotos

git push [repository] [branch]

[repository]: Remoto al que se quieren enviar los cambios

 

[branch]: Branch desde el cual se deben extraer los cambios a ser enviados

# Inspeccion de informacion del remoto
$ git remote show origin
* remote origin
    Fetch URL: https://github.com/schacon/ticgit
    Push URL: https://github.com/schacon/ticgit
    HEAD branch: master
    Remote branches:
        master                tracked
        dev-branch            tracked
    Local branch configured for 'git pull':
        master merges with remote master
    Local ref configured for 'git push':
        master pushes to master (up to date)

# Se puede renombrar un remoto
$ git remote rename colega foxmolder

# Se puede eliminar un remoto
$ git remote rm foxmolder

Tagging

Taller de Git

By Tomas Delvechio

Taller de Git

Taller practico de GIT VCS, de inicial a avanzado

  • 1,143