mercurial dvcs presentation to devjam 11/4/2009

84
distributed version control with mercurial or: how I learned to stop worrying and love the merge Presented by Ted Naleid Wednesday, November 4, 2009

Upload: ted-naleid

Post on 23-Jan-2015

5.652 views

Category:

Technology


4 download

DESCRIPTION

Mercurial DVCS presentation given to Minneapolis, MN DevJam meeting on 11/4/2009.

TRANSCRIPT

Page 1: Mercurial DVCS presentation to DevJam 11/4/2009

distributed version control with mercurial

or: how I learned to stop worrying and love the merge

Presented by Ted Naleid

Wednesday, November 4, 2009

Page 2: Mercurial DVCS presentation to DevJam 11/4/2009

robust and mature“centralized” and “distributed”advantages over subversionwhy svn merging is brokensubversion’s advantagescomparison to gitconceptsbasic usagehow to get started

overview

Wednesday, November 4, 2009

Page 3: Mercurial DVCS presentation to DevJam 11/4/2009

mercurial is robust and mature

Wednesday, November 4, 2009

Page 4: Mercurial DVCS presentation to DevJam 11/4/2009

large projectsPythonMozilla

NetBeansOpenOfficeOpenSolarisOpenJDK

Symbian OSXen Hypervisor

Wednesday, November 4, 2009

Page 5: Mercurial DVCS presentation to DevJam 11/4/2009

cross platform support great command line on win/mac/linux

standalone GUIs windows - TortiseHG

mac - murkylinux - hgk

Wednesday, November 4, 2009

Page 6: Mercurial DVCS presentation to DevJam 11/4/2009

IDE supportIntelliJEclipse

NetBeansVisual Studio

TextMateBBEditemacs

vi

Wednesday, November 4, 2009

Page 7: Mercurial DVCS presentation to DevJam 11/4/2009

continuous integration and bug tracking

HudsonCruise Control

BuildBotBambooTeamCity

JIRATrac

FogBugz/Kiln

+ support in maven and ant

Wednesday, November 4, 2009

Page 8: Mercurial DVCS presentation to DevJam 11/4/2009

internet hosting

bitbucketGoogle CodeSourceForgekenai (Sun)

Wednesday, November 4, 2009

Page 9: Mercurial DVCS presentation to DevJam 11/4/2009

centralized version control systems

Remote Repoupdate

commit

Build Server

Wednesday, November 4, 2009

Page 10: Mercurial DVCS presentation to DevJam 11/4/2009

distributed version control system

Alice'sRepo

Build Repo

Carl's Repo

Build Server

Bob's Repo

commit

update

push

pull

Wednesday, November 4, 2009

Page 11: Mercurial DVCS presentation to DevJam 11/4/2009

distributed version control system

Alice'sRepo

Build Repo

Carl's Repo

Build Server

Bob's Repo

commit

update

push

pull

push

pullpushpull

Wednesday, November 4, 2009

Page 12: Mercurial DVCS presentation to DevJam 11/4/2009

mercurial strengths

subversion limitations

Wednesday, November 4, 2009

Page 13: Mercurial DVCS presentation to DevJam 11/4/2009

owned local repository

shared remote repository

Wednesday, November 4, 2009

Page 14: Mercurial DVCS presentation to DevJam 11/4/2009

always available

requires active net connection

Wednesday, November 4, 2009

Page 15: Mercurial DVCS presentation to DevJam 11/4/2009

speedy local access

slow over-the-wire access

Wednesday, November 4, 2009

Page 16: Mercurial DVCS presentation to DevJam 11/4/2009

multiple redundant copies

single point of failure

Wednesday, November 4, 2009

Page 17: Mercurial DVCS presentation to DevJam 11/4/2009

simple, in-place branch switching

hg update branch_name

working with branches is slow and painful

Wednesday, November 4, 2009

Page 18: Mercurial DVCS presentation to DevJam 11/4/2009

cheap, easy branches encourage

experimentation

expensive public branches discourage

experimentation

Wednesday, November 4, 2009

Page 19: Mercurial DVCS presentation to DevJam 11/4/2009

save whenever, push out when it’s ready

saving state is intertwined with releasing

Wednesday, November 4, 2009

Page 20: Mercurial DVCS presentation to DevJam 11/4/2009

would you use a word processor that only let you

save at the end of a paragraph?

Wednesday, November 4, 2009

Page 21: Mercurial DVCS presentation to DevJam 11/4/2009

single .hg directory at project root

litters workspace with .svn directories

Wednesday, November 4, 2009

Page 22: Mercurial DVCS presentation to DevJam 11/4/2009

instant setup enables new uses

hg inithg add

hg commit -m “first commit”

time to set up new repository limits use

Wednesday, November 4, 2009

Page 23: Mercurial DVCS presentation to DevJam 11/4/2009

merging is the core operation so it’s done well

merging is messy, dangerous and often

avoided

Wednesday, November 4, 2009

Page 24: Mercurial DVCS presentation to DevJam 11/4/2009

why is subversion merging so broken

and scary?

Wednesday, November 4, 2009

Page 25: Mercurial DVCS presentation to DevJam 11/4/2009

#1

when there are conflicts, you’re forced to merge into an unsaved working copy

Wednesday, November 4, 2009

Page 26: Mercurial DVCS presentation to DevJam 11/4/2009

#2

when there are no conflicts, you aren’t forced to merge

this is a bug, not a feature

Wednesday, November 4, 2009

Page 27: Mercurial DVCS presentation to DevJam 11/4/2009

in mercurial, you commit before pulling new code

only fully formed changes get pushed out

history is always preserved

Wednesday, November 4, 2009

Page 28: Mercurial DVCS presentation to DevJam 11/4/2009

merging is a common, trivial operation

a merge occurs every time you pull down new code

Wednesday, November 4, 2009

Page 29: Mercurial DVCS presentation to DevJam 11/4/2009

mercurial limitations

subversion strengths

Wednesday, November 4, 2009

Page 30: Mercurial DVCS presentation to DevJam 11/4/2009

new ideas require understanding

familiar

Wednesday, November 4, 2009

Page 31: Mercurial DVCS presentation to DevJam 11/4/2009

tool support not as mature

very strong tool support

Wednesday, November 4, 2009

Page 32: Mercurial DVCS presentation to DevJam 11/4/2009

not optimal forhuge binary files

better choice for lots ofhuge binary files

Wednesday, November 4, 2009

Page 33: Mercurial DVCS presentation to DevJam 11/4/2009

convention defineswhere to push/pull

from

everyone knows where the canonical repository is

Wednesday, November 4, 2009

Page 34: Mercurial DVCS presentation to DevJam 11/4/2009

no easy way to get only part of a

repository

checking out part of a repository is easy

Wednesday, November 4, 2009

Page 35: Mercurial DVCS presentation to DevJam 11/4/2009

tracks files, so empty directories aren’t

saved

allows empty directories

Wednesday, November 4, 2009

Page 36: Mercurial DVCS presentation to DevJam 11/4/2009

annoying holy war raging over

hg vs. git

subversion is the clear leader in free

centralized version control

Wednesday, November 4, 2009

Page 37: Mercurial DVCS presentation to DevJam 11/4/2009

mercurial git

Wednesday, November 4, 2009

Page 38: Mercurial DVCS presentation to DevJam 11/4/2009

easy local revision numbers

md5 is easy, right?

Wednesday, November 4, 2009

Page 39: Mercurial DVCS presentation to DevJam 11/4/2009

plugin design with basic default functionality

kitchen sink design

Wednesday, November 4, 2009

Page 40: Mercurial DVCS presentation to DevJam 11/4/2009

better performance over http, built-in quick

serverhg serve

slower http performance, no

easy built-in server

Wednesday, November 4, 2009

Page 41: Mercurial DVCS presentation to DevJam 11/4/2009

works well on windows, mac,

and linux

windows support is lacking and

low priority

Wednesday, November 4, 2009

Page 42: Mercurial DVCS presentation to DevJam 11/4/2009

history is sacred

(though you can commit sacrilege with plugins)

rewriting history is a badge of

honor

Wednesday, November 4, 2009

Page 43: Mercurial DVCS presentation to DevJam 11/4/2009

mercurial concepts

Wednesday, November 4, 2009

Page 44: Mercurial DVCS presentation to DevJam 11/4/2009

change sets are stored as nodes in a DAG

(directed acyclic graph)

r0

r2

r1

r3newest

oldest

time

tip

file system version

Wednesday, November 4, 2009

Page 45: Mercurial DVCS presentation to DevJam 11/4/2009

a change set with no children is a “head”

r0

r2

r1

r3

Wednesday, November 4, 2009

Page 46: Mercurial DVCS presentation to DevJam 11/4/2009

change sets have zero, one or two parents

Wednesday, November 4, 2009

Page 47: Mercurial DVCS presentation to DevJam 11/4/2009

the root has zero parents

r0

r2

r1

r3

r4

Wednesday, November 4, 2009

Page 48: Mercurial DVCS presentation to DevJam 11/4/2009

normal commits have one parent

r0

r2

r1

r3

r4

Wednesday, November 4, 2009

Page 49: Mercurial DVCS presentation to DevJam 11/4/2009

merges have two parents

r0

r2

r1

r3

r4

Wednesday, November 4, 2009

Page 50: Mercurial DVCS presentation to DevJam 11/4/2009

branch name is determined by the first parent

r0

r2

r1

r3

r4

branch: default

branch: release_1.x

branch: default

r0

r2

r1

r4

branch: default

branch: release_1.x

branch: release_1.x

r3

first parent is r2 first parent is r3

Wednesday, November 4, 2009

Page 51: Mercurial DVCS presentation to DevJam 11/4/2009

history is immutable

Wednesday, November 4, 2009

Page 52: Mercurial DVCS presentation to DevJam 11/4/2009

merging only happens in your local repository

Wednesday, November 4, 2009

Page 53: Mercurial DVCS presentation to DevJam 11/4/2009

that’s it!

Wednesday, November 4, 2009

Page 54: Mercurial DVCS presentation to DevJam 11/4/2009

mercurial usage

Wednesday, November 4, 2009

Page 55: Mercurial DVCS presentation to DevJam 11/4/2009

hg status <-> svn status hg log <-> svn loghg diff <-> svn diffhg cat <-> svn cathg blame <-> svn blame

hg add <-> svn addhg remove <-> svn removehg rename <-> svn renamehg update <-> svn updatehg resolve <-> svn resolvehg commit <-> svn commithg merge <-> svn merge

familiar basic commands

Wednesday, November 4, 2009

Page 56: Mercurial DVCS presentation to DevJam 11/4/2009

hg inithg addhg commit -m “project start”

create a newrepository

r0 “project start”

Wednesday, November 4, 2009

Page 57: Mercurial DVCS presentation to DevJam 11/4/2009

commit changes to your

local repository

<changes ...>hg commit -m “created domain”

r0 “project start”

“created domain”r1

Wednesday, November 4, 2009

Page 58: Mercurial DVCS presentation to DevJam 11/4/2009

commit changes to your

local repository

<more changes...>hg commit -m “updated user”

r0 “project start”

“created domain”r1

“updated user”r2

Wednesday, November 4, 2009

Page 59: Mercurial DVCS presentation to DevJam 11/4/2009

switch your file system to a

different revision

hg update -r 1

r0 “project start”

“created domain”

“updated user”

r1

r2

Wednesday, November 4, 2009

Page 60: Mercurial DVCS presentation to DevJam 11/4/2009

create a branch

hg branch release_1.0.x<changes...>hg commit -m “fix role”

r0“project start”branch: default

“updated user”branch: default

r2

“created domain”branch: default

r1

“fix role”branch: release_1.x

r3

Wednesday, November 4, 2009

Page 61: Mercurial DVCS presentation to DevJam 11/4/2009

merge changes from a branch

hg update default

r0

r2

r1

“fix role”branch: release_1.x

r3

“project start”branch: default

“updated user”branch: default

“created domain”branch: default

Wednesday, November 4, 2009

Page 62: Mercurial DVCS presentation to DevJam 11/4/2009

merge changes from a branch

hg merge release_1.x<resolve any conflicts>hg commit -m “merged branch”

r0 “project start”

“updated user”r2

“created domain”r1

“fix role”branch: release_1.x

r3

r4 “merged branch”

Wednesday, November 4, 2009

Page 63: Mercurial DVCS presentation to DevJam 11/4/2009

get an existingrepository

hg clone http://path.to.repo

a

b

a

b

remote local

Wednesday, November 4, 2009

Page 64: Mercurial DVCS presentation to DevJam 11/4/2009

get the latest changes from

another repository

hg pull

a

b

c

a

b

remote local

Wednesday, November 4, 2009

Page 65: Mercurial DVCS presentation to DevJam 11/4/2009

pull adds changes but

doesn’t modify file system

hg pull

a

b

c

a

b

c

remote local

Wednesday, November 4, 2009

Page 66: Mercurial DVCS presentation to DevJam 11/4/2009

update your working directory with the changes

hg update

remote local

a

b

c

a

b

c

Wednesday, November 4, 2009

Page 67: Mercurial DVCS presentation to DevJam 11/4/2009

what if you’ve already made a change in your repository?

Wednesday, November 4, 2009

Page 68: Mercurial DVCS presentation to DevJam 11/4/2009

we added c to b

they added d to b

hg pull

remote local

a

b

d

a

b

c

Wednesday, November 4, 2009

Page 69: Mercurial DVCS presentation to DevJam 11/4/2009

pulling in d gives us a new head

hg pull

remote local

a

b

d

a

c

b

d

Wednesday, November 4, 2009

Page 70: Mercurial DVCS presentation to DevJam 11/4/2009

when we try to update to the tip, hg says you need

to merge

hg update # abort, crosses branches

remote local

a

b

d

a

c

b

d

Wednesday, November 4, 2009

Page 71: Mercurial DVCS presentation to DevJam 11/4/2009

merge the changes together

hg merge<resolve any conflicts>hg commit -m “merge done”

hg fetch does all this in one command(pull, update, merge, commit) use that instead

remote local

a

b

d

a

c

b

d

e

Wednesday, November 4, 2009

Page 72: Mercurial DVCS presentation to DevJam 11/4/2009

push changes back out

hg push

remote local

a

c

b

d

e

a

b

d

Wednesday, November 4, 2009

Page 73: Mercurial DVCS presentation to DevJam 11/4/2009

push changes back out

hg push

remote local

a

c

b

d

e

a

c

b

d

e

Wednesday, November 4, 2009

Page 74: Mercurial DVCS presentation to DevJam 11/4/2009

how to get started with mercurial

Wednesday, November 4, 2009

Page 75: Mercurial DVCS presentation to DevJam 11/4/2009

watch the peepcode screencast

$9, cheap!

Wednesday, November 4, 2009

Page 76: Mercurial DVCS presentation to DevJam 11/4/2009

read the book

free online!

Wednesday, November 4, 2009

Page 77: Mercurial DVCS presentation to DevJam 11/4/2009

install it

Wednesday, November 4, 2009

Page 78: Mercurial DVCS presentation to DevJam 11/4/2009

start small

Wednesday, November 4, 2009

Page 79: Mercurial DVCS presentation to DevJam 11/4/2009

convert your existing repository

Wednesday, November 4, 2009

Page 80: Mercurial DVCS presentation to DevJam 11/4/2009

commit and share often

Wednesday, November 4, 2009

Page 81: Mercurial DVCS presentation to DevJam 11/4/2009

install and learn to use a 3-way merge tool

Wednesday, November 4, 2009

Page 82: Mercurial DVCS presentation to DevJam 11/4/2009

profit!

Wednesday, November 4, 2009

Page 83: Mercurial DVCS presentation to DevJam 11/4/2009

linksmercurial wiki/downloadhttp://mercurial.selenic.com

O’Reilly’s Mercurial - The Definitive Guidehttp://hgbook.red-bean.com/ (free!)

peepcode intro screencast ($9)http://peepcode.com/products/meet-mercurial

mercurial branching infohttp://stevelosh.com/blog/entry/2009/8/30/a-guide-to-branching-in-mercurial/

ACM article on DVCShttp://preview.tinyurl.com/qezmta

Wednesday, November 4, 2009

Page 84: Mercurial DVCS presentation to DevJam 11/4/2009

Questions?

Wednesday, November 4, 2009