%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Version Control Systems % % Author: FOSSEE % Copyright (c) 2009, FOSSEE, IIT Bombay %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \documentclass[12pt,compress]{beamer} \mode { \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} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % DOCUMENT STARTS \begin{document} \begin{frame} \begin{center} \vspace{12pt} \textcolor{blue}{\huge Version Control with hg} \end{center} \vspace{18pt} \begin{center} \vspace{10pt} \includegraphics[scale=0.95]{../images/fossee-logo.png}\\ \vspace{5pt} \scriptsize Developed by FOSSEE Team, IIT-Bombay. \\ \scriptsize Funded by National Mission on Education through ICT\\ \scriptsize MHRD,Govt. of India\\ \includegraphics[scale=0.30]{../images/iitb-logo.png}\\ \end{center} \end{frame} \begin{frame} \frametitle{Objectives} \label{sec-2} At the end of this session, you will be able to: \begin{itemize} \item Make changes to a repository and commit them \item \end{itemize} \end{frame} \begin{frame} \frametitle{Pre-requisite} \label{sec-3} Spoken tutorial on - \begin{itemize} \item \end{itemize} \end{frame} \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} \frametitle{Summary} \label{sec-18} In this tutorial, we have learnt to, \begin{itemize} \item \item \item \item \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{Evaluation} \label{sec-19} \begin{enumerate} \item \item \item \end{enumerate} \end{frame} \begin{frame} \frametitle{Solutions} \label{sec-20} \begin{enumerate} \item \vspace{15pt} \item \end{enumerate} \end{frame} \begin{frame} \begin{block}{} \begin{center} \textcolor{blue}{\Large THANK YOU!} \end{center} \end{block} \begin{block}{} \begin{center} For more Information, visit our website\\ \url{http://fossee.in/} \end{center} \end{block} \end{frame} \end{document}