diff --git a/git-tutorial.tex b/git-tutorial.tex index 471aee667da18df5cb1b3a5e918ea2a9348f0cd5..2006959d9fa2a223feaddd0a3aa70985c914b9f9 100644 --- a/git-tutorial.tex +++ b/git-tutorial.tex @@ -24,10 +24,40 @@ \section{Git Tools} \label{sec:tools} +Depending on which OS you use, there are some different choices of git +clients available. For the purpose of this tutorial we will only +consider running git from a terminal shell, but you can of course +install one of the available gui clients and transform the information +given in the tutorial to that gui client. +\subsubsection*{Linux} +\label{linux} +Git packages are included in at least all major Linux +distributions. Just use your package manager of choice to find and +install git. -\section{Hands-On Excercise} +\subsubsection*{MacOSX} +\label{sec:macosx} +Get your git client from \verb|http://git-scm.com/download/mac| + +\subsubsection*{Windows} +\label{sec:windows} +Get your Windows git client from \verb|http://git-scm.com/download/win|. + + +\section{Hands-On Example} \label{sec:handson} +In this section we will walk through the basic git operations using +this very tutorial as an example project. We will first show the +workflow for a standalone repository, typically what you would have +for versioning your own small projects. Then we will show what happens +when we want to work in a distributed context, cooperating with other +people. + +\subsection{Standalone Repository} +\label{sec:standalone} +The simplest use case is that of one single developer, one local +repository. \begin{figure}[h!] \centering @@ -57,10 +87,10 @@ git config --global --get user.name Let us say we have a directory with files that we want to version control using git. \begin{lstlisting} -andersn@stodola:../computers/git-tutorial$ pwd +andersn@stodola: pwd /local/home/andersn/work/computers/git-tutorial -andersn@stodola:../computers/git-tutorial$ ls +andersn@stodola: ls git-tutorial.aux git-tutorial.pdf git-tutorial.tex lifecycle.png git-tutorial.log #git-tutorial.tex# git-tutorial.tex~ @@ -68,14 +98,14 @@ git-tutorial.tex~ We can now create a new repository in this directory \begin{lstlisting} -andersn@stodola:../computers/git-tutorial$ git init +andersn@stodola: git init \end{lstlisting} The result of this command is a new subdirectory called \verb|.git| that contains the actual git repository. If you look into it you will see various files and subdirectories. \begin{lstlisting} -andersn@stodola:../computers/git-tutorial$ ls .git/ +andersn@stodola: ls .git/ branches config description HEAD hooks info objects refs \end{lstlisting} Some of these are human readable while others are not. If you are @@ -94,7 +124,7 @@ from the \LaTeX source. We will take care of that when it is time to add files to the repository. \begin{lstlisting} -andersn@stodola:../computers/git-tutorial$ git status +andersn@stodola: git status # On branch master # # Initial commit @@ -112,8 +142,8 @@ nothing added to commit but untracked files present (use "git add" to track) \end{lstlisting} \begin{lstlisting} -andersn@stodola:../computers/git-tutorial$ git add lifecycle.png git-tutorial.tex -andersn@stodola:../computers/git-tutorial$ git status +andersn@stodola: git add lifecycle.png git-tutorial.tex +andersn@stodola: git status # On branch master # # Initial commit @@ -134,17 +164,27 @@ andersn@stodola:../computers/git-tutorial$ git status # git-tutorial.tex~ \end{lstlisting} +\subsubsection*{Using gitignore} +\label{sec:gitignore} +As you have just seen \verb|git status| lists a number of untracked +files that we are not interested in versioning, and as the number of +unversioned files grow they tend to clutter the view. By creating a +file called \verb|.gitignore| in which we list filenames and name +pattern that we do not want git to consider the view becomes much more +uncluttered. \begin{lstlisting} *.aux *.log *~ git-tutorial.pdf \end{lstlisting} +Adding \verb|.gitignore| to our repository and running +\verb|git status| again we see that it now looks much better. \begin{lstlisting} -andersn@stodola:../computers/git-tutorial$ git add .gitignore -andersn@stodola:../computers/git-tutorial$ git status +andersn@stodola: git add .gitignore +andersn@stodola: git status # On branch master # # Initial commit @@ -155,27 +195,96 @@ andersn@stodola:../computers/git-tutorial$ git status # new file: .gitignore # new file: git-tutorial.tex # new file: lifecycle.png -# -# Changes not staged for commit: -# (use "git add <file>..." to update what will be committed) -# (use "git checkout -- <file>..." to discard changes in working directory) -# -# modified: git-tutorial.tex -# \end{lstlisting} - +\subsubsection*{Commit} +\label{sec:commit} +If we are satisfied with the output of \verb|git status| it is now +time to perform a commit operation and create an initial revision of +the project in the repository. The text within double quote marks is a +revision comment. Good revision comments, that is, meaningful but +terse, are important as they can be of good use when you or someone +else at some time look back into the revision history and try to find +out what happened and when. \begin{lstlisting} -andersn@stodola:../computers/git-tutorial$ git commit -am"Initial commit" +andersn@stodola: git commit -am"Initial commit" [master (root-commit) c6d834c] Initial commit 3 files changed, 146 insertions(+) create mode 100644 .gitignore create mode 100644 git-tutorial.tex create mode 100644 lifecycle.png -andersn@stodola:../computers/git-tutorial$ git status +andersn@stodola: git status # On branch master nothing to commit (working directory clean) \end{lstlisting} +After performing the first commit, work goes on. New files are added +and existing files are edited. Whenever it feels motivated, add new +files to the repository and perform new commits with meaningful commit +messages. + +\subsection{Distributed Work} +\label{sec:distributed} + +With the distributed model of git (and bzr,hg,darcs,...) each user has +his own repository, in contrast to the centralized model of subversion +and cvs where there is only one central repository where the version +data of a project may be stored. With multiple repository copies we +need operations to keep different repositories synchronized. + +In this tutorial we will keep to the model with one ``master'' +repository with which all users synchronize. However, this model is by +no means enforced by the git tool. Users could just as well +synchronized directly with their fellow users' repositories, but +practical difficulties with allowing access to all repositories as +well as the higher level of discipline needed to keep all repositories +synchronized can make this flat hierarchy model cumbersome for all but +very experienced users. + +\subsubsection*{Clone} +\label{clone} +To create a local copy of a remote repository we use \verb|git clone| +\begin{lstlisting} +andersn@fiol: git clone andersn@stodola.control.lth.se:work/computers/git-tutorial +Cloning into 'git-tutorial'... +remote: Counting objects: 11, done. +remote: Compressing objects: 100% (10/10), done. +remote: Total 11 (delta 2), reused 0 (delta 0) +Receiving objects: 100% (11/11), 46.64 KiB, done. +Resolving deltas: 100% (2/2), done. +\end{lstlisting} + +\subsubsection*{Pull} +\label{pull} +When we want to check for, and merge into our repository copy, changes +made to the master repository, we can use \verb|git pull| +\begin{lstlisting} +andersn@fiol: git pull +Already up-to-date. +\end{lstlisting} +In this case it was not particularly interesting since the local clone +was already up to date with the remote master. + +\subsubsection*{Push} +\label{push} + +\subsubsection*{Merge} +\label{merge} + + + + + +\section{Further Reading} +\label{sec:furtherreading} + +\begin{itemize} +\item A cheat sheet is good to print out and have at hand next to your keyboard: \\ + \verb|http://git-scm.com/documentation| + or\\ + \verb|http://www.git-tower.com/files/cheatsheet/Git_Cheat_Sheet_grey.pdf| +\item The \emph{Pro Git} book is available online: \verb|http://git-scm.com/book| +\end{itemize} + \end{document}