Charla en Software Craftmanship Barcelona sobre gtilidades y trucos en git. No es una introducción y se dan por sabidos los conceptos básicos como commit, push, pull...
6. Cherry Pick
$ git co feature-0002
$ git cherry-pick 0bb6886
$ git log --oneline
Mover cambios entre branches
7. 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
8. 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
9. 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?
10. Merge vs Rebase
$ git co master
$ git merge feature-0001
$ git log --oneline
11. Merge vs Rebase
$ git co feature-0001
$ git rebase master
$ git co master
$ git rebase feature-0001
$ git log --oneline
12. Merge vs Rebase
$ git co HEAD~2 (nos vamos dos commits atrás)
rebasemerge
13. 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
14. Submodules
• Repositorios dentro de repositorios
• Librerías externas en nuestro proyecto que
queremos mantener actualizadas
• Mantener en repos para diferentes partes del
proyecto
15. 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
16. 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…)
18. 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
59. 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
60. 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
61. 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
62. 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
63. 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
64. 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
65. 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
66. 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
67. 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
68. 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/rails
Hi, I’m DHH
and TDD is
DEAD
69. 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/rails
Hi, I’m DHH
and TDD is
DEAD
git ci -m ‘remove
active record’
70. 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/rails
Hi, I’m DHH
and TDD is
DEAD
git ci -m ‘remove
active record’
Pull Request!
71. 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/rails
Hi, I’m DHH
and TDD is
DEAD
git ci -m ‘remove
active record’
Pull Request!
Pull Request
72. 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/rails
Hi, I’m DHH
and TDD is
DEAD
git ci -m ‘remove
active record’
Pull Request!
Pull Request
73. 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/rails
Hi, I’m DHH
and TDD is
DEAD
git ci -m ‘remove
active record’
Pull Request!
Pull Request
F*CK YOU
76. 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
77. Reflog
$ git reflog
Que son referencias en git?
HEADs, stash, tags, bisect …
$ ls -l .git/refs
$ git reflog show feature-0002
78. 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
79. Filter branch
Git está diseñado para no perder nunca cambios
realizados… ¿Pero que pasa si queremos perderlos?
!
80. 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”