bgneal@13: <!DOCTYPE html> bgneal@13: <!-- bgneal@13: Copyright 2010 Google Inc. bgneal@13: bgneal@13: Licensed under the Apache License, Version 2.0 (the "License"); bgneal@13: you may not use this file except in compliance with the License. bgneal@13: You may obtain a copy of the License at bgneal@13: bgneal@13: http://www.apache.org/licenses/LICENSE-2.0 bgneal@13: bgneal@13: Unless required by applicable law or agreed to in writing, software bgneal@13: distributed under the License is distributed on an "AS IS" BASIS, bgneal@13: WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. bgneal@13: See the License for the specific language governing permissions and bgneal@13: limitations under the License. bgneal@13: bgneal@13: Original slides: Marcin Wichary (mwichary@google.com) bgneal@13: Modifications: Ernest Delgado (ernestd@google.com) bgneal@13: Alex Russell (slightlyoff@chromium.org) bgneal@13: bgneal@13: landslide modifications: Adam Zapletal (adamzap@gmail.com) bgneal@13: Nicolas Perriault (nperriault@gmail.com) bgneal@13: --> bgneal@13: <html> bgneal@13: <head> bgneal@13: <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> bgneal@13: <meta http-equiv="X-UA-Compatible" content="chrome=1"> bgneal@13: <title>Introduction to Distributed Version Control with Mercurial</title> bgneal@13: <!-- Styles --> bgneal@13: bgneal@13: <link rel="stylesheet" media="print" href="./my_theme/css/print.css"> bgneal@13: <link rel="stylesheet" media="screen, projection" href="./my_theme/css/screen.css"> bgneal@13: bgneal@13: bgneal@13: bgneal@13: <link rel="stylesheet" href="slides.css"> bgneal@13: bgneal@13: bgneal@13: <!-- /Styles --> bgneal@13: <!-- Javascripts --> bgneal@13: bgneal@13: <script type="text/javascript" src="./my_theme/js/slides.js"></script> bgneal@13: bgneal@13: bgneal@13: <!-- /Javascripts --> bgneal@13: </head> bgneal@13: <body> bgneal@13: <div id="blank"></div> bgneal@13: <div class="presentation"> bgneal@13: <div id="current_presenter_notes"> bgneal@13: <div id="presenter_note"></div> bgneal@13: </div> bgneal@13: <div class="slides"> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Introduction to Distributed Version Control with Mercurial</h1></header> bgneal@13: bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 1/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>(Subliminal Message)</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><img alt="images/stop.jpg" src="images/stop.jpg" /></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 2/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1># whoami</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><p>Brian Neal <<a class="reference external" href="mailto:bgneal1@rockwellcollins.com">bgneal1@rockwellcollins.com</a>></p> bgneal@13: <p>Started at Rockwell Collins in July 1999</p> bgneal@13: <p>You might remember me from the following programs:</p> bgneal@13: <ul class="simple"> bgneal@13: <li>UMS (July 1999 - Spring 2000)</li> bgneal@13: <li>Surgical Strike - (Spring - Fall 2000)</li> bgneal@13: <li>JTRS 2B - (Fall 2000 - Summer 2001)</li> bgneal@13: <li>SCAMP SEP - (Summer 2001 - October 2004)</li> bgneal@13: <li>TTNT (January 2005 - Present)</li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 3/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Brief History of Version Control Tools</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><h2>First Generation</h2> bgneal@13: <ul class="simple"> bgneal@13: <li>No networking!</li> bgneal@13: <li>Concurrency method: locks</li> bgneal@13: <li>Examples:<ul> bgneal@13: <li>SCCS - 1972</li> bgneal@13: <li>RCS - 1982</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 4/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Brief History of Version Control Tools</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><h2>Second Generation</h2> bgneal@13: <ul class="simple"> bgneal@13: <li>Client/Server networking; CVCS (Centralized Version Control)</li> bgneal@13: <li>Concurrency method: merge before commit</li> bgneal@13: <li>Examples:<ul> bgneal@13: <li>CVS - 1990</li> bgneal@13: <li>IBM Rational ClearCase - 1992</li> bgneal@13: <li>Visual SourceSafe - 1994</li> bgneal@13: <li>Perforce - 1995</li> bgneal@13: <li>SVN - 2000</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 5/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Brief History of Version Control Tools</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><h2>Third Generation</h2> bgneal@13: <ul class="simple"> bgneal@13: <li>Distributed networking; DVCS (Distributed Version Control)</li> bgneal@13: <li>Concurrency method: commit then merge</li> bgneal@13: <li>Examples:<ul> bgneal@13: <li>Bitkeeper - 2000</li> bgneal@13: <li>Darcs - 2003</li> bgneal@13: <li>Monotone - 2003</li> bgneal@13: <li>Git - 2005</li> bgneal@13: <li><strong>Mercurial</strong> - 2005</li> bgneal@13: <li>Fossil - 2006</li> bgneal@13: <li>Bazaar - 2007</li> bgneal@13: <li>Veracity - 2011</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 6/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>What is a CVCS Again?</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><img alt="images/cvcs.png" src="images/cvcs.png" /></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 7/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>So what's a DVCS look like?</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><img alt="images/dvcs.png" src="images/dvcs.png" /> bgneal@13: <p>All repositories are peers. By convention only, one repository is designated the master. bgneal@13: It is possible for all peers to exchange changes (via <em>push</em> and <em>pull</em> operations).</p></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 8/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>What does a DVCS buy you?</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><ul class="simple"> bgneal@13: <li>Private workspaces</li> bgneal@13: <li>Offline mode</li> bgneal@13: <li>Speed</li> bgneal@13: <li>Scalability</li> bgneal@13: <li>Split Geography</li> bgneal@13: <li>Flexible workflows</li> bgneal@13: <li>Distributed backups</li> bgneal@13: <li><strong>Easier merging</strong></li> bgneal@13: <li><strong>Commit before merge</strong></li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 9/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Private Workspaces</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><ul class="simple"> bgneal@13: <li>You can safely experiment in your local repository</li> bgneal@13: <li>Commit as often as you like without affecting the team<ul> bgneal@13: <li>Encourages "micro-commits"</li> bgneal@13: <li>With SVN, people often hold back until an entire feature is complete</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: <li>Encourages experimentation<ul> bgneal@13: <li>Make cheap repository clones to try things out</li> bgneal@13: <li>Not visible to coworkers</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 10/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Offline Mode</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><ul class="simple"> bgneal@13: <li>Work when you have spotty or no network access</li> bgneal@13: <li>Full access to the repo when offline</li> bgneal@13: <li>Can work on multiple tasks offline</li> bgneal@13: </ul> bgneal@13: <blockquote> bgneal@13: <ul class="simple"> bgneal@13: <li>Work on bug report #1</li> bgneal@13: <li>Commit</li> bgneal@13: <li>Work on bug report #2</li> bgneal@13: <li>With a CVCS, you'd have both fixes in the same pending commit</li> bgneal@13: </ul> bgneal@13: </blockquote></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 11/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Speed</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><ul class="simple"> bgneal@13: <li>Local operations are <strong>fast</strong><ul> bgneal@13: <li>No, really, <strong>you will</strong> notice a big difference</li> bgneal@13: <li>Switching between branches will blow your mind</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: <li>Initial pull down of an entire repository <em>might</em> be slower than a CVCS<ul> bgneal@13: <li>Then again, you might be surprised</li> bgneal@13: <li>Mercurial, for example, stores an entire repository in less space than bgneal@13: a SVN working copy in many cases</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 12/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Scalability</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><ul class="simple"> bgneal@13: <li>Some CVCS systems require heavy weight hardware to support the server<ul> bgneal@13: <li>E.g. ClearCase with a thousand users</li> bgneal@13: <li>With a DVCS, only pushes & pulls contact a central server</li> bgneal@13: <li>Most of the work is done locally</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 13/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Split Geography</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><ul class="simple"> bgneal@13: <li>Imagine a team split between Cedar Rapids & Richardson...</li> bgneal@13: <li>With a CVCS, you have to pick where to put the server</li> bgneal@13: <li>The remote location is stuck with network latency & associated problems</li> bgneal@13: <li>With a DVCS, each site can have a central repository<ul> bgneal@13: <li>The two central repos can be synched when convenient or even scripted</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul> bgneal@13: <img alt="images/split_geography.png" src="images/split_geography.png" /></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 14/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Flexible Workflows</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><ul class="simple"> bgneal@13: <li>There is no internal concept of a central repository</li> bgneal@13: <li>A central repository exits only by convention</li> bgneal@13: <li>More elaborate topologies and workflows can be created:<ul> bgneal@13: <li>A SW team may push to a central SW repo</li> bgneal@13: <li>Periodically changes from the SW repo are pushed to a QA repo</li> bgneal@13: <li>Changes from the QA repo can be pushed into a release repo</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul> bgneal@13: <img alt="images/flexible_workflows.png" src="images/flexible_workflows.png" /></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 15/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Distributed Backups</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><ul class="simple"> bgneal@13: <li>With a DVCS, multiple copies of the repository exist on multiple machines</li> bgneal@13: <li><strong>Of course, this is no substitute for a real backup strategy!</strong></li> bgneal@13: <li>But usually, and with short notice, you can easily designate a repository as bgneal@13: the central repository in an emergency</li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 16/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Easier Merging</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><ul class="simple"> bgneal@13: <li>Subversion has a bad reputation for merging<ul> bgneal@13: <li>Some of this is not warranted...<ul> bgneal@13: <li>Merge tracking was added in SVN v1.5</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: <li>SVN does not handle file renames and tree conflicts very well</li> bgneal@13: <li>A lot of teams simply avoid merging out of fear</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 17/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Easier Merging (cont.)</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><ul class="simple"> bgneal@13: <li>Why is merging better in a DVCS?<ul> bgneal@13: <li>Merging simply has to work correctly and be easy in a DVCS<ul> bgneal@13: <li>More attention was paid to this aspect by DVCS's</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: <li>DVCS's use directed acyclic graphs internally to represent change sets<ul> bgneal@13: <li>More information is available to make merge decisions</li> bgneal@13: <li>Easier to find common ancestors of code</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: <li>Developer changes and merge changes are separate<ul> bgneal@13: <li>"Commit before merge"</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 18/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Commit Before Merge</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><ul class="simple"> bgneal@13: <li>With a CVCS:<ul> bgneal@13: <li>You make changes in your working copy</li> bgneal@13: <li>Before you can commit, you often must peform an update<ul> bgneal@13: <li>This may trigger a merge</li> bgneal@13: <li>Your changes are now mixed up with your friendly coworkers' changes</li> bgneal@13: <li>Sometimes this can be a problem...</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: <li>With a DVCS:<ul> bgneal@13: <li>You make changes in your working copy</li> bgneal@13: <li>You commit locally!</li> bgneal@13: <li>You can then choose to pull changes from others and merge<ul> bgneal@13: <li><strong>Your changes are already safely tucked away and can be retrieved later if things go wrong</strong></li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 19/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Okay, what's the catch?</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><h2>Potential drawbacks to a DVCS</h2> bgneal@13: <ul class="simple"> bgneal@13: <li>Practically no support for locks<ul> bgneal@13: <li>This makes working with binary files difficult in a team environment</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: <li>Huge repositories are not practical</li> bgneal@13: <li>Hetrogenous repositories are not practical<ul> bgneal@13: <li>Not a good idea to mix, say, software, systems, and firmware in the same repo</li> bgneal@13: <li>Not a good idea to mix multiple products in the same repo</li> bgneal@13: <li>Arguably, this applies to a CVCS as well</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: <li>No support for path-based access control<ul> bgneal@13: <li>With current tools, you either can access the full repo, or nothing</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 20/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Introduction to Mercurial</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><ul class="simple"> bgneal@13: <li>Overview</li> bgneal@13: <li>Repositories & working directories</li> bgneal@13: <li>Changesets</li> bgneal@13: <li>Branches & Tags</li> bgneal@13: <li>Example workflow</li> bgneal@13: <li>Command overview</li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 21/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Mercurial Overview</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><ul class="simple"> bgneal@13: <li>Distributed Version Control System</li> bgneal@13: <li>Free, open source software licensed under GPL Version 2</li> bgneal@13: <li>Available for Microsoft Windows, GNU/Linux, Mac OS X, Solaris 11 Express</li> bgneal@13: <li>Written in Python with a small amount of C</li> bgneal@13: <li>Extensible with official and 3rd party extensions</li> bgneal@13: <li>TortoiseHg is a popular GUI for Windows</li> bgneal@13: <li>Reputation for being fast & easy to get started with</li> bgneal@13: <li>Can be served via Apache Web server</li> bgneal@13: <li>Repository hooks</li> bgneal@13: <li>Integrates with Trac</li> bgneal@13: <li>Can import history from other tools, including Subversion</li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 22/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Repositories & Working Directories</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><p>A repository consists of two things:</p> bgneal@13: <ul class="simple"> bgneal@13: <li>Your working directory (similar to a working copy in SVN)</li> bgneal@13: <li>The repository itself (also known as "the store")<ul> bgneal@13: <li>A .hg directory at the top of your working copy</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul> bgneal@13: <p>Example:</p> bgneal@13: <pre class="literal-block"> bgneal@13: $ ls -A bgneal@13: .hg .hgignore images/ slides.cfg slides.css slides.html slides.rst bgneal@13: </pre> bgneal@13: <ul class="simple"> bgneal@13: <li>Repositories communicate via the <em>push</em> and <em>pull</em> commands<ul> bgneal@13: <li>Push & Pull do not affect your working directory<ul> bgneal@13: <li>An <em>update</em> or <em>merge</em> must be performed to receive remote changes into your working directory</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 23/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>What's in a Repository?</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><p>A repository consists of a directed, acyclic graph of <em>changesets</em></p> bgneal@13: <img alt="images/repos.png" src="images/repos.png" /> bgneal@13: <ul class="simple"> bgneal@13: <li>Each changeset can have 0, 1, or 2 parents (and infinite children)</li> bgneal@13: <li>A changeset with 0 parents is the root</li> bgneal@13: <li>A changeset with 2 parents is the result of a merge</li> bgneal@13: <li>The newest changeset is called the <em>tip</em>, a special tag name</li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 24/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>What's a Changeset?</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><p>A changeset is an atomic collection of changes and some meta information. bgneal@13: The meta information includes:</p> bgneal@13: <ul class="simple"> bgneal@13: <li>Who made the changes</li> bgneal@13: <li>When the changes were made</li> bgneal@13: <li>Why - the commit message</li> bgneal@13: <li>The name of the branch the changes were made on ("default" is the default)</li> bgneal@13: <li>A local revision number</li> bgneal@13: <li>A changeset ID; a 40 digit hex number (SHA-1 hash of the changeset & parents)</li> bgneal@13: </ul> bgneal@13: <p>A changeset can be named by:</p> bgneal@13: <ul class="simple"> bgneal@13: <li>Revision number (within a repository)</li> bgneal@13: <li>Changeset ID (globally)</li> bgneal@13: <li>Tag name</li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 25/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Branches & Tags</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><ul class="simple"> bgneal@13: <li>In the simple case, each changeset appear in a line</li> bgneal@13: <li>When a changeset develops 2 or more children, a branch occurs<ul> bgneal@13: <li>The latest revision of a branch is called a <em>head</em></li> bgneal@13: <li>A <em>merge</em> is when two branches join back together</li> bgneal@13: <li>Branches can be given names; the default branch name is <em>"default"</em></li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: <li>Changesets can be given human readable names, or <em>tags</em><ul> bgneal@13: <li><em>Local tags</em> are only visible within a repository</li> bgneal@13: <li><em>Regular tags</em> are revision controlled and propagate to other repos</li> bgneal@13: <li>The newest head in a repository is a tag called <em>tip</em></li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 26/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Example Workflow</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><img alt="images/workflow1.png" src="images/workflow1.png" /></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 27/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Example Workflow (cont.)</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><img alt="images/workflow2.png" src="images/workflow2.png" /></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 28/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Example Workflow (cont.)</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><img alt="images/workflow3.png" src="images/workflow3.png" /> bgneal@13: <ul class="simple"> bgneal@13: <li>Notice that after Alice's pull:<ul> bgneal@13: <li>Her working directory is unaffected</li> bgneal@13: <li>Her repository only has one head => no merging required</li> bgneal@13: </ul> bgneal@13: </li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 29/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>SVN Commands for Review</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><p>Basic SVN commands:</p> bgneal@13: <ul class="simple"> bgneal@13: <li>add, remove, copy, move, mkdir</li> bgneal@13: <li>checkout, commit, update, revert</li> bgneal@13: <li>merge, resolved, diff</li> bgneal@13: <li>status, log</li> bgneal@13: <li>lock, unlock</li> bgneal@13: </ul></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 30/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Basic Mercurial Commands</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><p>Mercurial (hg) vs SVN commands:</p> bgneal@13: <ul class="simple"> bgneal@13: <li>add, remove, copy, move, <span class="strike">mkdir</span></li> bgneal@13: <li><span class="strike">checkout</span>, commit, update, revert</li> bgneal@13: <li>merge, resolve, diff, <strong>heads</strong></li> bgneal@13: <li>status, log</li> bgneal@13: <li><span class="strike">lock, unlock</span></li> bgneal@13: </ul> bgneal@13: <p>Additional "distributed commands":</p> bgneal@13: <ul class="simple"> bgneal@13: <li><strong>clone</strong>, <strong>push</strong>, <strong>pull</strong></li> bgneal@13: <li><strong>incoming</strong>, <strong>outgoing</strong></li> bgneal@13: </ul> bgneal@13: <p><strong>Not a whole lot to learn above SVN</strong></p></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 31/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>References</h1></header> bgneal@13: bgneal@13: bgneal@13: <section><ul class="simple"> bgneal@13: <li>Mercurial <a class="reference external" href="http://mercurial.selenic.com/">http://mercurial.selenic.com/</a></li> bgneal@13: <li>Mercurial Wiki <a class="reference external" href="http://mercurial.selenic.com/wiki/">http://mercurial.selenic.com/wiki/</a></li> bgneal@13: <li>Mercurial Book (free!) <a class="reference external" href="http://hgbook.red-bean.com/">http://hgbook.red-bean.com/</a></li> bgneal@13: <li>Hg Init: A Mercurial Tutorial <a class="reference external" href="http://hginit.com">http://hginit.com</a></li> bgneal@13: <li>Version Control By Example (free!) <a class="reference external" href="http://www.ericsink.com/vcbe/">http://www.ericsink.com/vcbe/</a></li> bgneal@13: </ul> bgneal@13: <p>This presentation is available at:</p> bgneal@13: <pre class="literal-block"> bgneal@13: $ hg clone https://bitbucket.org/bgneal/dvcs_intro_brownbag bgneal@13: </pre></section> bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 32/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <!-- slide source: slides.rst --> bgneal@13: <div class="slide-wrapper"> bgneal@13: <div class="slide"> bgneal@13: <div class="inner"> bgneal@13: bgneal@13: <header><h1>Questions?</h1></header> bgneal@13: bgneal@13: bgneal@13: </div> bgneal@13: <div class="presenter_notes"> bgneal@13: <header><h1>Presenter Notes</h1></header> bgneal@13: <section> bgneal@13: bgneal@13: </section> bgneal@13: </div> bgneal@13: <footer> bgneal@13: bgneal@13: <aside class="source"> bgneal@13: Source: <a href="slides.rst">slides.rst</a> bgneal@13: </aside> bgneal@13: bgneal@13: <aside class="page_number"> bgneal@13: 33/33 bgneal@13: </aside> bgneal@13: </footer> bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: </div> bgneal@13: </div> bgneal@13: bgneal@13: <div id="toc" class="sidebar hidden"> bgneal@13: <h2>Table of Contents</h2> bgneal@13: <table> bgneal@13: <caption>Table of Contents</caption> bgneal@13: bgneal@13: <tr id="toc-row-1"> bgneal@13: <th><a href="#slide1">Introduction to Distributed Version Control with Mercurial</a></th> bgneal@13: <td><a href="#slide1">1</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-2"> bgneal@13: <th><a href="#slide2">(Subliminal Message)</a></th> bgneal@13: <td><a href="#slide2">2</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-3"> bgneal@13: <th><a href="#slide3"># whoami</a></th> bgneal@13: <td><a href="#slide3">3</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-4"> bgneal@13: <th><a href="#slide4">Brief History of Version Control Tools</a></th> bgneal@13: <td><a href="#slide4">4</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-5"> bgneal@13: <th><a href="#slide5">Brief History of Version Control Tools</a></th> bgneal@13: <td><a href="#slide5">5</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-6"> bgneal@13: <th><a href="#slide6">Brief History of Version Control Tools</a></th> bgneal@13: <td><a href="#slide6">6</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-7"> bgneal@13: <th><a href="#slide7">What is a CVCS Again?</a></th> bgneal@13: <td><a href="#slide7">7</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-8"> bgneal@13: <th><a href="#slide8">So what's a DVCS look like?</a></th> bgneal@13: <td><a href="#slide8">8</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-9"> bgneal@13: <th><a href="#slide9">What does a DVCS buy you?</a></th> bgneal@13: <td><a href="#slide9">9</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-10"> bgneal@13: <th><a href="#slide10">Private Workspaces</a></th> bgneal@13: <td><a href="#slide10">10</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-11"> bgneal@13: <th><a href="#slide11">Offline Mode</a></th> bgneal@13: <td><a href="#slide11">11</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-12"> bgneal@13: <th><a href="#slide12">Speed</a></th> bgneal@13: <td><a href="#slide12">12</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-13"> bgneal@13: <th><a href="#slide13">Scalability</a></th> bgneal@13: <td><a href="#slide13">13</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-14"> bgneal@13: <th><a href="#slide14">Split Geography</a></th> bgneal@13: <td><a href="#slide14">14</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-15"> bgneal@13: <th><a href="#slide15">Flexible Workflows</a></th> bgneal@13: <td><a href="#slide15">15</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-16"> bgneal@13: <th><a href="#slide16">Distributed Backups</a></th> bgneal@13: <td><a href="#slide16">16</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-17"> bgneal@13: <th><a href="#slide17">Easier Merging</a></th> bgneal@13: <td><a href="#slide17">17</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-18"> bgneal@13: <th><a href="#slide18">Easier Merging (cont.)</a></th> bgneal@13: <td><a href="#slide18">18</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-19"> bgneal@13: <th><a href="#slide19">Commit Before Merge</a></th> bgneal@13: <td><a href="#slide19">19</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-20"> bgneal@13: <th><a href="#slide20">Okay, what's the catch?</a></th> bgneal@13: <td><a href="#slide20">20</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-21"> bgneal@13: <th><a href="#slide21">Introduction to Mercurial</a></th> bgneal@13: <td><a href="#slide21">21</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-22"> bgneal@13: <th><a href="#slide22">Mercurial Overview</a></th> bgneal@13: <td><a href="#slide22">22</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-23"> bgneal@13: <th><a href="#slide23">Repositories & Working Directories</a></th> bgneal@13: <td><a href="#slide23">23</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-24"> bgneal@13: <th><a href="#slide24">What's in a Repository?</a></th> bgneal@13: <td><a href="#slide24">24</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-25"> bgneal@13: <th><a href="#slide25">What's a Changeset?</a></th> bgneal@13: <td><a href="#slide25">25</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-26"> bgneal@13: <th><a href="#slide26">Branches & Tags</a></th> bgneal@13: <td><a href="#slide26">26</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-27"> bgneal@13: <th><a href="#slide27">Example Workflow</a></th> bgneal@13: <td><a href="#slide27">27</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-28"> bgneal@13: <th><a href="#slide28">Example Workflow (cont.)</a></th> bgneal@13: <td><a href="#slide28">28</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-29"> bgneal@13: <th><a href="#slide29">Example Workflow (cont.)</a></th> bgneal@13: <td><a href="#slide29">29</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-30"> bgneal@13: <th><a href="#slide30">SVN Commands for Review</a></th> bgneal@13: <td><a href="#slide30">30</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-31"> bgneal@13: <th><a href="#slide31">Basic Mercurial Commands</a></th> bgneal@13: <td><a href="#slide31">31</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-32"> bgneal@13: <th><a href="#slide32">References</a></th> bgneal@13: <td><a href="#slide32">32</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: <tr id="toc-row-33"> bgneal@13: <th><a href="#slide33">Questions?</a></th> bgneal@13: <td><a href="#slide33">33</a></td> bgneal@13: </tr> bgneal@13: bgneal@13: bgneal@13: </table> bgneal@13: </div> bgneal@13: bgneal@13: <div id="help" class="sidebar hidden"> bgneal@13: <h2>Help</h2> bgneal@13: <table> bgneal@13: <caption>Help</caption> bgneal@13: <tr> bgneal@13: <th>Table of Contents</th> bgneal@13: <td>t</td> bgneal@13: </tr> bgneal@13: <tr> bgneal@13: <th>Exposé</th> bgneal@13: <td>ESC</td> bgneal@13: </tr> bgneal@13: <tr> bgneal@13: <th>Full screen slides</th> bgneal@13: <td>e</td> bgneal@13: </tr> bgneal@13: <tr> bgneal@13: <th>Presenter View</th> bgneal@13: <td>p</td> bgneal@13: </tr> bgneal@13: <tr> bgneal@13: <th>Source Files</th> bgneal@13: <td>s</td> bgneal@13: </tr> bgneal@13: <tr> bgneal@13: <th>Slide Numbers</th> bgneal@13: <td>n</td> bgneal@13: </tr> bgneal@13: <tr> bgneal@13: <th>Toggle screen blanking</th> bgneal@13: <td>b</td> bgneal@13: </tr> bgneal@13: <tr> bgneal@13: <th>Show/hide slide context</th> bgneal@13: <td>c</td> bgneal@13: </tr> bgneal@13: <tr> bgneal@13: <th>Notes</th> bgneal@13: <td>2</td> bgneal@13: </tr> bgneal@13: <tr> bgneal@13: <th>Help</th> bgneal@13: <td>h</td> bgneal@13: </tr> bgneal@13: </table> bgneal@13: </div> bgneal@13: <script>main()</script> bgneal@13: </body> bgneal@13: </html>