diff options
Diffstat (limited to 'lecture-notes/vcs/vcs.tex')
-rw-r--r-- | lecture-notes/vcs/vcs.tex | 516 |
1 files changed, 516 insertions, 0 deletions
diff --git a/lecture-notes/vcs/vcs.tex b/lecture-notes/vcs/vcs.tex new file mode 100644 index 0000000..3b5e6ab --- /dev/null +++ b/lecture-notes/vcs/vcs.tex @@ -0,0 +1,516 @@ +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Version Control Systems +% +% Author: FOSSEE +% Copyright (c) 2009, FOSSEE, IIT Bombay +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% + +\documentclass[14pt,compress]{beamer} + +\mode<presentation> +{ + \usetheme{Warsaw} + \useoutertheme{infolines} + \setbeamercovered{transparent} +} + +\usepackage[english]{babel} +\usepackage[latin1]{inputenc} +%\usepackage{times} +\usepackage[T1]{fontenc} + +% Taken from Fernando's slides. +\usepackage{ae,aecompl} +\usepackage{mathpazo,courier,euler} +\usepackage[scaled=.95]{helvet} + +\definecolor{darkgreen}{rgb}{0,0.5,0} + +\usepackage{listings} +\lstset{language=bash, + basicstyle=\ttfamily\bfseries, + commentstyle=\color{red}\itshape, + stringstyle=\color{darkgreen}, + showstringspaces=false, + keywordstyle=\color{blue}\bfseries} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% Macros +\setbeamercolor{emphbar}{bg=blue!20, fg=black} +\newcommand{\emphbar}[1] +{\begin{beamercolorbox}[rounded=true]{emphbar} + {#1} + \end{beamercolorbox} +} +\newcounter{time} +\setcounter{time}{0} +\newcommand{\inctime}[1]{\addtocounter{time}{#1}{\tiny \thetime\ m}} + +\newcommand{\typ}[1]{\lstinline{#1}} + +\newcommand{\kwrd}[1]{ \texttt{\textbf{\color{blue}{#1}}} } + +% Title page +\title[Mercurial]{Version Control with \typ{hg}} + +\author[FOSSEE] {FOSSEE} + +\institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay} +\date[]{} + +\AtBeginSection[] +{ + \begin{frame}<beamer> + \frametitle{Outline} + \tableofcontents[currentsection,currentsubsection] + \end{frame} +} + +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% DOCUMENT STARTS +\begin{document} + +\begin{frame} + \maketitle +\end{frame} + +% CREATING TOC +\begin{frame} + \frametitle{Outline} + \tableofcontents + % You might wish to add the option [pausesections] +\end{frame} + +\begin{frame} + \frametitle{Objectives} + At the end of this session, you will be able to: + \begin{itemize} + \item Understand what is Version Control and the need for it + \item Create and use repository on a daily basis + \item Clone existing repositories, from the web + \item View the history of a repository + \item Make changes to a repository and commit them + \item Work collaboratively with a team + \end{itemize} +\end{frame} + +%% There are some %$ used just to minimise the effect of $ sign used +%% in lstlisting. In emacs it looks dirty. + +% Introduction to course-need of version control, history, options available. +\section{Introduction} + +\begin{frame} + \frametitle{What is Version Control?} + \begin{block}{} + A way to track changes made to files over time, by keeping copies + of files as we change them. + \end{block} +\end{frame} + +%% Home made version control system? +\begin{frame}[fragile] + \frametitle{Home-brewed} + \begin{center} + An example of a \typ{home-brew} Version Control system + \includegraphics[height=1.8in,width=4.2in]{images/folder.png} + \end{center} + \begin{lstlisting} +$ ls +a.out id1.txt id2.txt identifier.cpp id.txt lex pda1.cpp pda2.cpp pda.cpp pda.txt string.txt + \end{lstlisting} %%$ + %%a screen-shot of folder with all crazy names. +\end{frame} + +\begin{frame}[fragile] + \frametitle{Problems} + \begin{block}{} + \begin{itemize} + \item Name and changes made are not related or linked. + \item Can't track sequence of changes made to a file. + \item Does not scale. + \end{itemize} + \end{block} +\end{frame} + +\begin{frame}[fragile] + \frametitle{The need for Version Control} + \begin{itemize} + \item \alert{To err is Human} \ldots + \item Tracking the history and evolution of a project + \item To collaborate effectively on a project + \item To efficiently track down bugs and pin-point the changes that + caused it + \end{itemize} +\end{frame} + +%% Introduction to how logs are managed in VCS. +%% A analogy in logs and day-to-day life? +\begin{frame}[fragile] + \frametitle{How does it work? --- Analogy} + It is, in some ways, similar to playing an Video game. + \begin{itemize} + \item We play games in stages + \item Once we finish a stage or a task -- \alert{we SAVE} + \item We continue playing + \item But, if necessary, we could choose from one of the saved + states and start from there + \item We could alter the course of the game + \end{itemize} +\end{frame} + + +\begin{frame} + \frametitle{Mercurial or \typ{hg}} + \begin{center} + \includegraphics[height=.75in,interpolate=true]{images/mercurial_logo} + \end{center} + \begin{itemize} + \item Easy to learn and use + \item Lightweight + \item Scales excellently + \item Written in Python + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Installation} + \begin{itemize} + \item \typ{sudo apt-get install mercurial} + \item TortoiseHg + \item \typ{\$ hg} + \item \typ{\$ hg version} + \end{itemize} +\end{frame} + +\section{Let there be a Repo!} +% init, status, commit, log, [ui] +\begin{frame} + \frametitle{We need a repo!} + \begin{itemize} + \item A Repository (repo) is where all the action is! + \item Project files along with a special directory that stores all the + changes + \item We take snapshots of the whole repository; not individual + files. + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Initializing a repo} + \begin{itemize} + \item \typ{\$ hg init} + \item Creates a fresh repository + \item Adds a \typ{.hg} directory to our \emph{working directory} + \end{itemize} + \emphbar{\typ{.hg} directory keeps log of changes made henceforth} +\end{frame} + +\begin{frame} + \frametitle{Status report} + \begin{itemize} + \item \typ{hg status} gives the status of our repo + \item Use it often; at least as a beginner + \item \typ{hg help command} gives us help about \typ{command} + \end{itemize} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Status codes} + \begin{lstlisting} + M = modified + A = added + R = removed + C = clean + ! = missing + ? = not tracked + I = ignored + \end{lstlisting} +\end{frame} + +\begin{frame} + \frametitle{Adding files} + \begin{itemize} + \item From \typ{hg status} we know, none of the files are being + tracked, yet. + \item \typ{hg add} --- asking \typ{hg} to track these files + \item As expected \typ{hg status} prepends an \typ{A} to the file + names. + \item \typ{? --> A} + \item \typ{! --> R} (\typ{hg remove}) + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Taking Snapshots} + \begin{itemize} + \item \typ{hg commit} + \item Asking Mercurial to take a snapshot; remember the changes made + to the repository. + \item \typ{-u FirstName LastName <email>} + \item \typ{-m ``Commit message''} -- a description of changes committed. + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Thumbnail views} + \begin{itemize} + \item \typ{hg log}~ gives the log of the changes made + \item A \typ{changeset} is an atomic collection of changes to the + files (between successive commits) + \end{itemize} + \begin{block}{Log information} + \begin{itemize} + \item \alert{changeset}: Identifier for the changeset + \item \alert{user}: Details of user who created the changeset + \item \alert{date}: Date and time of creation + \item \alert{summary}: One line description + \end{itemize} + \end{block} +\end{frame} + +\begin{frame} + \frametitle{User information} + \begin{itemize} + \item User information is set in the \typ{hgrc} file + \item It can be set globally or local to the project + \item Global \typ{hgrc} + \begin{itemize} + \item \typ{\$HOME/.hgrc} -- Unix like systems + \item \typ{\%HOME\%\\.hgrc} -- Windows + \end{itemize} + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{\alert{Advice}: \typ{commits}, messages} + \begin{itemize} + \item Atomic changes; one change with one \typ{commit} + \item Single line summary --- 60 to 65 characters long + \item Followed by paragraphs of detailed description + \begin{itemize} + \item Why the change? + \item What does it effect? + \item Known bugs/issues? + \item etc. + \end{itemize} + \end{itemize} +\end{frame} + +\section{But Why \typ{commit}~?} + +\begin{frame} + \frametitle{Operational overhead?} + \begin{itemize} + \item But why do we \typ{commit}? + \item Isn't all this just adding to operational costs? + \item Isn't all this a waste of time? + \end{itemize} + \begin{center} + \emphbar{No! You shall see the benefits, soon!} + \end{center} +\end{frame} + +\begin{frame} + \frametitle{Revert Changes} + \begin{itemize} + \item Undo all changes; the editor can only do so much. + \item \typ{hg revert --all} + \item \typ{hg revert filename} + \item Present file, with changes --- \typ{filename.orig} + \end{itemize} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Viewing Changes} + \begin{itemize} + \item \typ{hg diff} --- all changes since last commit + \end{itemize} + \begin{block}{} + \begin{lstlisting} + - this line was deleted + + this line was added + \end{lstlisting} + \end{block} +\end{frame} + + +\begin{frame}[fragile] + \frametitle{Revision numbering} + \begin{itemize} + \item \typ{changeset: n:cbf6e2a375b4} + \item \typ{n} is the revision number + \item The revision number is local to a repository + \item \typ{cbf6e2a375b4} is the unique identifier + \end{itemize} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Using revision numbers} + \begin{itemize} + \item \typ{-r n} can be passed as arguments to commands to specify + the revision number + \item For instance, \typ{hg diff -r1 -r2} + \item \typ{m:n} specifies a range of revision numbers + \item For instance, \typ{hg log -r0:2} + \end{itemize} +\end{frame} + +\section{Collaborating with Mercurial} +\begin{frame}[fragile] + \frametitle{Cloning Repositories} + \begin{itemize} + \item \typ{hg clone SOURCE [DEST]} + \item All \typ{hg} repositories are self-contained + \end{itemize} +\end{frame} + +\begin{frame}[fragile] + \frametitle{Sharing Repositories} + \begin{itemize} + \item \typ{hg serve} + \item Can be cloned with \typ{hg clone http://my-ip-address:8000} + \item We share a central repository; work on our local copies. + \item Set write permissions in \typ{.hg/hgrc} + \end{itemize} + \begin{lstlisting} + [web] + push_ssl=False + allow_push=* + \end{lstlisting} +\end{frame} + +\begin{frame} + \frametitle{Sharing Changes} + \begin{itemize} + \item Use \typ{hg push} to push your \typ{commits} + (\typ{changesets}) to the central repository + \end{itemize} +\end{frame} + + +\begin{frame} + \frametitle{Pulling Changes} + \begin{itemize} + \item \typ{hg incoming} shows new \typ{changesets} in the server + \item To get these \typ{changesets}, we use \typ{hg pull} + \item These changes do not affect our working directory + \item \typ{hg parent} shows the parents of the working directory + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Pulling Changes \ldots} + \begin{itemize} + \item \typ{hg update} will update the working directory + \begin{itemize} + \item Updates to the \typ{tip} if no revision is specified + \item \typ{tip} is the most recently added changeset + \item Can specify revision number to update to + \end{itemize} + \item \typ{hg tip} shows the \typ{tip} of the repository + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Simultaneous Changes} + \begin{itemize} + \item The logs of both repositories will be different + \item The repositories have diverged + \item \typ{hg push} fails, in such a scenario + \item \alert{Never, Never, Never, Ever} use \typ{hg push -f} + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Merging} + \begin{itemize} + \item Pull and merge, when \typ{abort: push creates new remote + heads!} + \item \typ{hg merge} will merge the two diverged heads + \item \typ{commit} after you have \typ{merged}! + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Simultaneous Changes \ldots} + \begin{itemize} + \item \typ{outgoing} shows the \typ{changesets} that will be pushed + \item \typ{hg push} works! + \item Look at the `Change graph'! + \end{itemize} +\end{frame} + +\begin{frame} + \frametitle{Simultaneous Conflicting Changes} + \begin{itemize} + \item What if the changes conflict? -- overlapping edits + \item \typ{hg push} fails; \typ{hg pull}; \typ{hg merge} + \item You now get a diff view with 3 panes + \begin{itemize} + \item First --- current file + \item Second --- \typ{changesets} that you pulled + \item Third --- file before you made your changes + \end{itemize} + \item Resolve conflict and save + \item \typ{hg commit}; \typ{hg push} + \item Look at the `Change graph'! + \end{itemize} +\end{frame} + +\section{Conclusion} + +\begin{frame} + \frametitle{\alert{Advice}: Work-flow} + General work-flow + \begin{itemize} + \item \typ{pull}; \typ{update} + \item Make changes + \item \typ{commit} + \item If changes on repo, \typ{pull} and \typ{merge} + \item \typ{push} + \end{itemize} + \emphbar{Commit Early, Commit Often} +\end{frame} + +\begin{frame}[fragile,allowframebreaks] + \frametitle{Summary} + In this session, we have learnt to: + \begin{itemize} + \item initialize new repositories, using \typ{hg init} + \item check the status using \typ{hg status} + \item get help for any command using \typ{hg help} + \item commit changes or take snapshots using \typ{hg commit} + \item view the history of a repository using \typ{hg log} + \item set the user info in the global \typ{hgrc} file + \item undo changes using \typ{hg revert} + \item view changes using \typ{hg diff} + \item use revision numbers as arguments to various commands + \item clone repositories using \typ{hg clone} + \item server repositories using \typ{hg serve} + \item push changes using \typ{hg push} + \item pull changes using \typ{hg pull} + \item update working directory to latest revision using \typ{hg + update} + \item merge two heads using \typ{hg merge} + \item resolve merge conflicts using \typ{hg resolve} + \end{itemize} +\end{frame} + + +\begin{frame} + \frametitle{References} + \begin{itemize} + \item \href{http://betterexplained.com/articles/a-visual-guide-to-version-control/}{A Visual Guide to Version Control} + \item \href{http://karlagius.com/2009/01/09/version-control-for-the-masses/}{Version Control for the Masses} + \item \href{http://betterexplained.com/articles/intro-to-distributed-version-control-illustrated/}{(Illustrated) Intro to Distributed Version Control} + \item \href{http://mercurial.selenic.com/wiki/UnderstandingMercurial}{Understanding Mercurial} + \item \href{http://mercurial.selenic.com/wiki/Tutorial}{A Tutorial on Using Mercurial} + \item \href{http://hginit.com/}{Hg Init: a Mercurial tutorial} + \item \href{http://mercurial.selenic.com/wiki/BeginnersGuides}{Beginners Guides} + \item \href{http://software-carpentry.org/4_0/vc/}{Software Carpentry} + \end{itemize} +\end{frame} + +\end{document} + |