Mejorando en Git

Preview:

DESCRIPTION

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...

Citation preview

Mejorando en Git

@SergiGP Software Craftsmanship BCN

@SergiGP

Developer en Akamon

PHP & Javascript & …

aprendiz

sergigp.com

Personalización

$ vim ~/.gitconfig

$ git st $ git ci -m ‘refactor’ $ git co master

*~ .DS_Store .idea

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

Pull Requests

Epic PRs

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”

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 :)