Mercurial > hg > mercurial-talk
changeset 122:c8f447c2b95d
Trimmed slides.
author | Martin Geisler <mg@aragost.com> |
---|---|
date | Tue, 23 Mar 2010 13:55:47 +0100 |
parents | 7e3e7de00f9d |
children | 5a7ad73b6a02 |
files | mercurial.tex |
diffstat | 1 files changed, 0 insertions(+), 329 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial.tex +++ b/mercurial.tex @@ -128,52 +128,6 @@ \end{itemize} \end{frame} -\subsection{Basic Concepts} - -\begin{frame}{The Repository} - The database that holds your history: - \begin{itemize} - \item series of project-wide snapshots - \item called changesets or revisions in Mercurial - \item changesets encapsulate a delta between two snapshots - \item each changeset has a parent changeset - \end{itemize} - - \begin{center} - \begin{tikzpicture} - \node[repository, label=above:Repository] (repository) {}; - \node[rev] (r1) at (-7mm, 0) {}; - \node[rev] (r2) at (0, 0) {}; - \node[rev] (r3) at (7mm, 0) {}; - \draw[->] (r1) -- (r2); - \draw[->] (r2) -- (r3); - \end{tikzpicture} - \end{center} -\end{frame} - -\begin{frame}{The Working Directory} - Holds your files: - \begin{center} - \begin{tikzpicture}[node distance=40mm] - \node[working copy, label=above:Alice] (a) { - hello.c\\ - Makefile - }; - \node[working copy, label=above:Bob, text width=20mm, - right=of a.north, anchor=north] { - hello.c\\ - goodbye.c\\ - Makefile - }; - \end{tikzpicture} - \end{center} - \begin{itemize} - \item you edit files in the working directory - \item reflects a changeset (the parent changeset) - \item also called a working copy - \end{itemize} -\end{frame} - \begin{frame}{Branches} A key concept: \begin{itemize} @@ -312,80 +266,6 @@ \end{center} \end{frame} - -\subsection{Historic Context} - -\begin{frame}{Revision Control System (RCS)} - Version control from the 1980s: - \begin{itemize} - \item store changes (date, commit message) - \item browse history - \end{itemize} - - \bigskip - - \begin{tikzpicture}[node distance=5mm] - \begin{scope}[start chain=hello] - \node<2->[on chain,rev,,label=left:hello.c:] {}; - \node<3->[on chain,rev,join] {}; - \node<4->[on chain,rev,join] {}; - \node<6->[on chain,rev,join] {}; - \end{scope} - \begin{scope}[start chain] - \node<2->[on chain,rev,label=left:Makefile:,below=of hello-begin] {}; - \node<5->[on chain,rev,join] {}; - \node<7->[on chain,rev,join] {}; - \end{scope} - \end{tikzpicture} -\end{frame} - -\begin{frame}{Concurrent Versions System (CVS)} - Version control in the 1990s: - \begin{itemize} - \item collaboration over the network - \item several working copies - \item one central repository - \end{itemize} - - \pause - - \begin{center} - \begin{tikzpicture} - \begin{scope}[start chain, node distance=18mm] - \node[working copy, on chain, label=above:Alice] (Alice) - {hello.c\\ Makefile}; - \node[repository, on chain, label=above:CVS Server] (repository) {}; - \node[working copy, on chain, label=above:Bob] (Bob) - {hello.c\\ Makefile}; - \end{scope} - - \begin{scope}[scale=0.5,transform shape, node distance=5mm, - shift=(repository.center), yshift=4mm, xshift=3mm] - \begin{scope}[start chain=hello] - \node[on chain,rev,,label=left:hello.c:] {}; - \node[on chain,rev,join] {}; - \end{scope} - \begin{scope}[start chain] - \node[on chain,rev,label=left:Makefile:,below=of hello-begin] {}; - \node<3->[on chain,rev,join] {}; - \end{scope} - \end{scope} - - \draw<3>[->, short] (Alice) -- node[above] {commit} (repository); - \draw<4>[->, short] (repository) -- node[above] {update} (Bob); - \end{tikzpicture} - \end{center} -\end{frame} - -\begin{frame}{So, everything is good?} - CVS has many limitations: - \begin{itemize} - \item no atomic commits - \item no rename information - \item branches? I hope you have a CVS guru at hand\dots - \end{itemize} -\end{frame} - \begin{frame}{Subversion (SVN)} Version control from this millennia --- \emph{``CVS done right''}: \begin{itemize} @@ -396,56 +276,6 @@ \end{itemize} \end{frame} -\subsection{Subversion in Detail} - -\begin{frame}{Merging in Subversion} - SVN is a centralized system: - \begin{center} - \begin{tikzpicture}[node distance=1cm] - \node[repository, label=above:Repository] (repository) {}; - \node[rev] (r1) at (-7mm, 0) {}; - \node[rev] (r2) at (0, 0) {}; - \node[rev] (r3) at (7mm, 0) {}; - \draw[->] (r1) -- (r2); - \draw[->] (r2) -- (r3); - - \node[working copy, label=below:Alice, left=of repository] (a) { - hello.c\\ - Makefile - }; - \node[working copy, label=below:Bob, below left=of repository] (b) { - hello.c\\ - Makefile - }; - \node[working copy, label=below:Carla, below=of repository] (c) { - hello.c\\ - Makefile - }; - - \node[working copy, label=below:Dan, below right=of repository] (d) { - hello.c\\ - Makefile - }; - - \node[working copy, label=below:Eve, right=of repository] (e) { - hello.c\\ - Makefile - }; - - \draw[<->, short] (a) -- (repository); - \draw[<->, short] (b) -- (repository); - \draw[<->, short] (c) -- (repository); - \draw[<->, short] (d) -- (repository); - \draw[<->, short] (e) -- (repository); - \end{tikzpicture} - \end{center} - - \begin{itemize} - \item merging takes place in client - \item merging takes place on server(!) - \end{itemize} -\end{frame} - \begin{frame}{SVN Merge in Client} When you do \cmd{svn update}, you merge: \begin{itemize} @@ -463,35 +293,6 @@ \end{itemize} \end{frame} -\begin{frame}{Mixed Revisions?!} - SVN lets you work with an \alert{inconsistent} working copy: - \begin{itemize} - \item Alice and Bob have revision 1 - \item Alice changes \path{hello.c} $\to$ revision 2 - \item Bob changes \path{Makefile} $\to$ \alert{revision 3} - \item \alert{server merged} Bob's change into revision 2 - \end{itemize} - - \pause - - They both have mixed revisions in their working copies: - \begin{center} - \begin{tikzpicture} - \tikzstyle{working copy}+=[text width=25mm] - \node[working copy, label=below:Alice] (a) { - hello.c (r2)\\ - Makefile (r1) - }; - \node[working copy, label=below:Bob, right=of a] (b) { - hello.c (r1)\\ - Makefile (r3) - }; - \end{tikzpicture} - \end{center} - - Difficult for Carla to reproduce either working copy. -\end{frame} - \begin{frame}{Server-Side Merges} Mixed revisions are a result of allowing server-side merges \begin{itemize} @@ -575,61 +376,6 @@ \end{frame} -%% \begin{frame}{Thinking Distributed} -%% Natural solution to SVN branch situation: -%% \begin{itemize} -%% \item make merges explicit, which requires -%% \item branches as first-class objects -%% \end{itemize} -%% -%% \pause -%% -%% \begin{center} -%% \begin{tikzpicture} -%% \begin{pgfonlayer}{foreground} -%% \begin{scope}[thick, node distance=4mm] -%% \node[rev] (r1) {}; -%% \node[rev, right=of r1] (r2) {}; -%% \node[rev, right=of r2] (r3) {}; -%% \draw[->] (r1) -- (r2); -%% \draw[->] (r2) -- (r3); -%% -%% \node[rev, below=of r1] (r4) {}; -%% \node[rev, right=of r4] (r5) {}; -%% \node[rev, right=of r5] (r6) {}; -%% \draw[->] (r4) -- (r5); -%% \draw[->] (r5) -- (r6); -%% \end{scope} -%% \end{pgfonlayer} -%% -%% \node[draw, fill=blue!60, fit=(r1) (r2) (r3)] (trunk) {}; -%% \node[draw, fill=blue!30, fit=(r4) (r5) (r6)] (bob) {}; -%% -%% \begin{pgfonlayer}{background} -%% \node[thick, repository, inner sep=10pt, -%% label=above:Repository, fit=(trunk) (bob)] {}; -%% \end{pgfonlayer} -%% -%% \node[working copy, label=below:Alice, left=of trunk] (a) { -%% hello.c\\ -%% Makefile -%% }; -%% \node[working copy, label=below:Bob, below=of bob] (b) { -%% hello.c\\ -%% Makefile -%% }; -%% \node[working copy, label=below:Carla, right=of trunk] (c) { -%% hello.c\\ -%% Makefile -%% }; -%% -%% \draw[<->] (a) -- (trunk); -%% \draw[<->] (b) -- (bob); -%% \draw[<->] (c) -- (trunk); -%% \end{tikzpicture} -%% \end{center} -%% \end{frame} - \section{Using Mercurial} @@ -784,62 +530,6 @@ \end{center} \end{frame} -\begin{frame}{Pull Workflow} - \tikzstyle{rev}+=[on chain, minimum size=5mm, font=\small] - \tikzstyle{a}=[rev, draw=yellow!50!black!50, bottom color=yellow!50!black!20] - \tikzstyle{b}=[rev, draw=green!30!black!50, bottom color=green!30!black!20] - \tikzstyle{c}=[rev, draw=blue!50!black!50, bottom color=blue!50!black!20] - \tikzstyle{join-above}=[out=0, in=240] - \tikzstyle{join-below}=[out=-90, in=180] - \tikzset{node distance=8mm and 10mm, on grid} - - People have read-only access (e.g., \cmd{hg serve}): - \medskip - - \begin{tikzpicture} - \begin{scope}[start chain=alice] - \node[rev,on chain,label=above:Alice] {0}; - \begin{scope}[start branch=bob] - \node<5->[b,on chain=going below right, join=by join-below] {1}; - \end{scope} - \node<2->[a,join] {1}; - \node<3->[a,join] {2}; - \node<6->[a,join,join=with alice/bob-end by join-above] {3}; - \end{scope} - - \begin{scope}[start chain=bob, shift={(6, 0)}] - \node[rev,label=above:Bob] {0}; - \node<4->[b,join] {1}; - \end{scope} - - \begin{scope}[start chain=carla, shift={(2, -3)}] - \node[rev,label=above:Carla] {0}; - \begin{scope}[start branch=bob] - \node<9->[b,on chain=going below right, join=by join-below] {1}; - \end{scope} - \begin{scope}[start branch=alice] - \node<11->[a,join=by join-below,below=of carla/bob-2] {1}; - \node<11->[a,join] {2}; - \node<11->[a,join,join=with carla/bob-end by {out=0, in=120}] {3}; - \end{scope} - - \node<7->[c,join] {1}; - \node<8->[c,join] {2}; - \node<10->[c,join] {3}; - \node<12->[c,join, join=with carla/alice-end by {out=0, in=-90}] {4}; - - \node<1-5>[fit=(alice-begin) (alice-end)] (A) {}; - \node<6->[fit=(alice-begin) (alice-end) (alice/bob-end)] (A) {}; - \node[fit=(bob-begin) (bob-end)] (B) {}; - \node[fit=(carla-begin) (carla-end)] (C) {}; - - \tikzstyle{every path}=[->, short] - \draw<5> (B) -- node[below] {\cmd{pull}} (A); - \draw<9> (B) -- node[below right] {\cmd{pull}} (C); - \draw<11> (A) -- node[above right] {\cmd{pull}} (C); - \end{scope} - \end{tikzpicture} -\end{frame} \subsection{Using History} @@ -1164,25 +854,6 @@ \section{Wrapping Up} -\subsection{Unsolved Problems} - -\begin{frame}{Unsolved Problems} - DVCSs generally have problems with - \begin{itemize} - \item large binary files - \item retrieving only a sub-tree (narrow clones) - \item retrieving only recent history (shallow clones) - \end{itemize} - - Some more Mercurial specific problems are: - \begin{itemize} - \item it is fairly easy to create conflicts in \path{.hgtags} files - \item filename encodings across different filesystems - \end{itemize} -\end{frame} - -\subsection{Conclusion} - \begin{frame}{Mercurial in a Nutshell} Mercurial changes the way you develop: \begin{itemize}