mercurial dvcs presentation to devjam 11/4/2009
DESCRIPTION
Mercurial DVCS presentation given to Minneapolis, MN DevJam meeting on 11/4/2009.TRANSCRIPT
distributed version control with mercurial
or: how I learned to stop worrying and love the merge
Presented by Ted Naleid
Wednesday, November 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
mercurial is robust and mature
Wednesday, November 4, 2009
large projectsPythonMozilla
NetBeansOpenOfficeOpenSolarisOpenJDK
Symbian OSXen Hypervisor
Wednesday, November 4, 2009
cross platform support great command line on win/mac/linux
standalone GUIs windows - TortiseHG
mac - murkylinux - hgk
Wednesday, November 4, 2009
IDE supportIntelliJEclipse
NetBeansVisual Studio
TextMateBBEditemacs
vi
Wednesday, November 4, 2009
continuous integration and bug tracking
HudsonCruise Control
BuildBotBambooTeamCity
JIRATrac
FogBugz/Kiln
+ support in maven and ant
Wednesday, November 4, 2009
internet hosting
bitbucketGoogle CodeSourceForgekenai (Sun)
Wednesday, November 4, 2009
centralized version control systems
Remote Repoupdate
commit
Build Server
Wednesday, November 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
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
mercurial strengths
subversion limitations
Wednesday, November 4, 2009
owned local repository
shared remote repository
Wednesday, November 4, 2009
always available
requires active net connection
Wednesday, November 4, 2009
speedy local access
slow over-the-wire access
Wednesday, November 4, 2009
multiple redundant copies
single point of failure
Wednesday, November 4, 2009
simple, in-place branch switching
hg update branch_name
working with branches is slow and painful
Wednesday, November 4, 2009
cheap, easy branches encourage
experimentation
expensive public branches discourage
experimentation
Wednesday, November 4, 2009
save whenever, push out when it’s ready
saving state is intertwined with releasing
Wednesday, November 4, 2009
would you use a word processor that only let you
save at the end of a paragraph?
Wednesday, November 4, 2009
single .hg directory at project root
litters workspace with .svn directories
Wednesday, November 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
merging is the core operation so it’s done well
merging is messy, dangerous and often
avoided
Wednesday, November 4, 2009
why is subversion merging so broken
and scary?
Wednesday, November 4, 2009
#1
when there are conflicts, you’re forced to merge into an unsaved working copy
Wednesday, November 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
in mercurial, you commit before pulling new code
only fully formed changes get pushed out
history is always preserved
Wednesday, November 4, 2009
merging is a common, trivial operation
a merge occurs every time you pull down new code
Wednesday, November 4, 2009
mercurial limitations
subversion strengths
Wednesday, November 4, 2009
new ideas require understanding
familiar
Wednesday, November 4, 2009
tool support not as mature
very strong tool support
Wednesday, November 4, 2009
not optimal forhuge binary files
better choice for lots ofhuge binary files
Wednesday, November 4, 2009
convention defineswhere to push/pull
from
everyone knows where the canonical repository is
Wednesday, November 4, 2009
no easy way to get only part of a
repository
checking out part of a repository is easy
Wednesday, November 4, 2009
tracks files, so empty directories aren’t
saved
allows empty directories
Wednesday, November 4, 2009
annoying holy war raging over
hg vs. git
subversion is the clear leader in free
centralized version control
Wednesday, November 4, 2009
mercurial git
Wednesday, November 4, 2009
easy local revision numbers
md5 is easy, right?
Wednesday, November 4, 2009
plugin design with basic default functionality
kitchen sink design
Wednesday, November 4, 2009
better performance over http, built-in quick
serverhg serve
slower http performance, no
easy built-in server
Wednesday, November 4, 2009
works well on windows, mac,
and linux
windows support is lacking and
low priority
Wednesday, November 4, 2009
history is sacred
(though you can commit sacrilege with plugins)
rewriting history is a badge of
honor
Wednesday, November 4, 2009
mercurial concepts
Wednesday, November 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
a change set with no children is a “head”
r0
r2
r1
r3
Wednesday, November 4, 2009
change sets have zero, one or two parents
Wednesday, November 4, 2009
the root has zero parents
r0
r2
r1
r3
r4
Wednesday, November 4, 2009
normal commits have one parent
r0
r2
r1
r3
r4
Wednesday, November 4, 2009
merges have two parents
r0
r2
r1
r3
r4
Wednesday, November 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
history is immutable
Wednesday, November 4, 2009
merging only happens in your local repository
Wednesday, November 4, 2009
that’s it!
Wednesday, November 4, 2009
mercurial usage
Wednesday, November 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
hg inithg addhg commit -m “project start”
create a newrepository
r0 “project start”
Wednesday, November 4, 2009
commit changes to your
local repository
<changes ...>hg commit -m “created domain”
r0 “project start”
“created domain”r1
Wednesday, November 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
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
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
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
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
get an existingrepository
hg clone http://path.to.repo
a
b
a
b
remote local
Wednesday, November 4, 2009
get the latest changes from
another repository
hg pull
a
b
c
a
b
remote local
Wednesday, November 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
update your working directory with the changes
hg update
remote local
a
b
c
a
b
c
Wednesday, November 4, 2009
what if you’ve already made a change in your repository?
Wednesday, November 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
pulling in d gives us a new head
hg pull
remote local
a
b
d
a
c
b
d
Wednesday, November 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
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
push changes back out
hg push
remote local
a
c
b
d
e
a
b
d
Wednesday, November 4, 2009
push changes back out
hg push
remote local
a
c
b
d
e
a
c
b
d
e
Wednesday, November 4, 2009
how to get started with mercurial
Wednesday, November 4, 2009
watch the peepcode screencast
$9, cheap!
Wednesday, November 4, 2009
read the book
free online!
Wednesday, November 4, 2009
install it
Wednesday, November 4, 2009
start small
Wednesday, November 4, 2009
convert your existing repository
Wednesday, November 4, 2009
commit and share often
Wednesday, November 4, 2009
install and learn to use a 3-way merge tool
Wednesday, November 4, 2009
profit!
Wednesday, November 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
Questions?
Wednesday, November 4, 2009