Mejorando en Git
@SergiGP Software Craftsmanship BCN
Personalización
$ vim ~/.gitconfig
$ git st $ git ci -m ‘refactor’ $ git co master
*~ .DS_Store .idea
Personalización
$ git ls
documentación ejemplos avanzados
Cherry Pick
$ git co feature-0002 $ git cherry-pick 0bb6886 $ git log --oneline
Mover cambios entre branches
Cherry Pick
$ git co feature-0002 $ git cherry-pick 0bb6886 $ git log --oneline
Mover cambios entre branches
Se puede hacer cherry pick de rango de commits (1.7.2+)
$ git cherry-pick 0bb6886^..ab768ba Si 0bb6886 no es anterior a ab768ba git falla silenciosamente
Tagging
Marcar commits como importantes.
$ git tag -a v1.4 -m 'my version 1.4’ 9fceb02
$ git push origin v1.4
$ git push origin --tags
Los tags se pushean explicitamente
Pushear todos los tags
$ git tag Listar todos los tags
Merge vs Rebase
Workflow con feature branches.
¿Como reintegramos las features e n m a s t e r c u a n d o e s t á n terminadas?
Merge vs Rebase
$ git co master $ git merge feature-0001
$ git log --oneline
Merge vs Rebase
$ git co feature-0001 $ git rebase master $ git co master $ git rebase feature-0001
$ git log --oneline
Merge vs Rebase
$ git co HEAD~2 (nos vamos dos commits atrás)
rebasemerge
Merge vs Rebase
Merge Rebase
Historial confuso Historial más limpio
Funcionalidad en un solo commit *
Funcionalidad en varios commits
Resolver mismos conflictos varias veces ( git rerere)
A veces requiere force push
Submodules
• Repositorios dentro de repositorios
• Librerías externas en nuestro proyecto que queremos mantener actualizadas
• Mantener en repos para diferentes partes del proyecto
Submodules
• Repositorios dentro de repositorios
• Librerías externas en nuestro proyecto que queremos mantener actualizadas
• Mantener en repos para diferentes partes del proyecto
COMPLEJIDAD ACCIDENTAL
Submodules
$ git submodule add https://github.com/angular/angular.js.git js/angular
$ git clone https://github.com/myrepo $ git submodule init $ git submodule update
Otro miembro del equipo:(o pull…)
Hooks• Realizar algunas acciones cuando pasa “algo” en
nuestro repositorio
• Eventos:• applypatch-msg • pre-applypatch • post-applypath • pre-commit • prepare-commit-msg • post-commit • pre-rebase • post-checkout
• post-merge • pre-recieve • update • post-recieve • post-update • pre-auto-gc • post-rewrite
Hooks (II)
Existen plantillas con ejemplos en todos los repositorios en .git/hooks.
$ cd .git/hooks && cp pre-commit.sample pre-commit
!
$ vim pre-commit
howto y más detalle
Bisect
Manager
Developer
Bisect
- ¡Está petando producción!
Manager
Developer
Bisect
- ¡Está petando producción!
Manager
Developer
Bisect (II)
Bisect (II)
$ git bisect start $ git bisect bad
Bisect (II)
$ git bisect start $ git bisect bad
$ git co HEAD~8
Bisect (II)
$ git bisect start $ git bisect bad
$ git co HEAD~8
Bisect (II)
$ git bisect start $ git bisect bad
$ git bisect good
$ git co HEAD~8
Bisect (III)
Bisect (III)
$ git bisect bad
Bisect (III)
$ git bisect bad
Bisect (III)
$ git bisect bad
$ git bisect good
Bisect (IV)
Bisect (IV)
$ git show C4 $ git blame ficherosospechoso
Bisect (IV)
$ git show C4 $ git blame ficherosospechoso
Bisect (IV)
$ git show C4 $ git blame ficherosospechoso
$ git bisect reset
Bisect (V)
Step 1
Step 2
Step 3
Step 4
Bisect (VI)
$ git bisect [comando]
• visualize
• log [ > nombrefichero ]
• replay nombrefichero
• skip
Bisect
$ git bisect run [ script / tests / compilar… ]
$ git bisect run phpunit --exclude-group=functional
$ git bisect run make
howto y ejemplos
Gestionando remotos
pablo sergi jordi jesús eloi
A long time ago in a galaxy far, far away ….
Gestionando remotos
pablo sergi jordi jesús eloi
origin
Gestionando remotos
pablo sergi jordi jesús eloi
git push origin feature-001
origin
Gestionando remotos
pablo sergi jordi jesús eloi
git push origin feature-001
git pull origin feature-001
origin
Gestionando remotos
pablo sergi jordi jesús eloi
git push origin feature-001
git pull origin feature-001
git ci -m ‘mejoras rabbitmq’
origin
Gestionando remotos
pablo sergi jordi jesús eloi
git push origin feature-001
git pull origin feature-001
git ci -m ‘mejoras rabbitmq’
Eloi sube tus cambios plis
origin
Gestionando remotos
pablo sergi jordi jesús eloi
git push origin feature-001
git pull origin feature-001
git ci -m ‘mejoras rabbitmq’
Eloi sube tus cambios plis
NO! espera! que pusheo yo
antes
origin
Gestionando remotos
pablo sergi jordi jesús eloi
git push origin feature-001
git pull origin feature-001
git ci -m ‘mejoras rabbitmq’
Eloi sube tus cambios plis
NO! espera! que pusheo yo
antes…
origin
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
git pull pablo feature-001
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
git pull pablo feature-001
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
git pull pablo feature-001
git ci -m ‘mejoras rabbitmq’
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
git pull pablo feature-001
git ci -m ‘mejoras rabbitmq’
git push pablo feature-001
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
git pull pablo feature-001
git ci -m ‘mejoras rabbitmq’
git push pablo feature-001
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
git pull pablo feature-001
git ci -m ‘mejoras rabbitmq’
git push pablo feature-001
git pull pablo feature-001
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
git pull pablo feature-001
git ci -m ‘mejoras rabbitmq’
git push pablo feature-001
git pull pablo feature-001
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
git pull pablo feature-001
git ci -m ‘mejoras rabbitmq’
git push pablo feature-001
git pull pablo feature-001
git push origin feature-001
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
git pull pablo feature-001
git ci -m ‘mejoras rabbitmq’
git push pablo feature-001
git pull pablo feature-001
git push origin feature-001
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
git pull pablo feature-001
git ci -m ‘mejoras rabbitmq’
git push pablo feature-001
git pull pablo feature-001
git push origin feature-001
git co integration
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
git pull pablo feature-001
git ci -m ‘mejoras rabbitmq’
git push pablo feature-001
git pull pablo feature-001
git push origin feature-001
git co integration
git pull jesus/feature-001
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
git pull pablo feature-001
git ci -m ‘mejoras rabbitmq’
git push pablo feature-001
git pull pablo feature-001
git push origin feature-001
git co integration
git pull jesus/feature-001
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
git pull pablo feature-001
git ci -m ‘mejoras rabbitmq’
git push pablo feature-001
git pull pablo feature-001
git push origin feature-001
git co integration
git pull jesus/feature-001
git push akamon
integration
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
git pull pablo feature-001
git ci -m ‘mejoras rabbitmq’
git push pablo feature-001
git pull pablo feature-001
git push origin feature-001
git co integration
git pull jesus/feature-001
git push akamon
integration
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
git pull pablo feature-001
git ci -m ‘mejoras rabbitmq’
git push pablo feature-001
git pull pablo feature-001
git push origin feature-001
git co integration
git pull jesus/feature-001
git push akamon
integration
git pull akamon
integration
Gestionando remotos
pablo
sergi
jordi
jesús
eloi
akamon
git push origin feature-001
git pull pablo feature-001
git ci -m ‘mejoras rabbitmq’
git push pablo feature-001
git pull pablo feature-001
git push origin feature-001
git co integration
git pull jesus/feature-001
git push akamon
integration
git pull akamon
integration
Pull Requests
En un repositorio que no es tuyo (ni tienes permisos):
• Necesitas una funcionalidad que no existe
• Encuentras un bug…
• Ves una posible mejora …
• Si el repo es tuyo (o tienes permisos) para generar debate
Pull Request == Propongo incluir algo en un repo
Pull Requests• Haces un fork (copia) de un repositorio
• Modificas tu copia y propones tus cambios
• El propietario los acepta o no …
dhh/rails sergigp/rails
Pull Requests• Haces un fork (copia) de un repositorio
• Modificas tu copia y propones tus cambios
• El propietario los acepta o no …
dhh/rails sergigp/rails
Hi, I’m DHH and TDD is
DEAD
Pull Requests• Haces un fork (copia) de un repositorio
• Modificas tu copia y propones tus cambios
• El propietario los acepta o no …
dhh/rails sergigp/rails
fork dhh/railsHi, I’m DHH and TDD is
DEAD
Pull Requests• Haces un fork (copia) de un repositorio
• Modificas tu copia y propones tus cambios
• El propietario los acepta o no …
dhh/rails sergigp/rails
fork dhh/railsHi, I’m DHH and TDD is
DEAD
git ci -m ‘remove active record’
Pull Requests• Haces un fork (copia) de un repositorio
• Modificas tu copia y propones tus cambios
• El propietario los acepta o no …
dhh/rails sergigp/rails
fork dhh/railsHi, I’m DHH and TDD is
DEAD
git ci -m ‘remove active record’
Pull Request!
Pull Requests• Haces un fork (copia) de un repositorio
• Modificas tu copia y propones tus cambios
• El propietario los acepta o no …
dhh/rails sergigp/rails
fork dhh/railsHi, I’m DHH and TDD is
DEAD
git ci -m ‘remove active record’
Pull Request!Pull Request
Pull Requests• Haces un fork (copia) de un repositorio
• Modificas tu copia y propones tus cambios
• El propietario los acepta o no …
dhh/rails sergigp/rails
fork dhh/railsHi, I’m DHH and TDD is
DEAD
git ci -m ‘remove active record’
Pull Request!Pull Request
Pull Requests• Haces un fork (copia) de un repositorio
• Modificas tu copia y propones tus cambios
• El propietario los acepta o no …
dhh/rails sergigp/rails
fork dhh/railsHi, I’m DHH and TDD is
DEAD
git ci -m ‘remove active record’
Pull Request!Pull Request
F*CK YOU
Pull Requests
Reflog
Con log, checkout, branch y reset podemos “volver” a cualquier commit.
Con reflog, checkout, branch y reset podemos “volver” a cualquier estado.
log es un listado de commits!!
reflog es un listado de HEADs referencias
Reflog
$ git reflog
Que son referencias en git? HEADs, stash, tags, bisect … $ ls -l .git/refs
$ git reflog show feature-0002
Fsck
• Si reflog no funciona… que no cunda el panico
• fsck comprueba la integridad de la BD de git. Luego podemos recuperar objetos y referencias perdidas con alguna copia de seguridad
• Flags --full y --unreachable
Filter branch
Git está diseñado para no perder nunca cambios realizados… ¿Pero que pasa si queremos perderlos?
!
Filter branch
Git está diseñado para no perder nunca cambios realizados… ¿Pero que pasa si queremos perderlos?
!
eliminar passwords de producción commiteados y pusheados
$ git filter-branch —tree-filter “sed ’s/mipassword//g’ > parameters.temp; mv parameters.temp parameters.yml”
Otros usos
• Documentación: Markdown + Github = WIN
• Blogging: Github Pages
• Git con imagenes: Github images diffing
Otros usos
• Documentación: Markdown + Github = WIN
• Blogging: Github Pages
• Git con imagenes: Github images diffing
Herramientas
• Hub: Wrapper de git para mejorar integración con Github
• Clientes:
• Tower
• SourceTree
• Github client
• gitk
• GitX
• IntelliJ (PHPStorm, PyCharm…)
¿Preguntas?Moltes gràcies :)