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. 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
  2. ./ 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
  3. $ 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
  4. Snapshots ./ working/ snapshot-1/ snapshot-2/ snapshot-3/ * Para no olvidarnos

    de qué hicimos en ese snapshot, guardamos un mensaje
  5. $ 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
  6. 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
  7. 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
  8. 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
  9. 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!
  10. $ 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!
  11. $ 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!
  12. 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.
  13. 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.
  14. 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
  15. $ 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
  16. 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
  17. 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
  18. 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
  19. $ 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” ***
  20. $ cat ./snapshot-123/message Sistema Distribuido Agregar el feature Y Parent:

    snapshot-122 Author: Nicolás Sanguinetti <[email protected]> * 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” ***
  21. $ cat ./snapshot-123/message Sistema Distribuido Agregar el feature Y Parent:

    snapshot-122 Author: Nicolás Sanguinetti <[email protected]> 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” ***
  22. $ 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
  23. $ 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
  24. $ 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!
  25. $ cat ./ac3478d…/message Merges Merge branch ‘foo’ into ‘master’ Parent:

    da4b923 77de68d Author: Nicolás Sanguinetti <[email protected]> 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!
  26. $ 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”
  27. 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
  28. $ 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
  29. $ 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
  30. $ 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
  31. $ 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