All content done
[ai-gitflashtalk.git] / git.tex
diff --git a/git.tex b/git.tex
index c336224..5319eb1 100644 (file)
--- a/git.tex
+++ b/git.tex
                \item Mart Lubbers
                \item 4th year bachelor AI
                \item \url{https://github.com/dopefishh/gitflashtalk}
-               \item Sha of this version: {\tiny\GITAbrHash}
+               \item SHA of the commit of this presentation:
+                       {\tiny\GITAbrHash}
        \end{itemize}
 \end{frame}
 
-\section{Basics}
+\begin{frame}
+       \frametitle{Where did GIT come from?}
+       \begin{block}{History}
+               \begin{columns} \column{0.4\linewidth}
+                       \begin{itemize}
+                               \item Pronounce: \textipa{[g\'\i t]} 
+                               \item Linus Thorvalds
+                               \item Linux kernel
+                       \end{itemize}
+
+                       \column{0.5\linewidth}
+                       \begin{figure}[H]
+                               \centering
+                               \includegraphics[width=0.5\linewidth]{1.png}
+                               \caption{Linus Torvalds}
+                       \end{figure}
+               \end{columns} 
+       \end{block}
+
+       \begin{block}{What is GIT?}
+               \begin{itemize}
+                       \item Version control
+               \end{itemize}
+       \end{block}
+\end{frame}
+
+\begin{frame}
+       \frametitle{Why GIT?}
+       \begin{block}{Pros}
+               \begin{itemize}
+                       \item Fast
+                       \item Scaleable
+                       \item Simple
+                       \item Support for non linear development
+                       \item Intermediate stage between committing and pushing
+               \end{itemize}
+       \end{block}
+
+       \begin{block}{Cons}
+               \begin{itemize}
+                       \item Binary files
+                       \item Intermediate stage between committing and pushing
+               \end{itemize}
+       \end{block}
+\end{frame}
+
+\section{Installation}
+\begin{frame}[fragile]
+       \begin{block}{{\Large\Smiley\Smiley} Linux}
+               Depending on the distribution you may have to do:\\
+               \texttt{\# apt-get install git}\\
+               \texttt{\# pacman -S git}\\
+               \texttt{\# yum install git}\\
+               \texttt{\# emerge --ask dev-vcs/git}\\
+               Etc\ldots
+       \end{block}
+               
+       \begin{block}{{\Large\Frowny\Smiley} Mac}
+               Install via XCode tools. Just run \lstinline{$\$$ git} and
+               when GIT is not installed it will prompt you with instructions.
+       \end{block}
+                       
+       \begin{block}{{\Large\Frowny\Frowny} Windows}
+               Downoad the binary from \url{http://git-scm.com/download/win} and install.
+       \end{block}
+
+\end{frame}
+
+\section{Getting started \& workflow}
+\begin{frame}[fragile]
+       \frametitle{Getting started}
+       \begin{block}{Check GIT version in (GIT) bash}
+               \begin{lstlisting}
+frobnicator@frobmachine:~$\$$ git --version
+git version 1.7.10.4
+               \end{lstlisting}
+       \end{block}
+
+       \begin{block}{Create a repository}
+               \begin{lstlisting}
+frobnicator@frobmachine:~/projects$\$$ git init myfirstproject
+Initialized empty Git repository in /home/frobnicator/projects/myfirstproject/.git/
+
+frobnicator@frobmachine:~/projects$\$$ ls -1 myfirstproject/.git
+branches/
+config
+description
+HEAD
+hooks/
+info/
+objects/
+refs/
+               \end{lstlisting}
+       \end{block}
+\end{frame}
+
+\begin{frame}
+       \frametitle{Four (five) stages}
+       \begin{itemize}
+               \item (Stash)
+               \item Workspace
+               \item Index
+               \item Local repo
+               \item Upstream repo
+       \end{itemize}
+\end{frame}
+
+\begin{frame}
+       \frametitle{Workflow}
+       \begin{figure}[H]
+               \centering
+               \includegraphics[scale=0.4]{2.png}
+               \caption{Git workflow}
+       \end{figure}
+\end{frame}
+
+\section{Everything is a commit}
+\begin{frame}[fragile]
+       \frametitle{Add and commit}
+       \begin{lstlisting}
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ echo "This is a frobfile" > frobbedfile
+
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git status
+On branch master
+
+Initial commit
+
+Untracked files:
+  (use "git add <file>..." to include in what will be committed)
+
+       frobbedfile
+
+nothing added to commit but untracked files present (use "git add" to track)
+       \end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+       \begin{lstlisting}
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git add frobbedfile
+
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git status
+On branch master
+
+Initial commit
+
+Changes to be committed:
+  (use "git rm --cached <file>..." to unstage)
+
+       new file:   frobbedfile
+
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git commit
+[master (root-commit) 2b7355e] Adds frobbedfile
+ 1 file changed, 1 insertion(+)
+  create mode 100644 frobbedfile
+       \end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+       \frametitle{Log \& Checkout}
+       \begin{lstlisting}
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ echo "This is a second frobbedfile" > frob2
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git add frob2
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git commit -m "This is a second commit"
+[master cd094bc] This is a second commit
+ 1 file changed, 1 insertion(+)
+ create mode 100644 frob2
+       \end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+       \frametitle{Log \& Checkout 2}
+       \begin{lstlisting}
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git log
+commit cd094bc6b81812256533395454db22da07d1e5a4
+Author: Frob Nicator <frob@nicator.net>
+Date:   Thu Apr 16 22:44:42 2015 +0200
+
+    This is a second commit
 
-\section{Branching}
+commit c9c9b358cddcbee541ec433a2dc2d5ffe3e928c2
+Author: Frob Nicator <frob@nicator>
+Date:   Thu Apr 16 22:44:42 2015 +0200
+
+    Adds frobbedfile
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ ls
+frob2  frobbedfile
+       \end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+       \frametitle{Log \& Checkout 2}
+       \begin{lstlisting}
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git checkout c9c9b3
+Note: checking out 'c9c9b3'.
+
+You are in 'detached HEAD' state. You can look around, make experimental
+changes and commit them, and you can discard any commits you make in this
+state without impacting any branches by performing another checkout.
+
+If you want to create a new branch to retain commits you create, you may
+do so (now or later) by using -b with the checkout command again. Example:
+
+  git checkout -b new_branch_name
+
+HEAD is now at c9c9b35... Adds frobbedfile
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ ls
+frobbedfile
+       \end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+       \frametitle{Log \& Checkout 3}
+       \framesubtitle{We lost our commit and our file!}
+       \begin{lstlisting}
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git log
+commit c9c9b358cddcbee541ec433a2dc2d5ffe3e928c2
+Author: Frob Nicator <frob@nicator>
+Date:   Thu Apr 16 22:44:42 2015 +0200
+
+    Adds frobbedfile
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ ls
+frobbedfile
+       \end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+       \frametitle{Log \& Checkout 4}
+       \begin{block}{Ofcourse not, you never lose stuff with git}
+               \begin{lstlisting}
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git log --all
+commit cd094bc6b81812256533395454db22da07d1e5a4
+Author: Frob Nicator <frob@nicator.net>
+Date:   Thu Apr 16 22:44:42 2015 +0200
+
+    This is a second commit
+...
+...
+               \end{lstlisting}
+       \end{block}
+\end{frame}
+
+\begin{frame}[fragile]
+       \frametitle{Log \& Checkout 5}
+       \begin{block}{We can just checkout the hash again}
+               \begin{lstlisting}
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ ls
+frob2  frobbedfile
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git log --decorate --oneline --graph --all
+* cd094bc (HEAD, master) This is a second commit
+* c9c9b35 Adds frobbedfile
+               \end{lstlisting}
+       \end{block}
+\end{frame}
+
+
+\section{Branching and unevitable merging}
+\begin{frame}
+       \frametitle{Branching}
+       \begin{itemize}
+               \item Commit: State of the folder. Has and knows his parent.\\
+               \item Branch: Just a named commit.\\
+                       Usually a sidetrack of a project.\\
+                       Master, develop, feature, etc\ldots
+               \item Tag: Just a named commit.\\
+                       Usually marked point to jump to later on.\\
+                       eg. Version release, big change etc\ldots
+       \end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+       \frametitle{Branching 2}
+       \begin{block}{See current branch}
+               \begin{lstlisting}
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git branch
+* master
+               \end{lstlisting}
+       \end{block}
+       \begin{block}{Create new branch}
+               \begin{lstlisting}
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git checkout -b "develop"
+Switched to a new branch 'develop'
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git branch
+* develop
+  master
+               \end{lstlisting}
+       \end{block}
+       \begin{block}{Delete branch}
+               \begin{lstlisting}
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git branch -d "develop"
+Deleted branch develop (was cd094bc).
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git branch
+* master
+               \end{lstlisting}
+       \end{block}
+\end{frame}
+
+\begin{frame}[fragile]
+       \frametitle{Push \& Pull}
+       \begin{block}{What?}
+               \begin{itemize}
+                       \item Push your changes upsteam repository (eg.\ github)
+                       \item Pull their changes from upstream
+                       \item Merge into your branch
+               \end{itemize}
+       \end{block}
+       \begin{block}{How?}
+               \begin{lstlisting}
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git remote add origin https://github.com/dopefishh/prj.git
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git push origin master
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git pull origin master
+               \end{lstlisting}
+       \end{block}
+\end{frame}
+
+\begin{frame}[fragile]
+       \frametitle{Merge}
+       \begin{block}{Merge develop to master}
+               \begin{lstlisting}
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git merge develop
+               \end{lstlisting}
+       \end{block}
+
+       \begin{block}{How to get a conflict}
+               \begin{itemize}
+                       \item We make a file with three lines
+                       \item On every line we set: \texttt{regelN} where N is line
+                       number.
+                       \item Change line 2 in the master and develop branch to a
+                               separate thing.
+                       \item Commit both and checkout master
+                       \item Do merge
+               \end{itemize}
+       \end{block}
+\end{frame}
+
+\begin{frame}[fragile]
+       \frametitle{Merge 2}
+       \begin{block}{Merge message}
+               \begin{lstlisting}
+frobnicator@frobmachine~/projects/myfirstproject$\$$ git merge develop
+Auto-merging mergeconfict
+CONFLICT (content): Merge conflict in mergeconfict
+Automatic merge failed; fix conflicts and then commit the result.
+               \end{lstlisting}
+       \end{block}
+       \begin{block}{Contents of mergeconflict file}
+               \begin{lstlisting}
+1 regel1                                                                          
+2 <<<<<<< HEAD                                                                    
+3 masterregel2                                                                    
+4 =======                                                                         
+5 developregel2                                                                   
+6 >>>>>>> develop                                                                 
+7 regel3  
+               \end{lstlisting}
+       \end{block}
+\end{frame}
+
+\begin{frame}[fragile]
+       \frametitle{Merge 3}
+       \begin{block}{Commit message}
+               \begin{lstlisting}
+ 1 Merge branch 'develop'                                                          
+ 2                                                                                 
+ 3 Conflicts:                                                                      
+ 4         mergeconfict                                                            
+ 5 #                                                                               
+ 6 # It looks like you may be committing a merge.                                  
+ 7 # If this is not correct, please remove the file                                
+ 8 #       .git/MERGE_HEAD                                                         
+ 9 # and try again.                                                                
+10                                                                                 
+11                                                                                 
+12 # Please enter the commit message for your changes. Lines starting              
+13 # with '#' will be ignored, and an empty message aborts the commit.             
+14 # On branch master                                                              
+15 # All conflicts fixed but you are still merging.                                
+16 #                                                                               
+17 # Changes to be committed:                                                      
+18 #       modified:   mergeconfict                                                
+19 #                                
+               \end{lstlisting}
+       \end{block}
+\end{frame}
+
+\begin{frame}[fragile]
+       \frametitle{Merge 4}
+       \begin{block}{Output from git log}
+               \begin{lstlisting}
+*   a6474c9 (HEAD, master) Merge branch 'develop'
+|\  
+| * 8b292ad (develop) Develop merge conflict
+* | 7d5018a Master merge confict
+|/  
+* 885a341 First merge conflict push
+* cd094bc This is a second commit
+* c9c9b35 Adds frobbedfile
+               \end{lstlisting}
+       \end{block}
+\end{frame}
+
+\section{Tips \& Tricks}
+\begin{frame}[fragile]
+       \frametitle{\texttt{/home/frobnicator/.gitconfig}}
+       \begin{lstlisting}
+frobnicator@frobmachine~$\$$ cat .gitconfig
+[user]
+name = Frob Nicator
+email = frob@nicator.com
+
+[alias]
+tree = log --decorate --oneline --graph --all
+pushm = push origin master
+pushd = push origin develop
+       \end{lstlisting}
+\end{frame}
+
+\begin{frame}[fragile]
+       \frametitle{Public key}
+       \begin{block}{SSH config}
+               \begin{lstlisting}
+frobnicator@frobmachine:~$\$$ cat .ssh/config
+Host github.com
+       IdentityFile /home/frobnicator/.ssh/github
+       User git
+               \end{lstlisting}
+       \end{block}
+       \begin{block}{Create Key}
+               \begin{lstlisting}
+frobnicator@frobmachine:~ $\$$ ssh-keygen -f /home/frobnicator/.ssh/github
+               \end{lstlisting}
+       \end{block}
+       \begin{block}{Clone with ssh}
+               \begin{lstlisting}
+frobnicator@frobmachine:~/projects/myfirstproject$\$$ git remote add origin git@github.com:frobnicator/prj.git
+frobnicator@frobmachine:~/projects/$\$$ git clone git@github.com:frobnicator/prj.git
+               \end{lstlisting}
+       \end{block}
+\end{frame}
 
 \end{document}