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
Cuando llegamos a un punto interesante, copiamos el directorio a “snapshot-1” * Ahora siempre podemos volver atrás sobreescribiendo ./working on ./snapshot-x
<= 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
<= 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
<= 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
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!
… 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!
./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!
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.
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.
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
>> ./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
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
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
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
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” ***
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” ***
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” ***
./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
./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
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!
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!
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”
./ 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
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
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