Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Una Parábola sobre Git

Una Parábola sobre Git

WARNING! Spanish ahead!

Una adaptación del blogpost de Tom Preston-Werner "A Git Parable" para presentar en el grupo de usuarios de ruby de Uruguay.

Nicolás Sanguinetti

September 11, 2012
Tweet

More Decks by Nicolás Sanguinetti

Other Decks in Programming

Transcript

  1. View Slide

  2. The Git Parable
    http://tom.preston-werner.com/2009/05/19/the-git-parable.html
    * Lo único que tenemos son un editor de texto y herramientas para manejar el FS
    * Somos gente grande y responsable, y queremos usar un VCS
    * Somos programadores ruby, así que vamos a reinventar la rueda :D

    View Slide

  3. ./
    working/
    * Empezamos a escribir código adentro de un directorio “working”

    View Slide

  4. ./
    working/
    snapshot-1/
    Snapshots
    * Cuando llegamos a un punto interesante, copiamos el directorio a “snapshot-1”
    * Ahora siempre podemos volver atrás sobreescribiendo ./working on ./snapshot-x

    View Slide

  5. $ cp -r ./working ./snapshot-1
    ./
    working/
    snapshot-1/
    Snapshots
    * Cuando llegamos a un punto interesante, copiamos el directorio a “snapshot-1”
    * Ahora siempre podemos volver atrás sobreescribiendo ./working on ./snapshot-x

    View Slide

  6. Snapshots
    ./
    working/
    snapshot-1/
    snapshot-2/
    snapshot-3/
    * Para no olvidarnos de qué hicimos en ese snapshot, guardamos un mensaje

    View Slide

  7. $ echo “Did X” > ./snapshot-3/message
    Snapshots
    ./
    working/
    snapshot-1/
    snapshot-2/
    snapshot-3/
    message
    * Para no olvidarnos de qué hicimos en ese snapshot, guardamos un mensaje

    View Slide

  8. Hacemos un release!
    ./
    working/

    snapshot-99/ # <= release

    View Slide

  9. …y seguimos trabajando
    ./
    working/

    snapshot-99/ # <= release :)

    snapshot-108/
    snapshot-109/

    View Slide

  10. Y nos reportan un bug
    ./
    working/

    snapshot-99/ # <= release CON BUGS :(

    snapshot-108/
    snapshot-109/
    * Es fácil volver al snapshot del release
    * Escribimos un poco de código, arreglamos el bug
    * Pero ahora, ¿Qué nombre le ponemos al snapshot?
    * snapshot-110 interrumpe el flujo y no podemos saber la ascendencia de los commits

    View Slide

  11. Y nos reportan un bug
    ./
    working/

    snapshot-99/ # <= release CON BUGS :(

    snapshot-108/
    snapshot-109/
    $ cp -r ./snapshot-109 ./working
    * Es fácil volver al snapshot del release
    * Escribimos un poco de código, arreglamos el bug
    * Pero ahora, ¿Qué nombre le ponemos al snapshot?
    * snapshot-110 interrumpe el flujo y no podemos saber la ascendencia de los commits

    View Slide

  12. Y nos reportan un bug
    ./
    working/

    snapshot-99/ # <= release CON BUGS :(

    snapshot-108/
    snapshot-109/
    $ cp -r ./snapshot-109 ./working
    $ cp -r ./working ???
    * Es fácil volver al snapshot del release
    * Escribimos un poco de código, arreglamos el bug
    * Pero ahora, ¿Qué nombre le ponemos al snapshot?
    * snapshot-110 interrumpe el flujo y no podemos saber la ascendencia de los commits

    View Slide

  13. http://www.123rf.com/photo_2782230_vector-silhouette-of-tree-branches-cron-isolated-on-the-white-background.html
    * Es fácil seguir el camino desde la punta de una rama al tronco
    * En cada bifurcación tenemos que saber “de dónde venimos”

    View Slide

  14. Branches
    ./
    working/

    snapshot-99/

    snapshot-108/
    snapshot-109/
    * Podemos guardar el padre en cada snapshot
    * Ya tenemos este archivo “message” con metadata, lo metemos ahí
    ***
    * Repetimos esto para todos los snapshots
    * Podemos calcular la ascendencia fácil ahora, siguiendo los messages
    * Tenemos un árbol!

    View Slide

  15. $ cp -r ./working ./snapshot-110
    Branches
    ./
    working/

    snapshot-99/

    snapshot-108/
    snapshot-109/
    snapshot-110/
    * Podemos guardar el padre en cada snapshot
    * Ya tenemos este archivo “message” con metadata, lo metemos ahí
    ***
    * Repetimos esto para todos los snapshots
    * Podemos calcular la ascendencia fácil ahora, siguiendo los messages
    * Tenemos un árbol!

    View Slide

  16. $ cp -r ./working ./snapshot-110
    $ echo “Parent: snapshot-99” >> ./snapshot-110/message
    Branches
    ./
    working/

    snapshot-99/

    snapshot-108/
    snapshot-109/
    snapshot-110/
    * Podemos guardar el padre en cada snapshot
    * Ya tenemos este archivo “message” con metadata, lo metemos ahí
    ***
    * Repetimos esto para todos los snapshots
    * Podemos calcular la ascendencia fácil ahora, siguiendo los messages
    * Tenemos un árbol!

    View Slide

  17. Branches
    ./
    working/

    snapshot-109/ # un branch
    snapshot-110/ # otro branch

    snapshot-123/
    * Es difícil acordarse de los distintos branches de nuestro árbol
    * En general, cuando hacemos una bifurcación, tenemos un objetivo tipo “Feature X”, “Release
    1.0.1”, etc
    * Cómo poner nombres? nombrar todo snapshot es ineficiente
    * Sólo necesitamos identificar la punta
    ***
    * Creamos un archivo “branches” donde ponemos los nombres
    * Cuando agregamos un snapshot, actualizamos el archivo indicando a dónde apunta el
    branch ahora.

    View Slide

  18. Branches
    ./
    working/

    snapshot-109/ # un branch
    snapshot-110/ # otro branch

    snapshot-123/
    branches
    $ echo “master: snapshot-123” >> ./branches
    $ echo “v1.0.0: snapshot-99” >> ./branches
    $ echo “v1.0.1: snapshot-110” >> ./branches
    * Es difícil acordarse de los distintos branches de nuestro árbol
    * En general, cuando hacemos una bifurcación, tenemos un objetivo tipo “Feature X”, “Release
    1.0.1”, etc
    * Cómo poner nombres? nombrar todo snapshot es ineficiente
    * Sólo necesitamos identificar la punta
    ***
    * Creamos un archivo “branches” donde ponemos los nombres
    * Cuando agregamos un snapshot, actualizamos el archivo indicando a dónde apunta el
    branch ahora.

    View Slide

  19. Tags
    ./
    working/

    snapshot-123/
    branches
    * No todos los branches son iguales
    * Hay branches que son punteros que se mueven
    * Hay branches que quedan estáticos apuntando a un commit
    ***
    * Ahora evitamos accidentes donde tratamos un tag como una branch, por ejemplo

    View Slide

  20. $ echo “v1.0.0: snapshot-99” >> ./tags
    $ echo “v1.0.1: snapshot-110” >> ./tags
    Tags
    ./
    working/

    snapshot-123/
    branches
    tags
    * No todos los branches son iguales
    * Hay branches que son punteros que se mueven
    * Hay branches que quedan estáticos apuntando a un commit
    ***
    * Ahora evitamos accidentes donde tratamos un tag como una branch, por ejemplo

    View Slide

  21. Sistema Distribuido
    ./
    working/
    snapshot-123/
    snapshot-124/

    snapshot-144/
    snapshot-145/
    * Trabajar solo es aburrido: invitamos a alguien
    ***
    * Nuestro nuevo compañero viaja mucho, y no tiene internet seguido
    * Viaja por una semana. Mientras tanto, los dos programamos un montón
    * Cuando vuelve es hora de copiarnos snapshots… pero los nombres son los mismos! :(
    * Y ni siquiera sabemos el autor de cada snapshot

    View Slide

  22. Sistema Distribuido
    ./
    working/
    snapshot-123/
    snapshot-124/

    snapshot-144/
    snapshot-145/
    ./
    working/
    snapshot-123/
    * Trabajar solo es aburrido: invitamos a alguien
    ***
    * Nuestro nuevo compañero viaja mucho, y no tiene internet seguido
    * Viaja por una semana. Mientras tanto, los dos programamos un montón
    * Cuando vuelve es hora de copiarnos snapshots… pero los nombres son los mismos! :(
    * Y ni siquiera sabemos el autor de cada snapshot

    View Slide

  23. Sistema Distribuido
    ./
    working/
    snapshot-123/
    snapshot-124/

    snapshot-144/
    snapshot-145/
    ./
    working/
    snapshot-123/
    snapshot-124/

    snapshot-144/
    snapshot-145/
    snapshot-146/
    snapshot-147/
    snapshot-148/
    snapshot-149/
    * Trabajar solo es aburrido: invitamos a alguien
    ***
    * Nuestro nuevo compañero viaja mucho, y no tiene internet seguido
    * Viaja por una semana. Mientras tanto, los dos programamos un montón
    * Cuando vuelve es hora de copiarnos snapshots… pero los nombres son los mismos! :(
    * Y ni siquiera sabemos el autor de cada snapshot

    View Slide

  24. $ cat ./snapshot-123/message
    Sistema Distribuido
    Agregar el feature Y
    Parent: snapshot-122
    * Lo hablamos y llegamos a una solución
    * Primero, el archivo “message” tiene que tener el autor.
    ***
    * Segundo, los nombres secuenciales no nos sirven
    * Usemos el SHA1 de estos archivos “message”
    * Para evitar problemas, agreguemos la fecha, ahora este archivo es “único”
    ***

    View Slide

  25. $ cat ./snapshot-123/message
    Sistema Distribuido
    Agregar el feature Y
    Parent: snapshot-122
    Author: Nicolás Sanguinetti
    * Lo hablamos y llegamos a una solución
    * Primero, el archivo “message” tiene que tener el autor.
    ***
    * Segundo, los nombres secuenciales no nos sirven
    * Usemos el SHA1 de estos archivos “message”
    * Para evitar problemas, agreguemos la fecha, ahora este archivo es “único”
    ***

    View Slide

  26. $ cat ./snapshot-123/message
    Sistema Distribuido
    Agregar el feature Y
    Parent: snapshot-122
    Author: Nicolás Sanguinetti
    Date: Tue Sep 11 21:59:54 UTC 2012
    * Lo hablamos y llegamos a una solución
    * Primero, el archivo “message” tiene que tener el autor.
    ***
    * Segundo, los nombres secuenciales no nos sirven
    * Usemos el SHA1 de estos archivos “message”
    * Para evitar problemas, agreguemos la fecha, ahora este archivo es “único”
    ***

    View Slide

  27. $ hash=$(sha1sum ./snapshot-$i/message | cut -d“ ” -f1)
    $ mv ./snapshot-$i $hash
    Sistema Distribuido
    * Renombramos todos los snapshots…
    ***
    * No es lo más lindo, pero…
    * Como para un mismo autor, fecha, descripción y parent tenemos un mismo ./message, un
    mismo snapshot tiene el mismo hash en cualquier lado
    * Podemos copiar los snapshots entre computadoras y nada se va a romper

    View Slide

  28. $ hash=$(sha1sum ./snapshot-$i/message | cut -d“ ” -f1)
    $ mv ./snapshot-$i $hash
    Sistema Distribuido
    ./
    working/
    356a192b7913b04c54574d18c28d46e6395428ab/
    da4b9237bacccdf19c0760cab7aec4a8359010b0/
    77de68daecd823babbb58edb1c8e14d7106e83bb/

    ac3478d69a3c81fa62e60f5c3696165a4e5e6ac4/
    branches
    tags
    * Renombramos todos los snapshots…
    ***
    * No es lo más lindo, pero…
    * Como para un mismo autor, fecha, descripción y parent tenemos un mismo ./message, un
    mismo snapshot tiene el mismo hash en cualquier lado
    * Podemos copiar los snapshots entre computadoras y nada se va a romper

    View Slide

  29. $ cat ./ac3478d…/message
    Merges
    * Mi compañero volvió del viaje y queremos juntar el código
    * Copiamos todos los snapshots a mi máquina, y ahora sólo necesitamos un snapshot que
    vuelva a unir los dos branches
    * Lo único especial de este snapshot es que tiene DOS parents
    ***
    * Una vez que creo este snapshot puedo seguir toda la linea de tiempo (ambas 2) para atrás
    * Ahora mi compañero puede copiarse todos los snapshots de mi máquina y todo funciona!

    View Slide

  30. $ cat ./ac3478d…/message
    Merges
    Merge branch ‘foo’ into ‘master’
    Parent: da4b923 77de68d
    Author: Nicolás Sanguinetti
    Date: Tue Sep 11 22:46:21 UTC 2012
    * Mi compañero volvió del viaje y queremos juntar el código
    * Copiamos todos los snapshots a mi máquina, y ahora sólo necesitamos un snapshot que
    vuelva a unir los dos branches
    * Lo único especial de este snapshot es que tiene DOS parents
    ***
    * Una vez que creo este snapshot puedo seguir toda la linea de tiempo (ambas 2) para atrás
    * Ahora mi compañero puede copiarse todos los snapshots de mi máquina y todo funciona!

    View Slide

  31. $ mkdir ./staging
    Staging Area
    ./
    working/
    staging/
    356a192b7913b04c54574d18c28d46e6395428ab/

    ac3478d69a3c81fa62e60f5c3696165a4e5e6ac4/
    branches
    tags
    * Por prolijos que querramos ser, siempre hay interrupciones (Fix x / Add y / etc)
    * O cuando vas a crear un snapshot, te das cuenta que deberían ser dos snapshots separados
    ***
    * Para estos casos, es útil tener una “staging area”

    View Slide

  32. Staging Area
    ./
    working/
    foo
    bar
    baz
    staging/
    * Antes de crear cada snapshot, agregamos las cosas
    * Cuando creamos un snapshot, borramos todo lo que hay en el staging area

    View Slide

  33. $ cp ./working/foo ./staging/
    Staging Area
    ./
    working/
    foo
    bar
    baz
    staging/
    foo
    * Antes de crear cada snapshot, agregamos las cosas
    * Cuando creamos un snapshot, borramos todo lo que hay en el staging area

    View Slide

  34. $ cp ./working/foo ./staging/
    $ cp ./working/bar ./staging/
    Staging Area
    ./
    working/
    foo
    bar
    baz
    staging/
    foo
    bar
    * Antes de crear cada snapshot, agregamos las cosas
    * Cuando creamos un snapshot, borramos todo lo que hay en el staging area

    View Slide

  35. $ cp ./working/foo ./staging/
    $ cp ./working/bar ./staging/
    $ # create snapshot from ./staging
    Staging Area
    ./
    working/
    foo
    bar
    baz
    staging/
    foo
    bar
    a9334987ece78b6fe8bf130ef00b74847c1d3da6/
    * Antes de crear cada snapshot, agregamos las cosas
    * Cuando creamos un snapshot, borramos todo lo que hay en el staging area

    View Slide

  36. $ cp ./working/foo ./staging/
    $ cp ./working/bar ./staging/
    $ # create snapshot from ./staging
    $ rm ./staging/*
    Staging Area
    ./
    working/
    foo
    bar
    baz
    staging/
    a9334987ece78b6fe8bf130ef00b74847c1d3da6/
    * Antes de crear cada snapshot, agregamos las cosas
    * Cuando creamos un snapshot, borramos todo lo que hay en el staging area

    View Slide

  37. http://git-scm.com/book
    “El manual”

    View Slide

  38. Gracias :)
    http://github.com/foca
    http://twitter.com/godfoca
    https://speakerdeck.com/u/foca/p/una-parabola-sobre-git

    View Slide