Control de versiones con Mercurial -...

71
Control de versiones con Mercurial Lucas Chiesa Joaquín de Andrés 30 de septiembre de 2010 Presentación original por Martin Geisler. Primera traducción al español por Santiago Piccinini.

Transcript of Control de versiones con Mercurial -...

Control de versiones conMercurial

Lucas Chiesa Joaquín de Andrés

30 de septiembre de 2010

Presentación original por Martin Geisler.Primera traducción al español por Santiago Piccinini.

Agenda

Introduccion

UsandoMercurialFormas de trabajoBranchesEl modelo subyacenteUsando el historial

Extensiones interesantesCambiando la historia

Demonstracion

Resumiendo

2 / 29

¿Que esMercurial?Principales características:I Sistema de control de versiones distribuido y rápido.I Soporte robusto de branching y merging.I Muy flexible y extensible.

Fuerte enfoque en mantener la compatibilidad entre versiones:I Los nuevos clientes son compatibles con repositorios

viejos.I Los viejos clientes son compatibles con nuevas versiones

de servidores.Fuerte enfoque en la seguridad de la información:I Los archivos no se sobreescriben, se agrega al final.I Facilita la recuperación ante problemas de disco.

3 / 29

¿Por que distribuido?

Un sistema de control de versiones distribuido te da:I Versiones “offline” (locales).I Rápido conjunto de operaciones locales.

Efectos derivados:I Commits de cambios puntuales.I Se puede buscar en el historial localmente.I Branching y merging se convierten en una tarea natural

(no algo a lo que temer).I Permite mejores organizaciones de trabajo (workflows).

4 / 29

Testimonios

Martin Fowler, 2010: http://martinfowler.com/

5 / 29

¿Quien esta usandoMercurial?Mercurial es usado por:I Oracle para Java, OpenSolaris, NetBeans, OpenOffice, . . .I Mozilla para Firefox, Thunderbird, . . .I GoogleI muchos más. . .

6 / 29

Conceptos Clave

Juan

Repohello.cMakefile

I Directorio de trabajo: Es un directorio donde están losarchivos que queremos administrar.

I Changeset: Conjunto de cambios en los archivos entreuna revisión y la siguiente.

I Repositorio: Guarda el historial de nuestro trabajo(almacena los changesets).

7 / 29

Comandos ClaveLocales:I hg commit: guarda el estado actual del directorio de

trabajo en el repositorio (local).I hg update: actualiza el directorio de trabajo.I hg merge: une distintas líneas (branches) del historial.

Interacción con otro repositorio:I hg pull: trae changesets desde otro repositorio.I hg push: envía tus changesets hacia otro repositorio.I hg clone: crea un repositorio igual a otro.

8 / 29

Conceptos Clave 2

Juan

Repohello.cMakefile

commit

update

9 / 29

Conceptos Clave 2

Juan

Repohello.cMakefile

commit

updateRepo 2

push

pull

9 / 29

Trabajando solo

0

JulioA1

10 / 29

Trabajando solo

0

JulioA1 A2

10 / 29

Trabajando solo

0

JulioA1 A2 A3

10 / 29

Moviendo changesets o chancho va

0

Juan0

Pedro

0

Laura

11 / 29

Moviendo changesets o chancho va

0

JuanA1 0

Pedro

0

Laura

11 / 29

Moviendo changesets o chancho va

0

JuanA1 A2 0

Pedro

0

Laura

11 / 29

Moviendo changesets o chancho va

0

JuanA1 A2 0

PedroB1

0

Laura

11 / 29

Moviendo changesets o chancho va

0

Juan

B1

A1 A2 0

PedroB1

0

Laura

pull

11 / 29

Moviendo changesets o chancho va

0

Juan

B1

A1 A2 A3 0

PedroB1

0

Laura

11 / 29

Moviendo changesets o chancho va

0

Juan

B1

A1 A2 A3 0

PedroB1

0

LauraC1

11 / 29

Moviendo changesets o chancho va

0

Juan

B1

A1 A2 A3 0

PedroB1

0

LauraC1 C2

11 / 29

Moviendo changesets o chancho va

0

Juan

B1

A1 A2 A3 0

PedroB1

0

Laura

B1

C1 C2

pull

11 / 29

Moviendo changesets o chancho va

0

Juan

B1

A1 A2 A3 0

PedroB1

0

Laura

B1

C1 C2 C3

11 / 29

Moviendo changesets o chancho va

0

Juan

B1

A1 A2 A3 0

PedroB1

0

Laura

B1

A1 A2 A3

C1 C2 C3

pull

11 / 29

Moviendo changesets o chancho va

0

Juan

B1

A1 A2 A3 0

PedroB1

0

Laura

B1

A1 A2 A3

C1 C2 C3 C4

11 / 29

Control de versiones distribuidoMercurial duplica los repositorios:

Juan

Pedro Laura

12 / 29

Control de versiones distribuidoMercurial duplica los repositorios:

Juan

Pedro Laura

Laptopde Juan

12 / 29

Control de versiones distribuidoMercurial duplica los repositorios:

Juan

Pedro Laura

Laptopde Juan

Servidor

12 / 29

Control de versiones distribuidoMercurial duplica los repositorios:

Juan

Pedro Laura

Laptopde Juan

Servidor

12 / 29

Trabajo en equipo

Desktopde Juan

Laptopde

Pedro

Netbookde

Laura

codigo.empresa.com.ar

13 / 29

Trabajo en equipo. . . y cuando mi empresa crece. . . :

Irlanda

Argentina

India

14 / 29

Trabajo centralizadoTodos tienen acceso de escritura a un repositorio central:

Repositorio

Juan

LauraPedro

Diego

Fernando

15 / 29

BranchesSon un concepto clave:I Líneas de desarrollo paralelas.I Usadas para hacer releases.I Usadas para aislar cambios invasivos.

16 / 29

BranchesSon un concepto clave:I Líneas de desarrollo paralelas.I Usadas para hacer releases.I Usadas para aislar cambios invasivos.

1.0

16 / 29

BranchesSon un concepto clave:I Líneas de desarrollo paralelas.I Usadas para hacer releases.I Usadas para aislar cambios invasivos.

1.0

16 / 29

BranchesSon un concepto clave:I Líneas de desarrollo paralelas.I Usadas para hacer releases.I Usadas para aislar cambios invasivos.

1.0

16 / 29

BranchesSon un concepto clave:I Líneas de desarrollo paralelas.I Usadas para hacer releases.I Usadas para aislar cambios invasivos.

1.0

16 / 29

BranchesSon un concepto clave:I Líneas de desarrollo paralelas.I Usadas para hacer releases.I Usadas para aislar cambios invasivos.

1.0

1.0.1

16 / 29

BranchesSon un concepto clave:I Líneas de desarrollo paralelas.I Usadas para hacer releases.I Usadas para aislar cambios invasivos.

1.0

1.0.1

16 / 29

BranchesSon un concepto clave:I Líneas de desarrollo paralelas.I Usadas para hacer releases.I Usadas para aislar cambios invasivos.

1.0

1.0.1 1.0.2

16 / 29

MergingEs lo opuesto al branch:I Combina dos branches.I Usado para traer arreglos realizados en otros branches.I Usado para integrar cambios invasivos una vez

terminados.

1.0

1.0.1 1.0.2

17 / 29

MergingEs lo opuesto al branch:I Combina dos branches.I Usado para traer arreglos realizados en otros branches.I Usado para integrar cambios invasivos una vez

terminados.

1.0

1.0.1 1.0.2

17 / 29

MergingEs lo opuesto al branch:I Combina dos branches.I Usado para traer arreglos realizados en otros branches.I Usado para integrar cambios invasivos una vez

terminados.

1.0

1.0.1 1.0.2

17 / 29

MergingEs lo opuesto al branch:I Combina dos branches.I Usado para traer arreglos realizados en otros branches.I Usado para integrar cambios invasivos una vez

terminados.

1.0

1.0.1 1.0.2

17 / 29

El modelo subyacenteUn conjunto de cambios o changeset consiste en:I Los ID de los padres (0, 1 ó 2):

I el changeset raíz no tiene padresI los changesets normales sólo tienen un padreI los merge changesets tienen dos padres

I Fecha, nombre de usuario, mensaje del cambioI La diferencia que hay con el primer padreI El ID del changeset se calcula haciendo un SHA-1 de todo

lo de arribaI Hace imposible inyectar código sin cambiar el historial

18 / 29

La historia es inmutableUsar hashes SHA-1 como ID de los changesets tiene susconsecuencias:I Un ID de un changeset es un hash de la historia completa.I Cambiar la historia cambia todos los changesets

siguientes.I No se puede cambiar la historia, sólo se puede crear

nueva historia:

A B C D E

19 / 29

La historia es inmutableUsar hashes SHA-1 como ID de los changesets tiene susconsecuencias:I Un ID de un changeset es un hash de la historia completa.I Cambiar la historia cambia todos los changesets

siguientes.I No se puede cambiar la historia, sólo se puede crear

nueva historia:

A B

C ′ D′ E′

C D E

19 / 29

La historia es inmutableUsar hashes SHA-1 como ID de los changesets tiene susconsecuencias:I Un ID de un changeset es un hash de la historia completa.I Cambiar la historia cambia todos los changesets

siguientes.I No se puede cambiar la historia, sólo se puede crear

nueva historia:

A B

C ′ D′ E′

C D E

19 / 29

Conociendo la historia de un archivoEl comando hg annotate es muy valioso:I Se puede ver en qué momento cada línea fue introducida.I Podés volver rápidamente a una versión anterior.

Historial del archivo README de Mercurial:

3942: Basic install:445:3942: $ make # see install targets3942: $ make install # do a system-wide install3942: $ hg debuginstall # sanity-check setup3942: $ hg # see help0:

# ...

Podemos verlo más lindo usando hg serve

20 / 29

Buscando el contenido de un archivo¿Alguna vez quisieron saber cuándo se agregó una función?

I ¡hg grep es tu amigo!

Ejemplo: ¿Cuándo fue hg forget introducida?

% hg grep --all ’def forget’ commands.pycommands.py:8902:+:def forget(ui, repo, *pats, **opts):commands.py:3522:-:def forget(ui, repo, *pats, **opts):commands.py:814:-:def forget(ui, repo, file1, *files):commands.py:814:+:def forget(ui, repo, *pats, **opts):# ...

21 / 29

Biseccion del grafo de revisiones¡Encontraste un bug! ¿En qué momento se introdujo al código?

Usando hg bisect para marcar buenas y malas revisiones:

mala

22 / 29

Biseccion del grafo de revisiones¡Encontraste un bug! ¿En qué momento se introdujo al código?

Usando hg bisect para marcar buenas y malas revisiones:

prueba mala

22 / 29

Biseccion del grafo de revisiones¡Encontraste un bug! ¿En qué momento se introdujo al código?

Usando hg bisect para marcar buenas y malas revisiones:

buena mala

22 / 29

Biseccion del grafo de revisiones¡Encontraste un bug! ¿En qué momento se introdujo al código?

Usando hg bisect para marcar buenas y malas revisiones:

buena prueba mala

22 / 29

Biseccion del grafo de revisiones¡Encontraste un bug! ¿En qué momento se introdujo al código?

Usando hg bisect para marcar buenas y malas revisiones:

buena buena mala

22 / 29

Biseccion del grafo de revisiones¡Encontraste un bug! ¿En qué momento se introdujo al código?

Usando hg bisect para marcar buenas y malas revisiones:

buena

prueba

buena mala

22 / 29

Biseccion del grafo de revisiones¡Encontraste un bug! ¿En qué momento se introdujo al código?

Usando hg bisect para marcar buenas y malas revisiones:

buena

mala

buena mala

22 / 29

Biseccion del grafo de revisiones¡Encontraste un bug! ¿En qué momento se introdujo al código?

Usando hg bisect para marcar buenas y malas revisiones:

buena

prueba mala

buena mala

22 / 29

Biseccion del grafo de revisiones¡Encontraste un bug! ¿En qué momento se introdujo al código?

Usando hg bisect para marcar buenas y malas revisiones:

buena

bug! mala

buena mala

22 / 29

Mercurial es extensibleUno puede agregarle nueva funcionalidad a Mercurial:I Se distribuye con más de 30 extensiones.I En el wiki se listan más de 75 extensiones.I Usando extensiones se puede cambiar prácticamente

todo.I Ayudan a mantener el núcleo chico y focalizado.

Algunas de las extensiones incluidas:I bugzilla integra Mercurial con bugzilla.I color produce salida colorida.I eol cambia el fin de línea entre el Working Copy y el

repositorio (DOS / Unix).I fetch integra pull, merge y update en un comando.

23 / 29

Migrando de un sistema aMercurialLa extensión convert puede importar la historia desde otrosistema de control de versiones:I CVS, SVN, Git, Bazaar, Darcs, . . .I Puede hacer conversiones incrementales (se puede

actualizar el repo hg).I Incluye muchas opciones para manejar autores, branches,

. . .

Es interesante que convert pueda importar desde Mercurial:I --filemap te permite excluir o renombrar archivos.I --branchmap te permite renombrar los branches.

24 / 29

Migrando de un sistema aMercurialLa extensión convert puede importar la historia desde otrosistema de control de versiones:I CVS, SVN, Git, Bazaar, Darcs, . . .I Puede hacer conversiones incrementales (se puede

actualizar el repo hg).I Incluye muchas opciones para manejar autores, branches,

. . .Es interesante que convert pueda importar desde Mercurial:I --filemap te permite excluir o renombrar archivos.I --branchmap te permite renombrar los branches.

24 / 29

Editando la historiaInspirado en git rebase -i, histedit te permite:I Reordenar changesets:

A B C A C ′ B′

I unir changesets:A B C A BC

I descartar changesets:A B C A C ′

I editar changesets:A B C A X B′ C ′

25 / 29

Editando la historiaInspirado en git rebase -i, histedit te permite:I Reordenar changesets:

A B C A C ′ B′

I unir changesets:A B C A BC

I descartar changesets:A B C A C ′

I editar changesets:A B C A X B′ C ′

25 / 29

Editando la historiaInspirado en git rebase -i, histedit te permite:I Reordenar changesets:

A B C A C ′ B′

I unir changesets:A B C A BC

I descartar changesets:A B C A C ′

I editar changesets:A B C A X B′ C ′

25 / 29

Editando la historiaInspirado en git rebase -i, histedit te permite:I Reordenar changesets:

A B C A C ′ B′

I unir changesets:A B C A BC

I descartar changesets:A B C A C ′

I editar changesets:A B C A X B′ C ′

25 / 29

¡Demostración!

26 / 29

Mercurial in a NutshellMercurial simplifica la forma en que trabajas:I Simple pero poderoso modelo de branches y merges.I El sistema de control de versiones se transforma en una

herramienta poderosa en lugar de un mal necesario.I Utiliza pocos recursos y responde rápidamente.I Adaptable a tu estilo de trabajo y extensible para cubrir tus

necesidades.I ¡Libre y gratis!

27 / 29

Mas InformacionI Homepage de Mercurial:http://mercurial.selenic.com/

I Mercurial: The Definitive Guide:http://hgbook.red-bean.com/

I Tutoriales:http://mercurial.aragost.com/kick-start/http://mercurial.ch/http://hginit.com/ Muy recomendable!

I Host gratis de repositorios Mercurial:http://bitbucket.org/ Usado para hacer estaspresentaciones!http://code.google.com/http://sourceforge.net/

28 / 29

¿Quienes hacenMercurial?De http://ohloh.net/p/mercurial/map:

29 / 29

¿Quienes hacenMercurial?De http://ohloh.net/p/mercurial/map:

¡Gracias!¡Gracias!

29 / 29