Mercurial > public > dvcs_intro_brownbag
changeset 13:3547bba86af2
Removed *.html from .hgignore because we are using our own theme now (that includes a base.html file), and it is convenient to control the generated presentation since I won't necessarily have Python and landslide installed on every computer I want to give the presentation.
author | Brian Neal <bgneal@gmail.com> |
---|---|
date | Wed, 30 Nov 2011 18:46:32 -0600 |
parents | 727c48601d66 |
children | d0f34c9c8a76 |
files | .hgignore my_theme/base.html slides.html |
diffstat | 3 files changed, 1781 insertions(+), 1 deletions(-) [+] |
line wrap: on
line diff
--- a/.hgignore Wed Nov 30 18:44:44 2011 -0600 +++ b/.hgignore Wed Nov 30 18:46:32 2011 -0600 @@ -1,4 +1,3 @@ syntax: glob *.pyc *.swp -*.html
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/my_theme/base.html Wed Nov 30 18:46:32 2011 -0600 @@ -0,0 +1,182 @@ +<!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>{{ head_title }}</title> + <!-- Styles --> + {% if embed %} + <style type="text/css" media="print"> + {{ css.print.contents }} + </style> + <style type="text/css" media="screen, projection"> + {{ css.screen.contents }} + </style> + {% else %} + <link rel="stylesheet" media="print" href="{{ css.print.path_url }}"> + <link rel="stylesheet" media="screen, projection" href="{{ css.screen.path_url }}"> + {% endif %} + {% for css in user_css %} + {% if embed %} + <style type="text/css" media="screen, projection"> + {{ css.contents }} + </style> + {% else %} + <link rel="stylesheet" href="{{ css.path_url }}"> + {% endif %} + {% endfor %} + <!-- /Styles --> + <!-- Javascripts --> + {% if embed %} + <script> + {{ js.contents }} + </script> + {% else %} + <script type="text/javascript" src="{{ js.path_url }}"></script> + {% endif %} + {% for js in user_js %} + {% if embed %} + <script> + {{ js.contents }} + </script> + {% else %} + <script type="text/javascript" src="{{ js.path_url }}"></script> + {% endif %} + {% endfor %} + <!-- /Javascripts --> +</head> +<body> + <div id="blank"></div> + <div class="presentation"> + <div id="current_presenter_notes"> + <div id="presenter_note"></div> + </div> + <div class="slides"> + {% for slide in slides %} + <!-- slide source: {% if slide.source %}{{ slide.source.rel_path }}{% endif %} --> + <div class="slide-wrapper"> + <div class="slide{% if slide.classes %}{% for class in slide.classes %} {{ class }}{% endfor %}{% endif %}"> + <div class="inner"> + {% if slide.header %} + <header>{{ slide.header }}</header> + {% endif %} + {% if slide.content %} + <section>{{ slide.content }}</section> + {% endif %} + </div> + <div class="presenter_notes"> + <header><h1>Presenter Notes</h1></header> + <section> + {% if slide.presenter_notes %} + {{ slide.presenter_notes }} + {% endif %} + </section> + </div> + <footer> + {% if slide.source %} + <aside class="source"> + Source: <a href="{{ slide.source.rel_path }}">{{ slide.source.rel_path }}</a> + </aside> + {% endif %} + <aside class="page_number"> + {{ slide.number }}/{{ num_slides }} + </aside> + </footer> + </div> + </div> + {% endfor %} + </div> + </div> + {% if toc %} + <div id="toc" class="sidebar hidden"> + <h2>Table of Contents</h2> + <table> + <caption>Table of Contents</caption> + {% for section in toc %} + <tr id="toc-row-{{ section.number }}"> + <th><a href="#slide{{ section.number }}">{{ section.title }}</a></th> + <td><a href="#slide{{ section.number }}">{{ section.number }}</a></td> + </tr> + {% if section.sub %} + {% for subsection in section.sub %} + <tr id="toc-row-{{ subsection.number }}" class="sub"> + <th><a href="#slide{{ subsection.number }}">{{ subsection.title }}</a></th> + <td><a href="#slide{{ subsection.number }}">{{ subsection.number }}</a></td> + </tr> + {% endfor %} + {% endif %} + {% endfor %} + </table> + </div> + {% endif %} + <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>
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/slides.html Wed Nov 30 18:46:32 2011 -0600 @@ -0,0 +1,1599 @@ +<!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/33 + </aside> + </footer> + </div> + </div> + + <!-- slide source: slides.rst --> + <div class="slide-wrapper"> + <div class="slide"> + <div class="inner"> + + <header><h1>(Subliminal Message)</h1></header> + + + <section><img alt="images/stop.jpg" src="images/stop.jpg" /></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/33 + </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 <<a class="reference external" href="mailto:bgneal1@rockwellcollins.com">bgneal1@rockwellcollins.com</a>></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/33 + </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"> + 4/33 + </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"> + 5/33 + </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"> + 6/33 + </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"> + 7/33 + </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"> + 8/33 + </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"> + 9/33 + </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 "micro-commits"</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"> + 10/33 + </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"> + 11/33 + </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 entire 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"> + 12/33 + </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 & 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"> + 13/33 + </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 & 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 & associated problems</li> +<li>With a DVCS, each site can have a central repository<ul> +<li>The two central repos can be synched 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"> + 14/33 + </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"> + 15/33 + </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"> + 16/33 + </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> +</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</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"> + 17/33 + </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 directed acyclic graphs 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>"Commit before merge"</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"> + 18/33 + </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 peform 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"> + 19/33 + </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>Hetrogenous 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>Arguably, this applies to a CVCS as well</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"> + 20/33 + </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 & working directories</li> +<li>Changesets</li> +<li>Branches & 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"> + 21/33 + </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 & easy to get started with</li> +<li>Can be served via Apache Web server</li> +<li>Repository hooks</li> +<li>Integrates with Trac</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"> + 22/33 + </aside> + </footer> + </div> + </div> + + <!-- slide source: slides.rst --> + <div class="slide-wrapper"> + <div class="slide"> + <div class="inner"> + + <header><h1>Repositories & 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 "the store")<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 & 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"> + 23/33 + </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"> + 24/33 + </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 ("default" 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 & 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"> + 25/33 + </aside> + </footer> + </div> + </div> + + <!-- slide source: slides.rst --> + <div class="slide-wrapper"> + <div class="slide"> + <div class="inner"> + + <header><h1>Branches & 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>"default"</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"> + 26/33 + </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"> + 27/33 + </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"> + 28/33 + </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 => 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"> + 29/33 + </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"> + 30/33 + </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 "distributed commands":</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"> + 31/33 + </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"> + 32/33 + </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"> + 33/33 + </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">(Subliminal Message)</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">Brief History of Version Control Tools</a></th> + <td><a href="#slide4">4</a></td> + </tr> + + + <tr id="toc-row-5"> + <th><a href="#slide5">Brief History of Version Control Tools</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">What is a CVCS Again?</a></th> + <td><a href="#slide7">7</a></td> + </tr> + + + <tr id="toc-row-8"> + <th><a href="#slide8">So what's a DVCS look like?</a></th> + <td><a href="#slide8">8</a></td> + </tr> + + + <tr id="toc-row-9"> + <th><a href="#slide9">What does a DVCS buy you?</a></th> + <td><a href="#slide9">9</a></td> + </tr> + + + <tr id="toc-row-10"> + <th><a href="#slide10">Private Workspaces</a></th> + <td><a href="#slide10">10</a></td> + </tr> + + + <tr id="toc-row-11"> + <th><a href="#slide11">Offline Mode</a></th> + <td><a href="#slide11">11</a></td> + </tr> + + + <tr id="toc-row-12"> + <th><a href="#slide12">Speed</a></th> + <td><a href="#slide12">12</a></td> + </tr> + + + <tr id="toc-row-13"> + <th><a href="#slide13">Scalability</a></th> + <td><a href="#slide13">13</a></td> + </tr> + + + <tr id="toc-row-14"> + <th><a href="#slide14">Split Geography</a></th> + <td><a href="#slide14">14</a></td> + </tr> + + + <tr id="toc-row-15"> + <th><a href="#slide15">Flexible Workflows</a></th> + <td><a href="#slide15">15</a></td> + </tr> + + + <tr id="toc-row-16"> + <th><a href="#slide16">Distributed Backups</a></th> + <td><a href="#slide16">16</a></td> + </tr> + + + <tr id="toc-row-17"> + <th><a href="#slide17">Easier Merging</a></th> + <td><a href="#slide17">17</a></td> + </tr> + + + <tr id="toc-row-18"> + <th><a href="#slide18">Easier Merging (cont.)</a></th> + <td><a href="#slide18">18</a></td> + </tr> + + + <tr id="toc-row-19"> + <th><a href="#slide19">Commit Before Merge</a></th> + <td><a href="#slide19">19</a></td> + </tr> + + + <tr id="toc-row-20"> + <th><a href="#slide20">Okay, what's the catch?</a></th> + <td><a href="#slide20">20</a></td> + </tr> + + + <tr id="toc-row-21"> + <th><a href="#slide21">Introduction to Mercurial</a></th> + <td><a href="#slide21">21</a></td> + </tr> + + + <tr id="toc-row-22"> + <th><a href="#slide22">Mercurial Overview</a></th> + <td><a href="#slide22">22</a></td> + </tr> + + + <tr id="toc-row-23"> + <th><a href="#slide23">Repositories & Working Directories</a></th> + <td><a href="#slide23">23</a></td> + </tr> + + + <tr id="toc-row-24"> + <th><a href="#slide24">What's in a Repository?</a></th> + <td><a href="#slide24">24</a></td> + </tr> + + + <tr id="toc-row-25"> + <th><a href="#slide25">What's a Changeset?</a></th> + <td><a href="#slide25">25</a></td> + </tr> + + + <tr id="toc-row-26"> + <th><a href="#slide26">Branches & Tags</a></th> + <td><a href="#slide26">26</a></td> + </tr> + + + <tr id="toc-row-27"> + <th><a href="#slide27">Example Workflow</a></th> + <td><a href="#slide27">27</a></td> + </tr> + + + <tr id="toc-row-28"> + <th><a href="#slide28">Example Workflow (cont.)</a></th> + <td><a href="#slide28">28</a></td> + </tr> + + + <tr id="toc-row-29"> + <th><a href="#slide29">Example Workflow (cont.)</a></th> + <td><a href="#slide29">29</a></td> + </tr> + + + <tr id="toc-row-30"> + <th><a href="#slide30">SVN Commands for Review</a></th> + <td><a href="#slide30">30</a></td> + </tr> + + + <tr id="toc-row-31"> + <th><a href="#slide31">Basic Mercurial Commands</a></th> + <td><a href="#slide31">31</a></td> + </tr> + + + <tr id="toc-row-32"> + <th><a href="#slide32">References</a></th> + <td><a href="#slide32">32</a></td> + </tr> + + + <tr id="toc-row-33"> + <th><a href="#slide33">Questions?</a></th> + <td><a href="#slide33">33</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> \ No newline at end of file