Introducción a

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

Quién soy

gaitan@gmail.com - http://mgaitan.github.io

En el principio...

  • flujo totalmente lineal
  • impide colaboración
  • no hay historia.
  • dónde hice qué
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!

Algunos creyeron evolucionar

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

CVS/SVN

Todo un avance, pero...

Y llegaron los sistemas distribuídos

Git: un DVCS rapidísimo y potente

Muy bien diez felicitado en...

Los peros

Y no es tan fácil

Instalación

Windows

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

Linux

apt-get install git

OS X

brew install git

Configuración

Quién sos

git config --global user.name "Martín Gaitán"
git config --global user.email gaitan@gmail.com

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...

.gitignore

No queremos control de todo

*.pyc
*.swp
/build/
/doc/[abc]*.txt
.pypirc
*.egg-info
  • 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 (!)

Repos remotos

$ git remote -v
origin git://github.com/mgaitan/intro-git.git (fetch)
origin git://github.com/mgaitan/intro-git.git (push)

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

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

Source: Los Tigres del Norte, De rama en rama

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.

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

Mezclar

Desde otra rama. Ej: master

git merge [--no-ff] experimento_loco

En general hace magia

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

Rebase

# en feature-xyz
git rebase master

Listo, dónde subo mi código?

Github

Código mata curriculum

Más info / práctica

Preguntas?

(Muchas gracias)

SpaceForward
Left, Down, Page DownNext slide
Right, Up, Page UpPrevious slide
POpen presenter console
HToggle this help