%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Version Control Systems % % Author: FOSSEE % Copyright (c) 2009, FOSSEE, IIT Bombay %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \documentclass[14pt,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=Python, 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}}} } %%% This is from Fernando's setup. % \usepackage{color} % \definecolor{orange}{cmyk}{0,0.4,0.8,0.2} % % Use and configure listings package for nicely formatted code % \usepackage{listings} % \lstset{ % language=Python, % basicstyle=\small\ttfamily, % commentstyle=\ttfamily\color{blue}, % stringstyle=\ttfamily\color{orange}, % showstringspaces=false, % breaklines=true, % postbreak = \space\dots % } %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % Title page \title[Version Control Systems]{SEES: Version Control Systems} \author[FOSSEE] {FOSSEE} \institute[IIT Bombay] {Department of Aerospace Engineering\\IIT Bombay} \date[]{} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %\pgfdeclareimage[height=0.75cm]{iitmlogo}{iitmlogo} %\logo{\pgfuseimage{iitmlogo}} %% Delete this, if you do not want the table of contents to pop up at %% the beginning of each subsection: \AtBeginSubsection[] { \begin{frame} \frametitle{Outline} \tableofcontents[currentsection,currentsubsection] \end{frame} } \AtBeginSection[] { \begin{frame} \frametitle{Outline} \tableofcontents[currentsection,currentsubsection] \end{frame} } % If you wish to uncover everything in a step-wise fashion, uncomment % the following command: %\beamerdefaultoverlayspecification{<+->} %%\includeonlyframes{current,current1,current2,current3,current4,current5,current6} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % 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} % Introduction to course-need of version control, history, options available. \section{Introduction} \begin{frame} \frametitle{What is Version Control?} \begin{block}{From a blog post} ``Version control (or source control) is nothing more arcane than keeping copies of ones work as one make changes to it.'' \end{block} \pause \begin{block}{} It is better to use these tools rather then wasting creativity to invent VCS which have files with names like \begin{color}{red}{prog1.py, prog2.py}\end{color} or \begin{color}{red}ass1.py, ass2.py.\end{color} \end{block} \end{frame} \begin{frame} \frametitle{Motivation behind such tools} \begin{itemize} \item Track the history and evolution of a program. \item To collaborate effectively on a project. \item \begin{color}{red}``To err is Human''\end{color} \pause for recovery we have ``Version Control'' \end{itemize} \end{frame} \begin{frame} \frametitle{How is done What is done?} \begin{itemize} \item It keeps track of changes you make to a file. You can improvise, revisit, and amend. \item all procedure is logged/recorded, so you and others can follow the development cycle. \end{itemize} \end{frame} \begin{frame} \frametitle{Do we really need this?} \emphbar{For team of people working remotely(even different computers/machines) on a project use of version control is inevitable!} \emphbar{For single person: managing projects and assignments becomes easy} \pause \emphbar{Its a good habit!} \end{frame} \begin{frame} \frametitle{Whats on the menu!} \begin{itemize} \item cvs(Concurrent Version System) \item svn (Subversion) \item hg (Mercurial) \item bzr (Bazaar) \item git \end{itemize} \end{frame} % Introduction to jargons \section{Learning the Lingo!} \begin{frame} \frametitle{Common jargons: Basic setup} \begin{itemize} \item Repository(repo):\\ The folder with all files. \item Server:\\ Machine with main inventory/repo. \item Client:\\ Local machines with copy of main repo. \end{itemize} \end{frame} \begin{frame} \frametitle{Actions} \begin{itemize} \item Add:\\ Adding file into the repo for the first time. \item Version:\\ Version number of a file. \item Head/Tip:\\ The latest revision of the repo. \item Check out/Clone:\\ Initial download of repo onto machine. \item Commit:\\ Recording a change. \item Change log/History:\\ List of changes made to repo. \end{itemize} \end{frame} \begin{frame} \frametitle{Actions cont...} \begin{itemize} \item Branch:\\ Separate local copy of repo for bug fixing, testing. \item Diff/Change:\\ Finding the differences in a file in two versions. \item Merge (or patch):\\ Apply the changes to file, to make it up-to-date. \item Conflict:\\ When merging a file creates a contradict. \item Resolve:\\ Fixing the conflict manually. \end{itemize} \end{frame} % Types of Version Controls \section{Types of VCS} \begin{frame} \frametitle{Types:} Based on way of managing the repo there are two types of VCS: \begin{itemize} \item Centralized VCS \item Distributed VCS \end{itemize} \end{frame} \begin{frame} \frametitle{Why hg?} \begin{itemize} \item Easy to learn and use. \item Lightweight. \item Scales excellently. \item Based on Python. \end{itemize} \end{frame} % Initializing the repo, cloning, committing changes, pushing, pulling to repo. \section{Getting Started} \begin{frame}[fragile] \frametitle{Getting comfortable:} Try following commands: \begin{lstlisting} $ hg version $ hg help $ hg help diff \end{lstlisting} %$ \end{frame} \begin{frame}[fragile] \frametitle{Cloning a repo} Clone is used to make a copy of an existing repository. This repo can be both local or remote. \begin{lstlisting} $ hg clone http://hg.serpentine.com/tutorial/hello localCopyhello \end{lstlisting} And we get a local copy of this repository. \begin{lstlisting} $ ls localCopyhello/ hello.c Makefile \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Creating a repo} To start a new repository \typ{hg} provides \typ{init} command. \begin{lstlisting} $ mkdir Fevicol $ cd Fevicol/ $ echo "print 'Yeh Fevicol ka majboot jod hai'" > feviStick.py $ ls -a . .. feviStick.py $ hg init $ ls -a . .. feviStick.py .hg \end{lstlisting} \typ{.hg} folder will store the logs related to this repo. \end{frame} \begin{frame}[fragile] \frametitle{Cloning a local repo: Branching} All \typ{hg} repositories are self-contained, and independent which can be cloned. Like: \begin{lstlisting} $ hg clone localCopyhello newCopy updating working directory 2 files updated, 0 files merged, 0 files removed, 0 files unresolved \end{lstlisting} or \begin{lstlisting} $ hg clone Fevicol Fevicol-pull updating working directory 0 files updated, 0 files merged, 0 files removed, 0 files unresolved \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{History/Logs} To check out track record of a repo one has to use \typ{log} command. \begin{lstlisting} $ cd localCopyhello $ hg log \end{lstlisting} The output of previous command have following fields: \begin{itemize} \item changeset: identifiers for the changeset. \item user: person who creates the changeset. \item date: The date and time of creation of changeset. \item summary: The one line description of changeset. \end{itemize} \end{frame} \begin{frame}[fragile] \frametitle{History/Logs cont...} By default it returns complete logs of all changes. To make it selective try: \begin{lstlisting} $ hg log -r 3 $ hg log -r 2:4 \end{lstlisting} To see tip/latest commit history use:\\ \typ{$ hg tip} %$ \end{frame} \begin{frame}[fragile] \frametitle{Adding files} We will revisit the Fevicol repo we created earlier. \begin{lstlisting} $ cd Fevicol $ hg log $ hg status ? feviStick.py \end{lstlisting} %$ "?" sign in front of name indicates that this file is not yet part of track record. \typ{add} command is used to add new files to repo. \begin{lstlisting} $ hg add feviStick.py $ hg st A feviStick.py \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Committing changes} \typ{hg} uses \typ{commit} (alias \typ{ci}) command to make changes logged. So after adding a file, we have to commit it also by: \begin{lstlisting} $ hg ci -u "Shantanu " -m "First commit." $ hg log changeset: 0:84f5e91f4de1 tag: tip user: Shantanu date: Fri Aug 21 23:37:13 2009 +0530 summary: First commit. \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{More basic operations} \begin{lstlisting} $ hg rename feviStick.py feviCol.py $ hg st A feviCol.py $ hg ci -u "Shantanu " -m "Renamed feviStick.py." $ hg tip changeset: 1:d948fb4137c5 tag: tip user: Shantanu date: Sat Aug 22 00:11:25 2009 +0530 summary: Renamed feviStick.py. \end{lstlisting} %% Other commands which can be handy are \typ{cp}, \typ{remove}, \typ{revert} etc. \end{frame} % Introduction to concepts of branches, merging patch? \section{Sharing and Collaborating} \begin{frame}[fragile] \frametitle{Distributing changes} As this repo is self-contained, hence changeset just created are local and are not propagated to previously cloned Fevicol-pull. \begin{lstlisting} $ hg pull pulling from /home/baali/Fevicol requesting all changes adding changesets adding manifests adding file changes added 2 changesets with 2 changes to 2 files (run 'hg update' to get a working copy) \end{lstlisting} %$ \end{frame} \begin{frame}[fragile] \frametitle{Pulling changesets cont...} as last line of previous command suggest, hg \typ{pull} does not(by default) update current directory. It just imports changesets. To add all these changesets one have to update using \typ{up} command: \begin{lstlisting} $ cd Fevicol-pull $ ls -a . .. .hg $ hg up 2 files updated, 0 files merged, 0 files removed, 0 files unresolved $ ls -a . .. feviCol.py feviStick.py .hg \end{lstlisting} \end{frame} \begin{frame}[fragile] \frametitle{Making changes across the repos} \typ{$ cd Fevicol-clone/}\\ %$ Lets edit and correct the feviStick.py \begin{lstlisting} $ echo "print 'Ab no more Chip Chip'" > feviStick.py $ hg st M feviStick.py \end{lstlisting} 'M' sign indicates that Mercurial has noticed change.\\ \end{frame} \begin{frame}[fragile] \frametitle{Revisiting changes} To look back at the changes made there is \typ{diff} command: \begin{lstlisting} $ hg diff diff -r a7912d45f47c feviStick.py --- a/feviStick.py Sun Aug 23 22:34:35 2009 +0530 +++ b/feviStick.py Sun Aug 23 22:47:49 2009 +0530 @@ -1,1 +1,1 @@ -print 'Yeh Fevicol ka Majboot jod hai' +print 'Ab no more Chip Chip' \end{lstlisting} %$ These changes are not logged until you commit them.\\ \begin{lstlisting} $ hg ci -u "Shantanu " -m "Changed tagline for feviStick.py." \end{lstlisting} %$ \end{frame} \begin{frame}[fragile] \frametitle{Syncing two repos} Now to bring both the repos to same stage one have to \typ{push} changes. \begin{lstlisting} $ hg push pushing to /home/baali/Fevicol searching for changes adding changesets adding manifests adding file changes added 1 changesets with 1 changes to 1 files \end{lstlisting} %$ \end{frame} \begin{frame}[fragile] \frametitle{Syncing cont...} Same as pulling, pushing wont update the main repo by default. Try running following command: \begin{lstlisting} $ hg tip $ cat feviStick.py \end{lstlisting} \typ{tip} shows latest changeset, but content of file are not updated. We have to use \typ{up} on main branch \begin{lstlisting} $ hg up 1 files updated, 0 files merged, 0 files removed, 0 files unresolved \end{lstlisting} %$ \end{frame} \begin{frame}[fragile] \frametitle{Merging} \end{frame} \begin{frame}[fragile] \frametitle{} \end{frame} % Steps to follow to make life easier. How to avoid/handle manual merges. \section{Work flow: DOS and DON'Ts} \begin{frame} \frametitle{Suggested Readings:} \begin{itemize} \item \url{http://hgbook.red-bean.com/} \item \url{http://karlagius.com/2009/01/09/version-control-for-the-masses/} \item Articles related to version control available on \url{http://betterexplained.com/} \item \url{http://en.wikipedia.org/wiki/Revision_control} \item \url{http://wiki.alliedmods.net/Mercurial_Tutorial} \end{itemize} \end{frame} \end{document}