+ All Categories
Transcript
Page 1: Git with t for teams

GITTEAMWITH T FOR

@svenpet

Page 2: Git with t for teams

SVN

Page 3: Git with t for teams

GIT

Page 4: Git with t for teams

MERCURIAL

Page 5: Git with t for teams

CVS

Page 6: Git with t for teams

ANYTHING ELSETFS Perforce ClearCase VSS

Page 7: Git with t for teams

NO VCS AT ALL?

you must love pain

Page 8: Git with t for teams

CHEAP BRANCHINGEVERYTHING IS LOCAL

GIT IS FASTGIT IS SMALL

THE STAGING AREADISTRIBUTED

GITHUB & BITBUCKETGIT IS THE NEW STANDARD

HUGE COMMUNITY

GITWHY IS GOOD*?

* from Lemi Orhan Ergin

Page 9: Git with t for teams

GITWHY IS GOOD*?

CHEAP BRANCHINGEVERYTHING IS LOCAL

GIT IS FASTGIT IS SMALL

THE STAGING AREADISTRIBUTED

GITHUB & BITBUCKETGIT IS THE NEW STANDARD

HUGE COMMUNITY

WORKFLOW CAPABILITIES

* from Lemi Orhan Ergin

Page 10: Git with t for teams

MASTER RELEASEVERSION 1.9

DETAILED VIEW

Page 11: Git with t for teams

BIRDS VIEW

Page 12: Git with t for teams

DESIGNED FOR OPEN SOURCE

Page 13: Git with t for teams

DISTRIBUTED WORKFLOW

Page 14: Git with t for teams

CENTRALIZEDWORKFLOW

companies like those

Page 15: Git with t for teams

@svenpet http://svenpet.com

Sven PetersATLASSIAN AMBASSADOR

Page 16: Git with t for teams

RELEASECan we fix a bug for the upcoming

?

FEATUREIs the code for that

complete?

for the current version?HOTFIXCan we do a fast

BUILDCan we

the current code ?

REVIEWEDHas everybody

the code for this feature ?

Page 17: Git with t for teams

I FIND YOUR LACK OF WORKFLOW STRUCTURE DISTURBING

Page 18: Git with t for teams

DIFFERENTPEOPLEPRODUCTSCULTURES

Page 19: Git with t for teams

DIFFERENTPEOPLEPRODUCTSCULTURES JIRA, Bitbucket, Stash

Page 20: Git with t for teams

DIFFERENTPEOPLEPRODUCTSCULTURES

Page 21: Git with t for teams

DIFFERENTPEOPLEPRODUCTSCULTURES

DIFFERENT WORKFLOWS

Page 22: Git with t for teams

WORKFLOWBUILD YOUR

rebasemerge

fork

clone

push

pull

Page 23: Git with t for teams

Git

WORKFLOWBUILD YOUR

Page 24: Git with t for teams

NOT POSSIBLE WITH GITONE WORKFLOW:

Page 25: Git with t for teams

block files while working on it

Page 26: Git with t for teams

we know what can happen!

Page 27: Git with t for teams

FORK WORKFLOWS

Page 28: Git with t for teams

MAKES A COPY OF A REPOSITORY ON THE SERVER

YOU CAN NOT WRITE DIRECTLY TO THE ORIGINAL REMOTE REPOSITORY

YOU CAN STILL GET CHANGES FROM THE ORIGINAL REMOTE REPOSITORY

forking rocks!

Page 29: Git with t for teams

THE GATEKEEPER WORKFLOWfor teams

Page 30: Git with t for teams

REPOSITORY

it's such an awesome library

Page 31: Git with t for teams

REPOSITORYFORKED

REPOSITORYFORK

Page 32: Git with t for teams

REPOSITORYFORKED

REPOSITORYSYNCH

Get updates on request or automatically*

* with awesome tools like Stash or with Git hooks

Page 33: Git with t for teams

REPOSITORYFORKED

REPOSITORYFORK

I've done an awesome change

Page 34: Git with t for teams

REPOSITORYFORKED

REPOSITORYPUSH CHANGEX

Page 35: Git with t for teams

REPOSITORYFORKED

REPOSITORY

can you pull in my changes? he is the gatekeeper

Page 36: Git with t for teams

REPOSITORYFORKED

REPOSITORYPULL CHANGES

likes the changes

Page 37: Git with t for teams

exactly and it works great!

LOOKS LIKE AN OPEN SOURCE PROCESS?

Page 38: Git with t for teams

DISTRIBUTED TEAMS

DIFFERENT PROGRAMMING SKILLS

FLEXIBLE ROADMAPS

LEARN FROM OPEN SOURCE TEAMS?

Page 39: Git with t for teams

FORKING IN THEENTERPRISE

Page 40: Git with t for teams

FORKING IN THEENTERPRISE

5 REASONS FOR...

Page 41: Git with t for teams

FORKING IN THEENTERPRISE

REASON 1

GREAT FOR CUSTOMIZING LIBRARIES

and still get bug fixes

Page 42: Git with t for teams

FORKING IN THEENTERPRISE

REASON 2

GREAT FOR INNOVATION SPIKES

and maybe add it later

Page 43: Git with t for teams

FORKING IN THEENTERPRISE

REASON 3

PROTECTING YOUR COMPONENTS

but still be open for changes

Page 44: Git with t for teams

FORKING IN THEENTERPRISE

REASON 4

REDUCE THE NOISE

and keep the overview for huge projects

Page 45: Git with t for teams

FORKING IN THEENTERPRISE

REASON 5

INTERACTION WITH CONTRACTORS & INTERNSprotect your sources

Page 46: Git with t for teams

THE WORKFLOWDICTATORS &LIEUTENANTS

Page 47: Git with t for teams

an army of developer

Page 48: Git with t for teams

a few integrator

Page 49: Git with t for teams

and a friendly dictator

Page 50: Git with t for teams

BLESSED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY SYNCH

Page 51: Git with t for teams

BLESSED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY Pull

Page 52: Git with t for teams

BLESSED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY PullX

too much stuff!

Page 53: Git with t for teams

BLESSED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY

Pull

Pull Pull

Page 54: Git with t for teams

BLESSED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY

FORKED REPOSITORY

Pull

Pull Pull

We are here to help!

Page 55: Git with t for teams

GREAT FOR HUGE PROJECTS

Page 56: Git with t for teams

THIS IS A POTENTIAL BOTTLENECK

Page 57: Git with t for teams

YOU NEED MORE FREEDOM?AND WANT TO MOVE FAST?

Page 58: Git with t for teams

THE CENTRALIZED WORKFLOW

Page 59: Git with t for teams

HELLO SUBVERSION USERS!

THIS FLOWISYOUR

but Git makes it even better

Page 60: Git with t for teams

master

ONE BRANCHTO RULE THEM ALL

all code goes in here

Page 61: Git with t for teams

CENTRAL REPOSITORY

CLONED REPOSITORY

your (full) local copy for development

Page 62: Git with t for teams

CENTRAL REPOSITORY

CLONED REPOSITORY

everybody integrate changes here

your (full) local copy for development

Page 63: Git with t for teams

CENTRAL REPOSITORY

CLONED REPOSITORY

do that often!

Page 64: Git with t for teams

SIMPLE & EASY TO LEARN

+CI = ALWAYS DEPLOYABLE

CONFLICTS GET VISIBLE EARLY

USED FOR YEARS

Page 65: Git with t for teams

GREAT FOR MIGRATING

don't change too much at once

Page 66: Git with t for teams

UNFINISHED

FEATURES

Page 67: Git with t for teams

FEATURE TOGGLES

Page 68: Git with t for teams

THE WORKFLOWFEATUREBRANCH

Page 69: Git with t for teams

WE ORGANIZE WORK IN TASKS, STORIES, FEATURES

WHY NOT HAVE THAT IN CODE, TOO?

Page 70: Git with t for teams

master

Feature 1

Feature 2BRANCH PER FEATURE

1 to X devs working on a branch

Page 71: Git with t for teams

master

BRANCH PER FEATURE

Feature 1

Feature 2

get closed when done

Page 72: Git with t for teams

CLEAN MASTER BRANCH

Page 73: Git with t for teams

ISOLATED FEATURE DEVELOPMENT

Page 74: Git with t for teams

GREATFOR FIXED TIME / FIXED FEATURE DEVELOPMENT

develop while bugfix

Page 75: Git with t for teams

GREATFOR CONTINUOUS DELIVERY

deliver when done

Page 76: Git with t for teams

master

merge frequently

FEATURE BRANCH TIPS

Page 77: Git with t for teams

master

synch with MASTER frequently

FEATURE BRANCH TIPS

Page 78: Git with t for teams

master

delete branch when done

FEATURE BRANCH TIPS

Page 79: Git with t for teams

master

Feature 1

Feature 2BRANCH PER FEATURE

useful branch names

Page 80: Git with t for teams

master

ADD USER

DELETE USER

BRANCH PER FEATURE

useful branch names

Page 81: Git with t for teams

master

J-60 ADD USER

J-98 DELETE USER

BRANCH PER FEATURE

use key from issue tracker

Page 82: Git with t for teams

THE WORKFLOWFEATUREBRANCH

with code reviews

Page 83: Git with t for teams

LEARN

BETTER QUALITY

FEEL BETTER

BLAME

WHY DO YOU WANT TO DISCUSS YOUR CODE CHANGES?

Page 84: Git with t for teams

PULLREQUESTS

+

< >

Page 85: Git with t for teams

master

Pull Request

what do you think?

Page 86: Git with t for teams

master

Pull Request

discuss changes GOOD!

AGREE!

Page 87: Git with t for teams

master

Pull Request

approve changes

Page 88: Git with t for teams

master

Pull Request

merge

Page 89: Git with t for teams

THE WORKFLOW *

*SOURCE: ZACH HOLMAN "HOW GITHUB WORKS"

Page 90: Git with t for teams

THE WORKFLOWFEATUREBRANCH

with history

Page 91: Git with t for teams

DON'T FORGET YOUR PAST

Page 92: Git with t for teams

master

HISTORYDEVELOP

new branch called DEVELOP

Page 93: Git with t for teams

master

HISTORYDEVELOP

we integrate changes here

Feature

Page 94: Git with t for teams

master

HISTORYDEVELOP

and tag our releases here

Feature

V. 1.1

Page 95: Git with t for teams

master

HISTORYDEVELOP

makes this branch stable

Feature

V. 1.1

Page 96: Git with t for teams

THE

WORKFLOW

Page 97: Git with t for teams

Prod

ucti

on

STAG

ING

upcoming version

THE

WORKFLOW

never direct integration... just for hotfixes

only through Pull Request (except when not)

Page 98: Git with t for teams

Prod

ucti

on

STAG

ING

without Pull Request

THE

WORKFLOW

we create a HOTFIX branch (of course) and also merge to STAGING-Branch

Page 99: Git with t for teams

THE WORKFLOWRELEASE

Page 100: Git with t for teams

COOL STUFFWE'RE FLOWING!

Page 101: Git with t for teams

RELEASE CANDIDATES

inspect your release candidate

Page 102: Git with t for teams

inspect your release candidate...and don't destroy your flow

RELEASE CANDIDATES

Page 103: Git with t for teams

mast

er

RELEASE

DEVE

LOP

RELE

ASE

CAND

IDAT

E

feature complete

release team works here

other dev teams "flow" here

Page 104: Git with t for teams

mast

er

RELEASE

DEVE

LOP

RELE

ASE

CAND

IDAT

E fixing back to DEVELOP

Page 105: Git with t for teams

mast

er

RELEASE

DEVE

LOP

RELE

ASE

CAND

IDAT

E

merge, tag, release!

V. 1.1

Page 106: Git with t for teams

POTENTIA

LLY

READY

PROMISED SET OF FEATURES

BUGS HAVE A BIG IMPACT

RELEASES ARE EXPENSIVE

AFRAID OF FAILURES

Page 107: Git with t for teams

THE WORKFLOWMAINTENANCE

Page 108: Git with t for teams

RELEASED SOFTWARE HAS BUGSHouston we have a problem

Page 109: Git with t for teams

mast

er

MAINTENANCE

DEVE

LOP

1.1

hotf

ix branch from MASTER and fix the damn bug

Page 110: Git with t for teams

mast

er

MAINTENANCE

DEVE

LOP

1.1

hotf

ix

merge with MASTER, tag and release

1.2.1

Page 111: Git with t for teams

mast

er

MAINTENANCE

DEVE

LOP

1.1

hotf

ix

merge with DEVELOP and delete HOTFIX

1.2.1

Page 112: Git with t for teams

mast

er

MAINTENANCE

DEVE

LOP

1.1

hotf

ixRC

- 1.2

1.1.2

ONE EXCEPTION: A RELEASE BRANCH EXISTS

Page 113: Git with t for teams

THE FLOWGIT

Page 114: Git with t for teams

YOU'VE JUST SEEN IT!

Page 115: Git with t for teams

FLOWGITTHEDEVELOP & MASTER BRANCH

FEATURE BRANCHES

RELEASE BRANCHES

MAINTENANCE BRANCHES

from Vincent Driessen

Page 116: Git with t for teams

HOW CAN I FIND MY WAY THROUGH THE

RULE JUNGLE?

USE TOOLS

Page 117: Git with t for teams

HOW CAN I REMEMBER ALL THESE

GIT COMMANDS AND RULES?

there is a command line tool

git flow release start 1.6

git flow feature start 'JRA-34 Add User'

git flow feature finish 'JRA-34 Add User'

git flow hotfix finish 1.5.3

Page 118: Git with t for teams

HOW CAN I REMEMBER ALL THESE

GIT COMMANDS AND RULES?

Page 119: Git with t for teams

FLOWGITWHY

I thought every team is different?

Page 120: Git with t for teams

FLOWGITWHY

IT CAPTURES A LOT OF DEVELOPMENT SITUATIONSIT'S WELL KNOWN: EASY ADOPTION

BUTI WON'T USE IT OUT-OF-THE-BOX: ADAPT IT!

Page 121: Git with t for teams

THE FLOWSTASH TEAMat Atlassian

Page 122: Git with t for teams

FLOWGITMAKINGMORE SIMPLE

getting rid of MASTER

Page 123: Git with t for teams

BRANCH

KEEP YOUR

RELEASE no merge into MASTER needed

Page 124: Git with t for teams

RELE

ASE

2.1

STASH TEAM FLOW

DEVE

LOP

2.1

no MASTER, we keep RELEASE

Page 125: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

2.1hotf

ix 2

.1.1

branch HOTFIX from RELEASE and fix the damn bug

STASH TEAM FLOW

Page 126: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

2.1hotf

ix 2

.1.1

merge back to RELEASE2.1

.1

STASH TEAM FLOW

Page 127: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

2.1hotf

ix 2

.1.1

and apply changes to DEVELOP

2.1.1

STASH TEAM FLOW

Page 128: Git with t for teams

SUPPORTING OLD VERSIONS

they are still out there ...and have sometimes problems

Page 129: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

we need to fix a bug in 2.0

RELE

ASE

2.0

STASH TEAM FLOW

Page 130: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

hotf

ix 2

.0.1

you've seen this before

RELE

ASE

2.0

STASH TEAM FLOW

Page 131: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

hotf

ix 2

.0.1

merge with 2.1 RELEASE branch

RELE

ASE

2.0

STASH TEAM FLOW

Page 132: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

hotf

ix 2

.0.1

and apply changes from RELEASE 2.1 to DEVELOP

RELE

ASE

2.0

STASH TEAM FLOW

Page 133: Git with t for teams

can change tomorrowSTASH TEAM FLOW

Page 134: Git with t for teams

We want to helpSTASH TEAM FLOW

Page 135: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

2.1hotf

ix 2

.1.1 2.1

.1

I could do this

Page 136: Git with t for teams

I could do this

SERVER SIDE AUTO MERGES

with Git hooks

Page 137: Git with t for teams

LEAN BACK AND ENJOY PUREAWESOMENESS

Page 138: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

hotf

ix 2

.0.1

RELE

ASE

2.0

merge here

STASH TEAM FLOW

Page 139: Git with t for teams

RELE

ASE

2.1

DEVE

LOP

hotf

ix 2

.0.1

RELE

ASE

2.0

and let the robots take over

STASH TEAM FLOW

Page 140: Git with t for teams

NOT ENOUGH POSSIBILITIES?

Page 141: Git with t for teams

INFINITE WORKFLOW POSSIBILITIES

Page 142: Git with t for teams

CUSTOMIZE YOUR WORKFLOW WITH HOOKS

Page 143: Git with t for teams

PUSH

Page 144: Git with t for teams

PUSH

Script is doing some stuff

Page 145: Git with t for teams

PUSH

Page 146: Git with t for teams

WATCH OUT: HOOK MAGIC

at Atlassian

Page 147: Git with t for teams

1 DON'T BRANCH FROM A RED BUILD

Page 148: Git with t for teams

1 DON'T BRANCH FROM A RED BUILD

Page 149: Git with t for teams

2 BE INFORMED

Chat

Page 150: Git with t for teams

2 BE INFORMED

Page 151: Git with t for teams

WORKFLOWS WITH CI SERVERSContinuous Integration

Page 152: Git with t for teams

WANTWESTABLE DEVELOP BRANCH THAT IS CI TESTEDto be sure, that we won't break things

Page 153: Git with t for teams

COULDWEPULL CHANGES BUILD LOCALLY MERGE IF OK

Page 154: Git with t for teams

COULDWE

MERGE & PRAY

Page 155: Git with t for teams

MERGEAUTOON

WHY NOT USE

BRANCHES ?FEATUREand build it from there!

Page 156: Git with t for teams

DEVELOP

potential integration problem

AUTO MERGES

Page 157: Git with t for teams

DEVELOP

pull frequently

AUTO MERGES

Page 158: Git with t for teams

DEVELOP

pull frequently automatically on commits

AUTO MERGES

Page 159: Git with t for teams

SOMETIMES WHEN MERGING

SHIT HAPPENS.

AND SOMEBODY PUSHES BUGGY CODE TO DEVELOP

Page 160: Git with t for teams

DEVELOP

push automatically on green builds of DEVELOP

GREEN BUILD MERGES

Page 161: Git with t for teams

POOR CI ADMINISTRATOR

setting up builds for all these tasks

Page 162: Git with t for teams

AUTO DETECT BRANCHES

Page 163: Git with t for teams

AUTO DETECT BRANCHES

Page 164: Git with t for teams

BUILD ON EVERY COMMIT KILLED OUR CI SERVERS

x features branches * x pushes a day = server overload

Page 165: Git with t for teams

BUILD ON EVERY COMMIT ON MASTER, RELEASE & DEVELOPBUILD MANUALLY ON FEATURE BRANCHES

DOING AUTO MERGES ON GREEN BUILDS OF DEVELOP

Page 166: Git with t for teams

WORKFLOWS WITH ISSUETRACKING

Page 167: Git with t for teams

DIFFERENT PEOPLE HAVE DIFFERENT VIEWS ON YOUR PROJECT

cool developers

incredible product owner

amazing scrum master

Page 168: Git with t for teams

ISSUE TRACKERS CONNECT US CODERS WITH THE REAL WORLD

cool developers

incredible product owner

amazing scrum master

Page 169: Git with t for teams

ISSUE TRACKERS CONNECTS GIT WITH THE REAL WORLD

cool developers

incredible product owner

amazing scrum master

Page 170: Git with t for teams

WE LIVE IN CODE!

LET ME WORK IN CODE I JUST NEED TO KNOW WHAT

MY CODE SHOULD SOLVE!

Page 171: Git with t for teams

Problem understood, I start coding

HOW DO ISSUE TRACKERS CONNECT TO THE CODE?

Page 172: Git with t for teams

HOW DO ISSUE TRACKERS CONNECT TO THE CODE?

Ah good, the coders started

Page 173: Git with t for teams

commit -m "fixes #6, resolve ticket #5"

HOW DO ISSUE TRACKERS CONNECT TO THE CODE?

Page 174: Git with t for teams

HOW DO ISSUE TRACKERS CONNECT TO THE CODE?

commit -m "fixes #6, resolve ticket #5"

Page 175: Git with t for teams

WHAT'S IN IT FOR ?

SEE WHAT'S IN DEVELOP

SEE ISSUES IN REVIEW

SEE FINISHED ISSUES ALREADY MERGED WITH DEVELOP

non geeks

Page 176: Git with t for teams

WHAT'S IN IT FOR ?

DOING CODE REVIEWS IN CONTEXTBROWSING FEATURE DESCRIPTIONS SHOW CODE CHANGES

Page 177: Git with t for teams

... I HAVE A DREAM

Page 178: Git with t for teams

'START PROGRESS' ON AN ISSUE CREATES A FEATURE BRANCH

DOING A PULL REQUEST MARKS THE ISSUE 'IN REVIEW'

MERGING A FEATURE BRANCH MARKS THE ISSUE AS 'RESOLVED'

GIT WORKFLOW

Page 179: Git with t for teams

'START PROGRESS' ON AN ISSUE CREATES A FEATURE BRANCH

DOING A PULL REQUEST MARKS THE ISSUE 'IN REVIEW'

MERGING A FEATURE BRANCH MARKS THE ISSUE AS 'RESOLVED'

ISSUE WORKFLOW

Page 180: Git with t for teams

'START PROGRESS' ON AN ISSUE CREATES A FEATURE BRANCH

DOING A PULL REQUEST MARKS THE ISSUE 'IN REVIEW'

MERGING A FEATURE BRANCH MARKS THE ISSUE AS 'RESOLVED'

Page 181: Git with t for teams

'START PROGRESS' ON AN ISSUE CREATES A FEATURE BRANCH

DOING A PULL REQUEST MARKS THE ISSUE 'IN REVIEW'

MERGING A FEATURE BRANCH MARKS THE ISSUE AS 'RESOLVED'

GIT COMBINED ISSUE WORKFLOW

Page 182: Git with t for teams

RISE GIT TOOLSOFTHE

Page 183: Git with t for teams

DON'T FLOW

LIKE IT'S 1999

Page 184: Git with t for teams

svenpet.com/talks@svenpet

DON'T USE GITTOMORROW 3PM ROOM 7

THANKS

Page 185: Git with t for teams

ResourcesRESOURCES

GIT WORKFLOWS https://www.atlassian.com/git/workflows

AUTO MERGES http://blogs.atlassian.com/2013/05/git-automatic-merges-with-server-side-hooks-for-the-win/

GIT RESOURCES https://www.atlassian.com/git/resources

https://blogs.atlassian.com/2013/07/git-upstreams-forks/FORKS & UPSTREAMS

Page 186: Git with t for teams

PICTURES

 http://www.flickr.com/photos/80384851@N00/2653886484/ http://www.flickr.com/photos/21461615@N00/1353110751  http://www.flickr.com/photos/82402697@N00/449512594  http://www.flickr.com/photos/7228825@N05/675810372  http://www.flickr.com/photos/38451115@N04/4016842259/ http://www.flickr.com/photos/8749778@N06/5601758699/  http://www.flickr.com/photos/37831703@N00/3391877877  http://www.flickr.com/photos/60648084@N00/2900765643/  http://www.flickr.com/photos/28415633@N00/8401940159 http://www.flickr.com/photos/41304517@N00/6814372181  http://www.flickr.com/photos/99796131@N00/120468504/  http://www.flickr.com/photos/92269745@N00/4612732045/  http://www.flickr.com/photos/57768341@N00/3800568262/

http://www.flickr.com/photos/43322231@N07/4390305784/  http://www.flickr.com/photos/40011478@N00/2890078135/ http://www.flickr.com/photos/33909206@N04/7638306424  http://www.flickr.com/photos/8340753@N04/501465437/  http://www.flickr.com/photos/33774513@N08/3510825685/ http://www.flickr.com/photos/55723329@N00/3631928376/  http://www.flickr.com/photos/11389536@N03/5235804240/  http://www.flickr.com/photos/43322231@N07/5410534167  http://www.flickr.com/photos/43322231@N07/5366609719  http://www.flickr.com/photos/43322231@N07/4205372249/ http://www.flickr.com/photos/43322231@N07/4466599835/  http://www.flickr.com/photos/45940879@N04/5598027415/  http://www.flickr.com/photos/83346641@N00/3517813158/


Top Related