Aprovecha las ventajas del control             de versiones distribuido                                                   ...
Descargar la presentaciónPuedes descargar la presentación desdehttp://www.slideshare.net/iarenaza/git-aprovecha-las-ventaj...
ObjetivosProporcionar una base teórica y práctica delos conceptos en los que se basan los SCMdistribuidos.Ser capaz de rea...
ProgramaCaracterísticas principales de GitIntroducción a los conceptos manejados por Git:repositorios, objetos, estados, r...
Sistemas de Control de Versiones        Centralizados (CVCS)Ejemplos: CVS, Subversion, Perforce, SourceSafe, ...          ...
Sistemas de Control de Versiones        Distribuidos (DVCS)Ejemplos: git, Mercurial, Bazaar, BitKeeper,...                ...
Diferencias versus instantáneas                                                                                           ...
(Algunas) características de git(Casi) todas las operaciones son localesGit tiene integridad fuerte (sha1)Git (generalment...
Los tres espacios y tres estados                              Fuente: http://progit.org/book/ch1-3.html                   ...
Los tres espaciosEl directorio git (repositorio) es donde gitalmacena los metadatos y la base de datosde objetos para tu p...
Los tres estadosConfirmado/no modificado (committed): losdatos están almacenados de manerasegura en el repositorio.Modific...
Los “tres + 1” estadosEl estado   3+1              Fuente: http://progit.org/book/ch2-2.html (CC-BY-NC-SA 3.0)            ...
Terminología de gitEn los ejemplos siguientes $GIT_DIRcontiene la ruta de un repositorio git dadoobjeto: unidad de almacen...
Terminología de git (cont.)nombre de objeto o identificador de objeto:identificador único del objeto (de 40 octetos conla ...
Terminología de git (cont.)revisión: estado concreto de una serie deficheros y directorios que ha sidoalmacenado en la bas...
Terminología de git (cont.)Repositorio (directorio git): colección dereferencias y base de datos de objetos(alcanzables de...
Terminología de git (cont.)  árbol de trabajo o copia de trabajo: Una  revisión extraida (checked out) del  repositorio, p...
Tipos de objetos de gitblob: objeto sin tipo, para representar unaristra de octetos (un fichero)tree: lista de nombres y p...
Tipos de objetos de git (cont.)commit: información de una revisión dadaguardada en el repositorio. Incluye:  los identific...
Tipos de objetos de git (cont.)tag: identifica de forma simbólica a otrosobjetos y puede ser usado para firmaréstos. Conti...
Tipos de objetos de git (cont.)      Fuente: http://progit.org/book/ch3-1.html (CC-BY-NC-SA 3.0)                          ...
Tipos de objetos de git (cont.)      Fuente: http://progit.org/book/ch3-1.html (CC-BY-NC-SA 3.0)                          ...
Terminología de git (cont.)rama: línea activa de desarrollo.  El commit más reciente de una rama se denomina  la punta de ...
Terminología de git (cont.)checkout: acción de actualizar parte o todoel árbol de trabajo con un objeto árbol oblob desde ...
Terminología de git (cont.)1   Supongamos este estado “inicial”                  Fuente: http://progit.org/book/ch3-1.html...
Terminología de git (cont.)2   Ejecutamos:    $ git branch testing                Fuente: http://progit.org/book/ch3-1.htm...
Terminología de git (cont.)3   master sigue siendo la rama    activa en la copia de trabajo                    Fuente: htt...
Terminología de git (cont.)4   Ejecutamos:    $ git checkout testing    testing pasa a ser la rama    activa en la copia d...
Terminología de git (cont.)1   Ejecutamos:    $ git add some-file(s)    $ git commit -m ...                             Fu...
Terminología de git (cont.)2    Ejecutamos:    $ git checkout master                            Fuente: http://progit.org/...
Terminología de git (cont.)3   Ejecutamos:    $ git add some-file(s)    $ git commit -m ...                             Fu...
Terminología de git (cont.)merge: fusionar los contenidos de otrarama (potencialmente desde un repositorioexterno) en la r...
merge: escenario 11   Supongamos este estado “inicial”                              Fuente: http://progit.org/book/ch3-2.h...
merge: escenario 12   Ejecutamos:    $ git branch hotfix master    $ git checkout hotfix    $ git add ...    $ git commit ...
merge: escenario 13   Ejecutamos:    $ git checkout master    $ git merge hotfix                            Fuente: http:/...
merge: escenario 21   Ejecutamos:    $ git checkout -b iss53 master    $ git add ...    $ git commit    $ git checkout mas...
merge: escenario 22   Ejecutamos:    $ git merge iss53                        Fuente: http://progit.org/book/ch3-2.html (C...
merge: escenario 23   El resultado es:                         Fuente: http://progit.org/book/ch3-2.html (CC-BY-NC-SA 3.0)...
Operaciones en el área de trabajoCrear nuevas ramas locales (ultra rápidoy baratísimo en disco):  $ git branch ref-nueva-r...
Operaciones en el área de trabajoMostrar diferencias con el área de preparacióno con HEAD:  $ git diff  $ git diff HEADMos...
Operaciones en el área de trabajoResetear el área de trabajo y el área intermediaal estado de HEAD (o cualquier otra refer...
Trabajo con repositorios remotosclone: obtener una copia local completa* de unrepositorio git remoto.                     ...
Trabajo con repositorios remotos (cont.)  fetch: obtener la cabeza de una rama (o  varias) desde un repositorio remoto,  c...
Trabajo con repositorios remotos (cont.)  Fetch: alguien hace cambios en el  repositorio remoto  1           Fuente: http:...
Trabajo con repositorios remotos (cont.)  Fetch: ejecutamos fetch e incorporamos  esos cambios en nuestro repositorio  2  ...
Trabajo con repositorios remotos (cont.)  pull: hacer un fetch seguido de un merge  en la rama local con la rama remota  c...
Trabajo con repositorios remotos (cont.)   Clonar un repositorio “remoto” (usando   diferentes transportes): $ git clone g...
Trabajo con repositorios remotos (cont.)   Incorporar nueva rama del repositorio remoto   al repositorio local:    $ git f...
Ejemplo de modelo de trabajo distribuido       Para mantener  modificaciones locales de   Moodle en Mondragon       Uniber...
Premisas del modelo de trabajoRepositorio compartido     de referencia                                 50
Premisas del modelo de trabajoAprovechar el repositorio    de git.moodle.orgNo usar git clone para la   importación desde ...
Premisas del modelo de trabajoRepositorio compartidosólo con ramas locales                                 52
Premisas del modelo de trabajoDesarrollo siempre en las     ramas locales                                  53
Premisas del modelo de trabajoRamas estándar sólo en  repositorios de los    desarrolladores                              ...
git.moodle.orggit-remote + git-fetch                           git-remote + git-fetch   git-fetch / git-pull              ...
Creación repositorio compartidoCrear repositorio primer desarrollador$   git config --global user.name Desarrollador-1$   ...
Creación repositorio compartidoImportar repositorio de moodle.org$ git remote add -t master -t MOODLE_21_STABLE     -m mas...
Creación repositorio compartidoRamas locales de seguimiento (opcional)$ git branch --track master moodle-org/master$ git b...
Creación repositorio compartidoCrear ramas locales de trabajo$ git branch mdl22-ldap-refactor moodle-org/MOODLE_22_STABLE ...
Creación repositorio compartidoCrear repositorio compartido en servidorLinux/Unix$   cd /ruta/repositorio/compartido$   mk...
Creación repositorio compartidoEnviar rama local al repositorio compartido$ cd /ruta/repositorio/desarrollador/desarrollad...
Creación repositorio compartidoConfigurar rama local para hacer pull desderepositorio compartido$ git config branch.mdl22-...
Creación repo nuevo desarrolladorClonar repositorio compartido  $   git config --global user.name Desarrollador-2  $   git...
Creación repo nuevo desarrolladorImportar ramas estándar (opcional)  $ cd desarollador-2.git  $ git remote add -t master -...
Creación repo nuevo desarrolladorCrear ramas locales de trabajo$ git branch mdl22-ldap-refactor     compartido/mdl22-ldap-...
Una propuesta de modelo de trabajo con                 las ramas  Propuesto por Vincent Driessen en su blog  http://nvie.c...
Otras operaciones con gitReescritura del historial de una rama(“haciendo limpieza”).rebase: re-aplicar una serie de cambio...
rebase: reescritura del historial1   Estado “inicial”. master es    la rama activa en el directorio    de trabajo.        ...
rebase: reescritura del historial (cont.)2    merge tradicional de     “master” y “experiment”:     $ git merge experiment...
rebase: reescritura del historial (cont.)3    rebase de “experiment” sobre     “master”     $ git checkout experiment     ...
rebase: reescritura del historial (cont.)4    merge de “master” y     “experiment” tras el rebase:     $ git merge experim...
Reescritura del historialIMPORTANTE: No hace rebase de loscambios de una rama si ésta ha sidopublicada en otro repositorio...
Reescritura del historial    Conviene aplicarla sólo a la rama activa    (evita sorpresas):$ git checkout wip-mdl22-enrol-...
Rescritura “interactiva” del historial Permite elegir (¡y reordenar!) los commits que vamos a rebasar.$ git checkout wip-m...
Rescritura “interactiva” del historialpick   72ed614   MDL-30935_in_lti_change_role_from_instructorpick   3360b13   MDL-31...
Otras operaciones con git Creación de parches monolíticos:$ git checkout mdl22-enrol-db-refactor$ git diff MOODLE_22_STABL...
Algunos trucos bajo la manga               (bonus track ☺)git add --interactivegit cherry-pickgit stash [save | list | sho...
Algunas direcciones de interésPágina oficial de Git:   http://www.git-scm.org/Libro Pro Git:   http://progit.org/book/Pági...
Algunas direcciones de interésGit Cheat Sheets:   http://devcheatsheet.com/tag/git/A successful Git branching model   http...
Próxima SlideShare
Cargando en…5
×

Git: Aprovecha las ventajas del control de versiones distribuido

1.788 visualizaciones

Publicado el

Publicado en: Tecnología
0 comentarios
1 recomendación
Estadísticas
Notas
  • Sé el primero en comentar

Sin descargas
Visualizaciones
Visualizaciones totales
1.788
En SlideShare
0
De insertados
0
Número de insertados
5
Acciones
Compartido
0
Descargas
65
Comentarios
0
Recomendaciones
1
Insertados 0
No insertados

No hay notas en la diapositiva.

Git: Aprovecha las ventajas del control de versiones distribuido

  1. 1. Aprovecha las ventajas del control de versiones distribuido Iñaki Arenaza iarenaza@mondragon.eduCreative Commons https://twitter.com/iarenazaAttribution Non-commercial Share Alike https://linkedin.com/in/iarenaza3.0 Spain License
  2. 2. Descargar la presentaciónPuedes descargar la presentación desdehttp://www.slideshare.net/iarenaza/git-aprovecha-las-ventajas-del-control-de-versiones-distribuidoO puedes usar el siguiente código QR: 2
  3. 3. ObjetivosProporcionar una base teórica y práctica delos conceptos en los que se basan los SCMdistribuidos.Ser capaz de realizar las tareas habitualesde un SCM con Git.Conocer y aplicar las ventajas del modelode trabajo de los SCM distribuidos. 3
  4. 4. ProgramaCaracterísticas principales de GitIntroducción a los conceptos manejados por Git:repositorios, objetos, estados, referencias, ramas,etc.Instalación de Git en Windows y LinuxConfiguración básica de Git en Windows y LinuxCreación de repositorios nuevos con GitOperaciones básicas con GitTrabajo con repositorios "remotos"Propuesta de un modelo de trabajo distribuidoOtras operaciones con Git 4
  5. 5. Sistemas de Control de Versiones Centralizados (CVCS)Ejemplos: CVS, Subversion, Perforce, SourceSafe, ... Fuente: http://progit.org/book/ch1-1.html (CC-BY-NC-SA 3.0) 5
  6. 6. Sistemas de Control de Versiones Distribuidos (DVCS)Ejemplos: git, Mercurial, Bazaar, BitKeeper,... Fuente: http://progit.org/book/ch1-1.html (CC-BY-NC-SA 3.0) 6
  7. 7. Diferencias versus instantáneas Bazaar, Mercurial*Fuente: http://progit.org/book/ch1-3.html (CC-BY-NC-SA 3.0) git, Mercurial* Fuente: http://progit.org/book/ch1-3.html (CC-BY-NC-SA 3.0) 7
  8. 8. (Algunas) características de git(Casi) todas las operaciones son localesGit tiene integridad fuerte (sha1)Git (generalmente) sólo añade datos alrepositorio 8
  9. 9. Los tres espacios y tres estados Fuente: http://progit.org/book/ch1-3.html (CC-BY-NC-SA 3.0) Modified* Staged Committed 9
  10. 10. Los tres espaciosEl directorio git (repositorio) es donde gitalmacena los metadatos y la base de datosde objetos para tu proyecto.El directorio de trabajo es una copia detrabajo de una versión del proyecto.El área de preparación (staging area) es unarchivo que almacena información sobre loque se guardará en el próximo commit.Antes se le llamaba “el índice” (index). 10
  11. 11. Los tres estadosConfirmado/no modificado (committed): losdatos están almacenados de manerasegura en el repositorio.Modificado (modified): se ha modificado elarchivo pero todavía no se ha confirmado.Preparado (staged): se ha marcado paraconfirmación un archivo modificado en suversión actual. 11
  12. 12. Los “tres + 1” estadosEl estado 3+1 Fuente: http://progit.org/book/ch2-2.html (CC-BY-NC-SA 3.0) 12
  13. 13. Terminología de gitEn los ejemplos siguientes $GIT_DIRcontiene la ruta de un repositorio git dadoobjeto: unidad de almacenamiento en git. Se identifica de forma unívoca por el SHA1 de su contenido. Por tanto, un objeto es inmutable. 13
  14. 14. Terminología de git (cont.)nombre de objeto o identificador de objeto:identificador único del objeto (de 40 octetos conla representación hexadecimal del SHA1 de su contenido)base de datos de objetos: almacena unconjunto de objetos (habitualmente en$GIT_DIR/objects/).ref o referencia: cadena de 40 octetos conel identificador de un objeto, o un nombresimbólico (que se almacena en $GIT_DIR/refs/) quedenota o “apunta” un objeto particular. 14
  15. 15. Terminología de git (cont.)revisión: estado concreto de una serie deficheros y directorios que ha sidoalmacenado en la base de datos deobjetos. Se hace referencia a él por mediode un objeto de tipo commit (ver másadelante)padre: un objeto commit contiene una lista(potencialmente vacía) de objetos commitque representan a sus predecesores lógicosen la línea de desarrollo, esto es, sus losobjetos commit padre. 15
  16. 16. Terminología de git (cont.)Repositorio (directorio git): colección dereferencias y base de datos de objetos(alcanzables desde dichas referencias). Puede contener además algunos meta datos adicionales usados por determinas órdenes de git. Puede contener una copia de trabajo de una revisión.repositorio desnudo (bare): repositorio queno tiene una copia de trabajo. Los ficheros de git que normalmente estarían presentes en el subdirectorio oculto .git están presentes en el propio directorio del repositorio. 16
  17. 17. Terminología de git (cont.) árbol de trabajo o copia de trabajo: Una revisión extraida (checked out) del repositorio, para poder trabajar con ella. índice: una colección de ficheros con información de stat(2)*, cuyos contenidos están almacenados como objetos. El índice es una versión almacenada intermedia del árbol de trabajo.* stat(2) es la llamada del sistema Unix que nos proporcionainformación de un fichero como su tamaño, sus fechas decreación, modificación y acceso, sus permisos, etc. 17
  18. 18. Tipos de objetos de gitblob: objeto sin tipo, para representar unaristra de octetos (un fichero)tree: lista de nombres y permisos, junto conlas referencias de objetos blob (undirectorio) También puede tener referencias a otros objetos de tipo tree asociados, con lo que puede representar árboles de directorios con ficheros. IMPORTANTE: Si un directorio en disco no contiene ningún fichero (“blob”) git no creará un objeto de tipo “tree” para representarlo ni guardará su existencia o estado. 18
  19. 19. Tipos de objetos de git (cont.)commit: información de una revisión dadaguardada en el repositorio. Incluye: los identificadores de los padres del objeto, la persona que ha realizado el commit de la revisión (nombre + email), el autor de la revisión (nombre + email), la fecha de la misma, un mensaje de texto arbitrariamente largo asociado, el objeto tree que corresponde al directorio raíz de la revisión. 19
  20. 20. Tipos de objetos de git (cont.)tag: identifica de forma simbólica a otrosobjetos y puede ser usado para firmaréstos. Contiene: el nombre y tipo de otro objeto, un nombre simbólico (el de la propia tag) puede contener un mensaje asociado. opcionalmente puede incluir una firma digital (en formato PGP). En este último caso se denomina un "objeto de etiqueta firmada". Las etiquetas normales se pueden modificar (para que apunten a otro objeto), pero las firmadas no. 20
  21. 21. Tipos de objetos de git (cont.) Fuente: http://progit.org/book/ch3-1.html (CC-BY-NC-SA 3.0) 21
  22. 22. Tipos de objetos de git (cont.) Fuente: http://progit.org/book/ch3-1.html (CC-BY-NC-SA 3.0) 22
  23. 23. Terminología de git (cont.)rama: línea activa de desarrollo. El commit más reciente de una rama se denomina la punta de dicha rama. La punta de la rama se referencia por medio de una cabeza. La copia de trabajo está siempre asociada a una rama (la rama "actual" o "checked out") y la cabeza especial “HEAD” apunta a esa rama.cabeza: una referencia con nombre, queapunta al objeto commit de la punta de unarama. Las cabezas se almacenan en $GIT_DIR/refs/heads/, (salvo que se usen referencias empaquetadas). 23
  24. 24. Terminología de git (cont.)checkout: acción de actualizar parte o todoel árbol de trabajo con un objeto árbol oblob desde la base de datos de objeto Además actualiza el índice y la referencia HEAD si se ha cambiado de rama. 24
  25. 25. Terminología de git (cont.)1 Supongamos este estado “inicial” Fuente: http://progit.org/book/ch3-1.html (CC-BY-NC-SA 3.0) 25
  26. 26. Terminología de git (cont.)2 Ejecutamos: $ git branch testing Fuente: http://progit.org/book/ch3-1.html (CC-BY-NC-SA 3.0) 26
  27. 27. Terminología de git (cont.)3 master sigue siendo la rama activa en la copia de trabajo Fuente: http://progit.org/book/ch3-1.html (CC-BY-NC-SA 3.0) 27
  28. 28. Terminología de git (cont.)4 Ejecutamos: $ git checkout testing testing pasa a ser la rama activa en la copia de trabajo Fuente: http://progit.org/book/ch3-1.html (CC-BY-NC-SA 3.0) 28
  29. 29. Terminología de git (cont.)1 Ejecutamos: $ git add some-file(s) $ git commit -m ... Fuente: http://progit.org/book/ch3-1.html (CC-BY-NC-SA 3.0) 29
  30. 30. Terminología de git (cont.)2 Ejecutamos: $ git checkout master Fuente: http://progit.org/book/ch3-1.html (CC-BY-NC-SA 3.0) 30
  31. 31. Terminología de git (cont.)3 Ejecutamos: $ git add some-file(s) $ git commit -m ... Fuente: http://progit.org/book/ch3-1.html (CC-BY-NC-SA 3.0) 31
  32. 32. Terminología de git (cont.)merge: fusionar los contenidos de otrarama (potencialmente desde un repositorioexterno) en la rama actual. Si la rama es de otro repositorio, primero se hace un fetch* de la rama y después se fusiona en la rama actual. La fusión puede crear un nuevo objeto commit si una de las ramas no es un ancestro de la otra. Si una es ancestro de la otra, simplemente se mueve la referencia de la cabeza de la rama fusionada (fast-forward merge). 32
  33. 33. merge: escenario 11 Supongamos este estado “inicial” Fuente: http://progit.org/book/ch3-2.html (CC-BY-NC-SA 3.0) 33
  34. 34. merge: escenario 12 Ejecutamos: $ git branch hotfix master $ git checkout hotfix $ git add ... $ git commit Fuente: http://progit.org/book/ch3-2.html (CC-BY-NC-SA 3.0) 34
  35. 35. merge: escenario 13 Ejecutamos: $ git checkout master $ git merge hotfix Fuente: http://progit.org/book/ch3-2.html (CC-BY-NC-SA 3.0) 35
  36. 36. merge: escenario 21 Ejecutamos: $ git checkout -b iss53 master $ git add ... $ git commit $ git checkout master $ git add …. $ git commit Fuente: http://progit.org/book/ch3-2.html (CC-BY-NC-SA 3.0) 36
  37. 37. merge: escenario 22 Ejecutamos: $ git merge iss53 Fuente: http://progit.org/book/ch3-2.html (CC-BY-NC-SA 3.0) 37
  38. 38. merge: escenario 23 El resultado es: Fuente: http://progit.org/book/ch3-2.html (CC-BY-NC-SA 3.0) 38
  39. 39. Operaciones en el área de trabajoCrear nuevas ramas locales (ultra rápidoy baratísimo en disco): $ git branch ref-nueva-rama ref-o-etiqueta-existenteExtraer una rama al área de trabajo: $ git checkout ref--existenteConsultar la rama activa: $ git branch (es la que aparece marcada con un *)Mostrar el estado del área de trabajo: $ git statusMarcar cambios para commit: $ git add fichero1 fichero2 ... $ git rm fichero3 fichero4 ... 39
  40. 40. Operaciones en el área de trabajoMostrar diferencias con el área de preparacióno con HEAD: $ git diff $ git diff HEADMostrar diferencias con otras ramas: $ git diff ref-existente $ git diff ref-existente-1..ref-existente-2Hacer commit de los cambios (marcados): $ git commitUsar gitk para visualizar el historial de una rama: $ gitk ref-existenteUsar gitk para visualizar el historial de todas lasramas: $ gitk --all 40
  41. 41. Operaciones en el área de trabajoResetear el área de trabajo y el área intermediaal estado de HEAD (o cualquier otra referencia): $ git reset --hard HEADResetear el área de preparación al estado deHEAD (o cualquier otra referencia): $ git reset --mixed HEADMover la referencia de HEAD a otro commit sintocar ni el área de trabajo ni el área intermedia: $ git reset --soft HEAD~ 41
  42. 42. Trabajo con repositorios remotosclone: obtener una copia local completa* de unrepositorio git remoto. * las cabezas de las ramas remotas son inamovibles** en la copia local Fuente: http://progit.org/book/ch3-5.html (CC-BY-NC-SA 3.0) 42
  43. 43. Trabajo con repositorios remotos (cont.) fetch: obtener la cabeza de una rama (o varias) desde un repositorio remoto, copiando los objetos falten y moviendo la(s) cabeza(s) remota(s). Fuente: http://progit.org/book/ch3-5.html (CC-BY-NC-SA 3.0) 43
  44. 44. Trabajo con repositorios remotos (cont.) Fetch: alguien hace cambios en el repositorio remoto 1 Fuente: http://progit.org/book/ch3-5.html (CC-BY-NC-SA 3.0) 44
  45. 45. Trabajo con repositorios remotos (cont.) Fetch: ejecutamos fetch e incorporamos esos cambios en nuestro repositorio 2 Fuente: http://progit.org/book/ch3-5.html (CC-BY-NC-SA 3.0) 45
  46. 46. Trabajo con repositorios remotos (cont.) pull: hacer un fetch seguido de un merge en la rama local con la rama remota configurada. push: enviar los objetos de la rama local que no están en la rama remota a la que hace referencia el pull, y actualizar la cabeza de la rama remota. Es la acción complementaria de pull. Si la cabeza de la rama remota no es un ancestro de la cabeza de la rama local, el push falla*. (*) Podemos forzar el push, pero rescribimos el historial del repositorio (¡es una posible fuente de problemas si el repositorio es compartido!) 46
  47. 47. Trabajo con repositorios remotos (cont.) Clonar un repositorio “remoto” (usando diferentes transportes): $ git clone git://git.moodle.org/moodle.git $ git clone ssh://iarenaza@git.moodle.org/moodle.git $ git clone http://git.moodle.org/moodle.git $ git clone git@github.com:iarenaza/moodle.git $ git clone /ruta/a/moodle.git /ruta/a/otro-moodle.git $ git clone -o moodle.git git@github.com:iarenaza/moodle.git 47
  48. 48. Trabajo con repositorios remotos (cont.) Incorporar nueva rama del repositorio remoto al repositorio local: $ git fetch moodle.git $ git branch ref-nueva moodle.git/ref-existente Enviar ramas locales al repositorio remoto: $ git push moodle.git ref-nueva-o-existente $ git push moodle.git +ref-nueva-o-existente $ git push moodle.git ref-nombre-local:ref-nombre-remoto Configurar rama para poder hacer pull desde repositorio remoto: $ git config branch.ref-local.remote moodle.git $ git config branch.ref-local.merge refs/heads/ref-remota 48
  49. 49. Ejemplo de modelo de trabajo distribuido Para mantener modificaciones locales de Moodle en Mondragon Unibertsitatea 49
  50. 50. Premisas del modelo de trabajoRepositorio compartido de referencia 50
  51. 51. Premisas del modelo de trabajoAprovechar el repositorio de git.moodle.orgNo usar git clone para la importación desde git.moodle.org 51
  52. 52. Premisas del modelo de trabajoRepositorio compartidosólo con ramas locales 52
  53. 53. Premisas del modelo de trabajoDesarrollo siempre en las ramas locales 53
  54. 54. Premisas del modelo de trabajoRamas estándar sólo en repositorios de los desarrolladores 54
  55. 55. git.moodle.orggit-remote + git-fetch git-remote + git-fetch git-fetch / git-pull git-fetch / git-pull copia de trabajo + repositorio desarrollador git-remote git-push git-clone git-push git-clone git-push + git-push git-fetch git-fetch git-fetch git-pull git-pull git-pull repositorio compartido @mondragon.edu 55
  56. 56. Creación repositorio compartidoCrear repositorio primer desarrollador$ git config --global user.name Desarrollador-1$ git config --global user.email desa-1@mondragon.edu$ cd /ruta/repositorio/desarrollador$ mkdir desarrollador-1.git$ cd desarrollador-1.git$ git init git.moodle.org git-remote + git-fetch git-fetch / git-pull git-remote + git-fetch git-fetch / git-pull copia de trabajo + repositorio desarrollador git-remote git-push git-clone git-push git-clone git-push + git-push git-fetch git-pull git-fetch git-pull 56 git-fetch git-pull
  57. 57. Creación repositorio compartidoImportar repositorio de moodle.org$ git remote add -t master -t MOODLE_21_STABLE -m master moodle-org git://git.moodle.org/moodle.git$ git fetch moodle-org git.moodle.org git-remote + git-fetch git-fetch / git-pull git-remote + git-fetch git-fetch / git-pull copia de trabajo + repositorio desarrollador git-remote git-push git-clone git-push git-clone git-push + git-push git-fetch git-fetch git-fetch git-pull git-pull git-pull repositorio compartido @mondragon.edu 57
  58. 58. Creación repositorio compartidoRamas locales de seguimiento (opcional)$ git branch --track master moodle-org/master$ git branch --track MOODLE_22_STABLE moodle-org/MOODLE_22_STABLE 58
  59. 59. Creación repositorio compartidoCrear ramas locales de trabajo$ git branch mdl22-ldap-refactor moodle-org/MOODLE_22_STABLE 59
  60. 60. Creación repositorio compartidoCrear repositorio compartido en servidorLinux/Unix$ cd /ruta/repositorio/compartido$ mkdir compartido.git$ cd compartido.git$ git --bare init --shared=all$ chmod g=rwxs,o=rx . git.moodle.org$ sudo chgrp -R git-moodle . git-remote + git-fetch git-fetch / git-pull git-remote + git-fetch git-fetch / git-pull copia de trabajo + repositorio desarrollador git-remote git-push git-clone git-push git-clone git-push + git-push git-fetch git-fetch git-fetch git-pull git-pull git-pull repositorio compartido @mondragon.edu 60
  61. 61. Creación repositorio compartidoEnviar rama local al repositorio compartido$ cd /ruta/repositorio/desarrollador/desarrollador-1.git$ git remote add compartido /ruta/repositorio/compartido/compartido.git$ git push compartido mdl22-ldap-refactor git.moodle.org git-remote + git-fetch git-fetch / git-pull git-remote + git-fetch git-fetch / git-pull copia de trabajo + repositorio desarrollador git-remote git-push git-clone git-push git-clone git-push + git-push git-fetch git-fetch git-fetch git-pull git-pull git-pull repositorio compartido @mondragon.edu 61
  62. 62. Creación repositorio compartidoConfigurar rama local para hacer pull desderepositorio compartido$ git config branch.mdl22-ldap-refactor.remote compartido$ git config branch.mdl22-ldap-refactor.merge refs/heads/mdl22-ldap-refactor 62
  63. 63. Creación repo nuevo desarrolladorClonar repositorio compartido $ git config --global user.name Desarrollador-2 $ git config --global user.email desa-2@mondragon.edu $ cd /ruta/repositorio/desarrollador $ git clone -o compartido /ruta/repositorio/compartido/compartido.git desarrollador-2.git git.moodle.org git-remote + git-fetch git-fetch / git-pull git-remote + git-fetch git-fetch / git-pull copia de trabajo + repositorio desarrollador git-remote git-push git-clone git-push git-clone git-push + git-push git-fetch git-fetch git-fetch git-pull git-pull git-pull repositorio compartido @mondragon.edu 63
  64. 64. Creación repo nuevo desarrolladorImportar ramas estándar (opcional) $ cd desarollador-2.git $ git remote add -t master -t MOODLE_22_STABLE -m master moodle-org git://git.moodle.org/moodle.git $ git fetch moodle-org git.moodle.org git-remote + git-fetch git-fetch / git-pull git-remote + git-fetch git-fetch / git-pull copia de trabajo + repositorio desarrollador git-remote git-push git-clone git-push git-clone git-push + git-push git-fetch git-fetch git-fetch git-pull git-pull git-pull repositorio compartido @mondragon.edu 64
  65. 65. Creación repo nuevo desarrolladorCrear ramas locales de trabajo$ git branch mdl22-ldap-refactor compartido/mdl22-ldap-refactor$ git checkout mdl22-ldap-refactor 65
  66. 66. Una propuesta de modelo de trabajo con las ramas Propuesto por Vincent Driessen en su blog http://nvie.com/posts/a-successful-git- branching-model/ Se puede descargar el PDF (licencia CC-BY) con el esquema de ramas propuesto desde http://github.com/downloads/nvie/gitflow/Gi t-branching-model.pdf La descripción del modelo en el blog explica no sólo los “cómos” sino también los “porqués”. 66
  67. 67. Otras operaciones con gitReescritura del historial de una rama(“haciendo limpieza”).rebase: re-aplicar una serie de cambiosdesde una rama en la cabeza de otra ramadiferente, y hacer que la cabeza de esaotra rama apunte al resultado. ¡OJO! Reescribe el historial de la rama. Puede ser problemático en ramas publicadas en repositorios compartidos. 67
  68. 68. rebase: reescritura del historial1 Estado “inicial”. master es la rama activa en el directorio de trabajo. Fuente: http://progit.org/book/ch3-6.html (CC-BY-NC-SA 3.0) 68
  69. 69. rebase: reescritura del historial (cont.)2 merge tradicional de “master” y “experiment”: $ git merge experiment Fuente: http://progit.org/book/ch3-6.html (CC-BY-NC-SA 3.0) 69
  70. 70. rebase: reescritura del historial (cont.)3 rebase de “experiment” sobre “master” $ git checkout experiment $ git rebase master Fuente: http://progit.org/book/ch3-6.html (CC-BY-NC-SA 3.0) 70
  71. 71. rebase: reescritura del historial (cont.)4 merge de “master” y “experiment” tras el rebase: $ git merge experiment (es un simple fast-forward) Fuente: http://progit.org/book/ch3-6.html (CC-BY-NC-SA 3.0) 71
  72. 72. Reescritura del historialIMPORTANTE: No hace rebase de loscambios de una rama si ésta ha sidopublicada en otro repositorio, a menos quese sea consciente de las implicaciones.Estamos creando nuevos objetos ycambiando los ancestros de los commitsexistentes en la rama.Creará confusión y caos a quienes hayanclonado nuestro rama (repositorio) si hancreado sus propios commits a partir denuestra rama. 72
  73. 73. Reescritura del historial Conviene aplicarla sólo a la rama activa (evita sorpresas):$ git checkout wip-mdl22-enrol-db-refactor$ git rebase MOODLE_22_STABLE Si hay conflictos, solucionar a mano, y decirle a git qué hemos arreglado y que continue el proceso:$ editar enrol/database/config.html$ git add enrol/database/config.html enrol/database/enrol.php$ editar xxxx$ git add xxxxx$ git rebase --continue Podemos abortar en todo momento:$ git rebase --abort 73
  74. 74. Rescritura “interactiva” del historial Permite elegir (¡y reordenar!) los commits que vamos a rebasar.$ git checkout wip-mdl22-enrol-db-refactor$ git rebase -i MOODLE_22_STABLE Nos deja en un editor con la lista de los commits y unas palabras clave para indicar como tratar cada commit. Además de usar las operaciones marcadas por las palabras clave, podemos reordenar los commits simplemente cambiando el orden de las líneas. 74
  75. 75. Rescritura “interactiva” del historialpick 72ed614 MDL-30935_in_lti_change_role_from_instructorpick 3360b13 MDL-31251 documentation : fix incorrect docspick 8150fd9 Automatically generated installer lang filespick a97d4da Automatically generated installer lang filespick 0dde394 weekly release 2.3devpick 45b6c23 MDL-28585 LDAP doesnt handle password expiration# Rebase 1609f3c..45b6c23 onto 1609f3c## Commands:# p, pick = use commit# r, reword = use commit, but edit the commit message# e, edit = use commit, but stop for amending# s, squash = use commit, but meld into previous commit# f, fixup = like "squash", but discard this commits log message## If you remove a line here THAT COMMIT WILL BE LOST.# However, if you remove everything, the rebase will be aborted. 75
  76. 76. Otras operaciones con git Creación de parches monolíticos:$ git checkout mdl22-enrol-db-refactor$ git diff MOODLE_22_STABLE > mdl22-enrol-db-refactor.diff Creación de series de parches:$ git checkout mdl22-enrol-database-refactor$ git format-patch -o serie-enrol-db MOODLE_22_STABLE$ git format-patch -o -s -10 MOODLE_22_STABLE 76
  77. 77. Algunos trucos bajo la manga (bonus track ☺)git add --interactivegit cherry-pickgit stash [save | list | show | apply | remove | clear]git bisectgit blamegit gc, git prune, git fsck.git/hooks/* 77
  78. 78. Algunas direcciones de interésPágina oficial de Git: http://www.git-scm.org/Libro Pro Git: http://progit.org/book/Página de msysgit (Git para Windows) http://code.google.com/p/msysgit/Página de TortoiseGit (GUI para Windows): http://code.google.com/p/tortoisegit/ http://code.google.com/p/tortoisegit/wiki/UsingPuTTYPágina de Egit (plugin para Eclipse): http://www.eclipse.org/egit/ http://www.eclipse.org/downloads/compare.phpPágina de SourceTree (Git para MacOSX): http://www.sourcetreeapp.com/ 78
  79. 79. Algunas direcciones de interésGit Cheat Sheets: http://devcheatsheet.com/tag/git/A successful Git branching model http://nvie.com/posts/a-successful-git-branching-model/github/GITORIOUS: https://github.com/ y https://gitorious.org/gitosis: https://secure.wikimedia.org/wikibooks/en/wiki/Git/Gitosis http://thinkshout.com/blog/2011/03/lev/redmine-and-gitosis-project-management-nirvanagitolite: https://github.com/sitaramc/gitoliteGerrit: https://code.google.com/p/gerrit/ 79

×