JDEROBOT TALKS
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
1
29/03/2016
© 2015 Victor Arribas <
[email protected]>
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
• 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
•
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)
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.
Acción
Descargar el repositorio
Tamaño del repo
Revisar los cambios y el historial
Commit
Push (only at git)
Ramas
Etiquetas
Archivos grandes
Varios proyectos en el mismo repo
Copia de seguridad
Git
Expensive
Compact
Trivial
Trivial
Conflicts
Trivial
SVN
Trivial
Exponential
Expensive
Conficts
= Commit
Expensive
Trivial (feature)
= Branch
Killer
Killer
Trivial
Linear
Easy
Moderate
29/03/2016
© 2015 Victor Arribas <
[email protected]>
5
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
Herramienta de
simplificación:
git-ignore-add
Live example
29/03/2016
© 2015 Victor Arribas <
[email protected]>
10
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
Comentarios de: Git: Una introducción avanzada (0)
No hay comentarios