view slides.html @ 16:048e5aea6d36 tip

Updates for June 2012 presentation.
author Brian Neal <bgneal@gmail.com>
date Mon, 25 Jun 2012 19:51:34 -0500
parents 3547bba86af2
children
line wrap: on
line source
<!DOCTYPE html>
<!--
  Copyright 2010 Google Inc.

  Licensed under the Apache License, Version 2.0 (the "License");
  you may not use this file except in compliance with the License.
  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

  Unless required by applicable law or agreed to in writing, software
  distributed under the License is distributed on an "AS IS" BASIS,
  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  See the License for the specific language governing permissions and
  limitations under the License.

  Original slides: Marcin Wichary (mwichary@google.com)
  Modifications: Ernest Delgado (ernestd@google.com)
                 Alex Russell (slightlyoff@chromium.org)

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