control de versiones con mercurial -...
TRANSCRIPT
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
¿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
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
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 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
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