Skip to content

Latest commit

 

History

History
711 lines (407 loc) · 9.89 KB

slides.rst

File metadata and controls

711 lines (407 loc) · 9.89 KB
title:Introducción a Git
venue:8vas Jornadas de Software Libre de la UNNOBA
Author: Martín Gaitán
css:slides.css
skip-help:true

Introducción a

img/Git.png

Martín Gaitán / @tin_nqn_ / #8JSL / CC-by-sa


data-reveal:1

Quién soy

  • Compañero de Nati, Zamba y Minou
  • Hincha de Boca y del dulce de leche
  • Ingeniero en Computación (UNC)
  • Emprendedor (@Phasety)
  • Pythonista desde 2007
  • ¿Git? Más que experto, ex-principiante

[email protected] - http://mgaitan.github.io


En el principio...

img/01-copies.png

Note

  • flujo totalmente lineal
  • impide colaboración
  • no hay historia.
  • dónde hice qué

data-rotate:90
data-y:r1400
From: Juan <juancho@todavianosegit.com>
To: Pedro <pete@todavianosegit.com>
Subject: Trabajo

Peter, acá te mando el zip con la última versión
que incluye mi parte del trabajo

----
From: Pedro <pete@todavianosegit.com>
To: Juan <juancho@todavianosegit.com>
Subject: Re: Trabajo

Juancito, me olvidé de avisarte que yo ya había
hecho esa parte y cambié la API!

data-rotate:90
data-x:r-1400

Algunos creyeron evolucionar

img/dropbox.jpg

Note

  • soluciona la sincronizacion de la última versión
  • sin merge

data-rotate:90
data-x:r-1400

img/meme1.jpg


data-rotate:90
data-y:r1400

CVS/SVN

Todo un avance, pero...

  • Centralizado
    • Cuello de botella y Talón de Aquiles
    • Dependiente de la red para casi todo
    • Commits "bomba"
  • Ramas difíciles
    • Flujo lineal
    • Dificulta el cambio de contexto/colaboración

Y llegaron los sistemas distribuídos

  • Git / Mercurial / Bazaar
  • Todas las copias son repositorios
  • Dependen menos de la red
  • múltiples flujos posibles
  • Más respaldos
  • Experimentación / Branching fácil

data-rotate:90
data-x:r-1400

Git: un DVCS rapidísimo y potente

Muy bien diez felicitado en...

  • ¡Velocidad!
  • Integridad de datos
  • Poca depencia de red
  • Redundancia: todos son clones
  • Branching y merging fácil: flujo versátil
  • Bancarse proyectos como Linux
  • Github

data-rotate:90
data-y:r1400

Los peros

  • La documentación también es distribuída ;-)
  • La UI está llena de WTF!
  • No hay una manera obvia
  • Muchos nombres para referirse a lo mismo

data-rotate:90
data-x:r-1400

Y no es tan fácil

img/img_0.png


img/img_2.png


img/img_5.png


img/img_9.png


data-rotate:0
data-y:r1400

Instalación

Windows

http://code.google.com/p/msysgit

Linux

apt-get install git

OS X

brew install git

data-rotate:90
data-y:r1400

Configuración

Quién sos

git config --global user.name "Martín Gaitán"
git config --global user.email [email protected]

Tu editor

git config --global core.editor vim

Empezando

Crear un repo local

git init

Luego se pueden declarar repos remotos

git remote add origin https://github.com/mgaitan/intro-git.git

O directamente clonar un repositorio

git clone https://github.com/mgaitan/intro-git.git .

Creando commits

Cambios específicos

git add README.txt
git commit -m 'Contenido básico en el README'

O todos los cambios en archivos trackeados

git commit -am "El reactor nuclear funciona.
>    Faltan tests del disparador"

¿Dónde estoy?

La brújula

git status

El libro de viaje

git log

GUIs

gitk / gitg / tig / qgit

Deshaciendo

Corregir el último commit

git commit --amend

Quitar del stage

git reset HEAD file.py  # o bien
git rm --cached file.py

Restaurar archivo

git checkout file.java  # por defecto ``HEAD``
git checkout [REV] -- file.java     # SHA1, tag, rama

Revertir commit

git revert 1776f5

Borrando

Unstage (quitar del proximo commit)

git rm --cached file.py

Dejar de trackear:

git rm file.py

¿Qué cambié?

Cambios locales

git diff

Cambios en stage

git diff --cached

Respecto a una revision

git diff 1776f5

Visualmente

meld .  # winmerge, kdiff3, otros...

data-rotate:90
data-x:r-1400

.gitignore

No queremos control de todo

*.pyc
*.swp
/build/
/doc/[abc]*.txt
.pypirc
*.egg-info

Note

  • Blank lines or lines starting with # are ignored
  • Standard glob patterns work
  • End pattern with slash (/) to specify a directory
  • Negate pattern with exclamation point (!)

data-rotate:90
data-y:r1400

Repos remotos

  • Son técnicamente iguales a nuestra copia de trabajo
  • Pueden ser locales o remotos (ssh, https, etc.)
$ git remote -v
origin git://github.com/mgaitan/intro-git.git (fetch)
origin git://github.com/mgaitan/intro-git.git (push)

data-rotate:90
data-x:r-1400

Empujando al remoto

Sin default

git push <remote> <rbranch>

O definimos default remoto para la rama actual

git push -u <remote> <rbranch>

Y luego

git push

data-rotate:90
data-y:r1400

Traeme lo nuevo (pull)

git pull [<remote> <rbranch>]

pull == fetch + merge


Crear tags

Ponerle "nombre" a una revisión.

git tag v0.1.0

Los tags son locales, pero se pueden pushear

git push --tags

Ramas

De rama en rama se ve aquel amor que juraba que no me habría de olvidar

—Los Tigres del Norte, De rama en rama

  • Cambio de contexto indoloro (locales y rápidos)
  • Son punteros móviles a un commit
  • La rama por omisión se llama master

Note

Factores externos necesitan inevitablemente de cambios de contexto.

  • Un bug severo se manifiesta en la última versión sin previo aviso.
  • El plazo para alguna presentación se acorta.
  • Un desarrollador que tiene que ayudar en una sección indispensable del proyecto está por tomar licencia.
  • Simplemente necesitas probar una idea

En cualquier caso, debes soltar abruptamente lo que estás haciendo y enfocarte en una tarea completamente diferente.


data-rotate:90
data-x:r-1400

Creando una rama

git branch experimento_loco
git checkout experimento_loco

o directamente:

git checkout -b experimento_loco

Más comandos para ramas

Cambiar de rama

git checkout NOMBRE_RAMA

checkout requiere todo limpio. stash es nuestra alfombra para esconder por un rato

git stash
git checkout NOMBRE_RAMA
...
git checkout NOMBRE_RAMA_ORIGINAL
git stash pop

data-rotate:90
data-y:r1400

Mezclar

Desde otra rama. Ej: master

git merge [--no-ff] experimento_loco

img/merge1.png


data-rotate:90
data-x:r-1400

En general hace magia

img/baby-git.png


Pero a veces no alcanza (conflictos)

Corregimos a mano

[corregimos los conflictos en el editor]
git add file.rb
git commit -m 'mezclando la rama X. corregi a mano el merge ...'

O forzamos lo nuestro / lo de ellos

git checkout --ours file.rb  # o --theirs
git add file.rb
git commit

data-rotate:0
data-y:r1400

Rebase

  • Mover el origen de la rama
  • Muy útil para reescribir la historia
  • Recomendado antes de un merge a master

img/merge2.png

img/merge3.png

# en feature-xyz
git rebase master

data-rotate:90
data-y:r1400

Listo, dónde subo mi código?

  • Bitbucket / Gitorius
  • Server del trabajo / facu
  • Pero especialmente...

img/github_logo.jpg


data-rotate:90
data-x:r-1400

Github

  • No es sólo hosting git gratis (para software libre)
  • Es una plataforma social y profesional
  • ¡Colaborar con OSS nunca fue tan fácil!
  • Gestión de proyectos / comunicación / revisión / etc.
  • Enterarse de tendencias y aprender de cracks
Código mata curriculum

data-rotate:90
data-y:r1400

Más info / práctica


data-rotate:90
data-rotate-y:180
data-y:r1400

Preguntas?


(Muchas gracias)