29/03/2016 © 2015 Victor Arribas <[email protected]>
1 G I T : U N A I N T R O D U C C I Ó N A V A N Z A D A
JDEROBOT TALKS
AVISO A PRINCIPIANTES
• Esta presentación no está planteada para explicar los
conceptos elementales de Git. Sin embargo podéis
planteárosla como la motivación de porqué usar Git.
• Internet está repleto de guías y tutoriales:
• https://git-scm.com/book/es/v2
• http://marklodato.github.io/visual-git-guide/index-es.html
• https://training.github.com/kit/downloads/es/github-git-cheat-
sheet.pdf
• http://www.tutorialspoint.com/git/index.htm
• https://help.github.com
• https://www.youtube.com/watch?v=fBRE5zuYUlI (videos 1 y 3)
29/03/2016 © 2015 Victor Arribas <[email protected]> 2
ÍNDICE
• Intro
• Revision of Git commands
• Git vs SVN
• Develop scheme
• Git branching model
• Git branch lifecycle
• Daily
• gitconfig
• gitignore
• Inline extensions
• Branch naming
• Review changes (github)
• Complex repos
• Subtrees, submodules, subrepos
• Powerful examples
• Gitignore automation
• Merge without branches
• Remove untracked files
• Remove big/sensitive files
• Patchs: creation & apply
• Rebase tip: committer date
• More than hooks
29/03/2016 © 2016 Victor Arribas <[email protected]> 3
REVISION OF GIT COMMANDS
• https://training.github.com/kit/downloads/es/github-git-cheat-sheet.pdf
29/03/2016 © 2016 Victor Arribas <[email protected]> 4
GIT VS SVN
• Tésis simplificativa: todo lo que es dificil de hacer en SVN Git lo hace fácil, y viceversa.
29/03/2016 © 2015 Victor Arribas <[email protected]> 5
Acción Git SVN
Descargar el repositorio Expensive Trivial
Tamaño del repo Compact Exponential
Revisar los cambios y el historial Trivial Expensive
Commit Trivial Conficts
Push (only at git) Conflicts = Commit
Ramas Trivial Expensive
Etiquetas Trivial (feature) = Branch
Archivos grandes Killer Linear
Varios proyectos en el mismo repo Killer Easy
Copia de seguridad Trivial Moderate
GIT AND BRANCHES
• En este punto podríamos pasarnos horas y exigiría
repasar todos los tipos de flujos de desarrollo. Tanto
los genéricos como los relativos a git.
• Todo lo anterior lo puedes encontrar bastante
condensado en estos dos recursos
• http://nvie.com/posts/a-successful-git-branching-model
• https://www.atlassian.com/git/tutorials/comparing-workflows
29/03/2016 © 2015 Victor Arribas <[email protected]> 6
GIT AND BRANCHES
• En su lugar solo se pantea cuál es la configuración
canónica para Git.
29/03/2016 © 2015 Victor Arribas <[email protected]> 7
.GITCONFIG
• Uno de los archivos más importantes en el
ecosistema Git.
• Guarda tu identidad
• Guarda tus preferencias de git
• También actúa como .bashrc
• Permite inline extensions!
• Dos posibles localzaciones:
• $HOME/.gitconfig
• $repo/.git/config
29/03/2016 © 2015 Victor Arribas <[email protected]> 8
.GITCONFIG II
• He creado un instalador para simplificar mi vida cada vez que
cambio de máquina o contexto (chroot)
• https://github.com/varhub/my-gitconfig
• Hay algún voluntario?
29/03/2016 © 2015 Victor Arribas <[email protected]> 9
Live example
GITIGNORE
• Una de las partes más importantes que suele olvidarse
• Git almacena el historial completo de desarrollo para
siempre.
• Si uno añade un fichero incorrecto, este permanecerá ahñi para
siempre incluso tras borrarlo.
• Es la respuesta lógica a “por qué mi repositorio pesa tanto”?
• Recordar que el checkout puede duplicar el tamaño efectivo.
• Un gitignore adecuado debe ser una prioridad
• Hacerlo a posteriori puede ser doloroso
29/03/2016 © 2015 Victor Arribas <[email protected]> 10
Live example
Herramienta de simplificación:
git-ignore-add
GITIGNORE II
• Qué debe estar dentro de un gitignore?
• Artefactos generados por el proyect (siempre)
• Lenguaje de programación
• Herramientas de compilación
• Datos sensibles descargados por otros medios
• IDE/editores (nunca excepto para proyectos expuestos al
público y/o a novatos)
• Estas reglas deberían trasladarse a un gitignore global
• Añádelas al projecto cuando no puedes asegugar el
conocimiento sobre Git de tu equipo de desarrollo.
• Siempre es mejor un .gitignore sucio que un repositorio sucio.
29/03/2016 © 2015 Victor Arribas <[email protected]> 11
INLINE EXTENSIONS
• Equivalente a los alias de bash y .profile/.bashrc
• Aquí tienes algunos ejemplos: • https://github.com/varhub/my-gitconfig/blob/master/.gitconfig
• https://github.com/alikins/gitconfig/blob/master/gitconfig
• Demostraciones para esta charla: • treegraph
• Logmerges
• También existen las “external extensions” (avanzado) • Cualquier ejecutable llamado git-<whatever> en el $PATH puede ser
invocado por git como:
• git <whatever>
29/03/2016 © 2015 Victor Arribas <[email protected]> 12
Live example
REPOSITORIOS COMPLEJOS
• Hay básicamente 3 formas de manejar repositorios
complejos:
• Subtrees
• Subprojects/subrepos
• Submodules
29/03/2016 © 2015 Victor Arribas <[email protected]> 13
COMPLEX REPOS: SUBMODULES
• Submodules fue el primero en hacerse oficial.
• Requiere trabajo adicional en el clonado.
• Cada proyecto tiene su propio .git pero el repo raíz gobierna al resto.
• Requiere actualización de versión continua.
• Encaja a la perfección con frameworks de composición: • El framework es un proyecto que actúa como un concentrador
• La versión de cada subproyecto está siempre traqueada y firmada • versiones estables explícitas
• Los commits sobre el Framework son simplemente actualizaciones de los componentes • actualización implícita del framework
29/03/2016 © 2015 Victor Arribas <[email protected]> 14
COMPLEX REPOS: SUBTREES
• Subtrees es la aproximación opuesta.
• Un único .git que condensa el árbol de desarrollo
de cada proyecto en un único y gigantesco árbol.
• El historial del proyecto puede ser compactado
(squash) o integrado en su totalidad.
• Es la mejor forma de desacoplar o extraer un
proyecto.
• See git subtree split
29/03/2016 © 2015 Victor Arribas <[email protected]> 15
COMPLEX REPOS: SUBPROJECTS
• Subprojects es la forma agnóstica de hacerlo (fuera de git). • Se parece a los submódulos, pero el control es manual.
• Los proyectos son inconscientes del nexo de unión excepto por dos hechos: • Algunos proyectos van dentro de otros, y por tanto, dentro de su árbol
de ficheros y de git. • Los proyectos anfitriones deben añadir entradas al gitignore para
mantener a los huéspedes (subprojects) fuera del control de versiones.
• El flujo de trabajo es completamente aislado. • Ejecutar git clean es extremadamente destructivo.
• Useful for framework customization and sandboxing
29/03/2016 © 2015 Victor Arribas <[email protected]> 16
POWERFUL EXAMPLES
• Gitignore automation • https://github.com/varhub/my-gitconfig/blob/master/bin/git-ignore-add
• Merge without branches • https://github.com/varhub/my-gitconfig/blob/master/bin/git-lazy-merge
• Remove untracked files • http://stackoverflow.com/questions/61212/how-do-i-remove-local-untracked-files-from-my-current-
git-branch
• Remove big/sensitive files • https://help.github.com/articles/removing-files-from-a-repository-s-history
• Patchs: creation & apply • https://ariejan.net/2009/10/26/how-to-create-and-apply-a-patch-with-git/
• Rebase tip: committer date • http://stackoverflow.com/questions/2973996/git-rebase-without-changing-commit-timestamps
• More than hooks • http://stackoverflow.com/questions/2293383/hide-a-string-in-a-file-before-git-commit/2294246
29/03/2016 © 2015 Victor Arribas <[email protected]> 17
¿PREGUNTAS?
Gracias por su atención
Alguna pregunta?
29/03/2016 © 2015 Victor Arribas <[email protected]> 18