Compare commits
	
		
			16 commits
		
	
	
		
			FirstDraft
			...
			master
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | bc88d8ba59 | ||
|  | 2be367ed02 | ||
|  | 4456e16333 | ||
|  | 534671c188 | ||
|  | 703737785a | ||
|  | e3e5f7f788 | ||
|  | 56f90b3dae | ||
|  | c1b330189e | ||
|  | 8d49cebcc7 | ||
|  | 19a28245e6 | ||
|  | 5b14dc3e47 | ||
|  | 3124da5b30 | ||
|  | 79a2042c1a | ||
|  | d2e40a357c | ||
|  | 92cdfebd8a | ||
|  | 521113eba1 | 
					 6 changed files with 483 additions and 340 deletions
				
			
		
							
								
								
									
										30
									
								
								README.md
									
										
									
									
									
								
							
							
						
						
									
										30
									
								
								README.md
									
										
									
									
									
								
							|  | @ -2,11 +2,15 @@ | |||
| 
 | ||||
| This is a presentation about Git. | ||||
| 
 | ||||
| ## Download | ||||
| 
 | ||||
| If you just want to download a copy of the presentation, you can do so [here](https://git.jonathanh.co.uk/attachments/b2f284a7-d9fe-4dda-b8e4-485d79cdfa6e). | ||||
| 
 | ||||
| ## Build | ||||
| 
 | ||||
| To build it, you will need make, pdflatex and ansi-to-svg and inkscape. | ||||
| 
 | ||||
| To build the main pd, run: | ||||
| To build the main pdf, run: | ||||
| 
 | ||||
| ```bash | ||||
| make main.pdf | ||||
|  | @ -26,7 +30,9 @@ make only-notes.pdf | |||
| 
 | ||||
| ## Auto Images | ||||
| 
 | ||||
| The build system will generate certain types of graphics for the presentation as part of the build system. The resultant files will always go in the `auto-images` folder. As a result, this folder is not under version control. | ||||
| The build system will generate certain types of graphics for the presentation as part of the build | ||||
| system. The resultant files will always go in the `auto-images` folder. As a result, this folder is | ||||
| not under version control. | ||||
| 
 | ||||
| In latex, all you need to do is | ||||
| 
 | ||||
|  | @ -44,13 +50,16 @@ What is a presentation without an xkcd comic? | |||
| \includegraphics[<options>]{auto-xkcd-<id>.png} | ||||
| ``` | ||||
| 
 | ||||
| If the above is included in the latex document, the XKCD comic with the specified ID will be downloaded and embedded in the pdf. | ||||
| If the above is included in the latex document, the XKCD comic with the specified ID will be | ||||
| downloaded and embedded in the pdf. | ||||
| 
 | ||||
| ### Shell Output | ||||
| 
 | ||||
| I am still not aware of aware of a reliable way to include ansi coloured shell output into a latex document. I also don't want to include loads of high-res screenshots in my Git repo. | ||||
| I am still not aware of aware of a reliable way to include ansi coloured shell output into a latex | ||||
| document. I also don't want to include loads of high-res screenshots in my Git repo. | ||||
| 
 | ||||
| The work around I have come up with is to save the raw ansi output to a wile in `shell-output`. This normally involves forcing an application to output in colour: | ||||
| The work around I have come up with is to save the raw ansi output to a wile in `shell-output`. This | ||||
| normally involves forcing an application to output in colour: | ||||
| 
 | ||||
| ```bash | ||||
| git -c color.status=always status > shell-output/git-status.out | ||||
|  | @ -63,3 +72,14 @@ git -c color.status=always status > shell-output/git-status.out | |||
| ``` | ||||
| 
 | ||||
| The build system will convert the ansi output into an embeddable PDF that LaTeX will embed. | ||||
| 
 | ||||
| ### Online images | ||||
| 
 | ||||
| In order to download an image from the internet and embed it in the presentation, you need do | ||||
| provide the extension and the base64 encoded URL. | ||||
| 
 | ||||
| ```latex | ||||
| \includegraphics[<options>]{auto-download-<base64 encodede url>.png} | ||||
| ``` | ||||
| 
 | ||||
| 
 | ||||
|  |  | |||
							
								
								
									
										29
									
								
								greeting.py
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							
							
						
						
									
										29
									
								
								greeting.py
									
										
									
									
									
										
										
										Executable file → Normal file
									
								
							|  | @ -1,6 +1,25 @@ | |||
| import sys | ||||
|     def main(): | ||||
|         print("Hello") | ||||
| #!/usr/bin/env python | ||||
| 
 | ||||
|     if __name__ == "__main__": | ||||
|         main() | ||||
| import sys | ||||
| 
 | ||||
| def cat(): | ||||
|     print("Meow") | ||||
| 
 | ||||
| def dog(): | ||||
|     print("Woof") | ||||
| 
 | ||||
| def cow(): | ||||
|     print("Moo") | ||||
| 
 | ||||
| def main(): | ||||
|     if len(sys.argv) > 1 and sys.argv[1] == "cat": | ||||
|         cat() | ||||
|     elif len(sys.argv) > 1 and sys.argv[1] == "dog": | ||||
|         dog() | ||||
|     elif len(sys.argv) > 1 and sys.argv[1] == "cow": | ||||
|         cow() | ||||
|     else: | ||||
|         print("HELLO WORLD") | ||||
| 
 | ||||
| if __name__ == "__main__": | ||||
|     main() | ||||
|  |  | |||
							
								
								
									
										756
									
								
								main.latex
									
										
									
									
									
								
							
							
						
						
									
										756
									
								
								main.latex
									
										
									
									
									
								
							|  | @ -1,4 +1,4 @@ | |||
| \documentclass{beamer} | ||||
| \documentclass[aspectratio=169]{beamer} | ||||
| 
 | ||||
| \usepackage{pgfpages} | ||||
| %showNotes%\setbeameroption{show notes on second screen=right} | ||||
|  | @ -15,14 +15,13 @@ | |||
| \usepackage{amsmath} | ||||
| \usepackage{pdfpages} | ||||
| \usepackage{tikz} | ||||
| \usepackage[UKenglish]{babel}% | ||||
| \usetikzlibrary{shapes.geometric, arrows} | ||||
| \tikzstyle{commit} = [circle, text centered, line width=2, | ||||
| 	minimum size=1.5cm, draw=blue, fill=blue!80, text=white] | ||||
| \tikzstyle{branch} = [ellipse, text centered, text=green] | ||||
| \tikzstyle{arrow} = [thick, <-, draw=blue] | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| \usepackage{dirtree} | ||||
| \usepackage{csquotes} | ||||
| %\usepackage{gitdags} | ||||
|  | @ -35,7 +34,11 @@ | |||
| 
 | ||||
| \usetheme{default} | ||||
| \beamertemplatenavigationsymbolsempty | ||||
| \hypersetup{pdfpagemode=UseNone} % don't show bookmarks on initial view | ||||
| \hypersetup{% | ||||
| 	colorlinks=true, | ||||
| 	urlcolor=blue, | ||||
| 	%pdfpagemode=UseNone | ||||
| } % don't show bookmarks on initial view | ||||
| 
 | ||||
| %\lstset{% | ||||
| %  breaklines=true, | ||||
|  | @ -57,37 +60,31 @@ | |||
| \author{Jonathan Hodgson (Archie)} | ||||
| \date{\today} | ||||
| 
 | ||||
| %\titlegraphic{\includegraphics[width=1cm,keepaspectratio]{auto-xkcd-1597.png}) | ||||
|  \institute{ | ||||
|       \includegraphics[width=\textwidth,height=.5\textheight,keepaspectratio]{auto-xkcd-1597.png}% | ||||
|  } | ||||
| 
 | ||||
| 
 | ||||
| \begin{document} | ||||
| 
 | ||||
| \frame{\titlepage} | ||||
| 
 | ||||
| \note{% | ||||
| 	A few people recently have asked me about Git. | ||||
| 
 | ||||
| 	Git has become the de-facto for most situations. | ||||
| 
 | ||||
| 	Microsoft recently moved to git for version controlling Windows and Office. | ||||
| 
 | ||||
| 	I will not be able to cover everything relating to Git, it is an incredibly powerful tool. | ||||
| 	However, hopefully I will be able to give you enough to get started and at least understand the | ||||
| 	official documentation. | ||||
| } | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Aims} | ||||
| 	I am obviously not going to be able to go over everything that git does. | ||||
| 	\begin{itemize} | ||||
| 		\item I don't know everything Git does | ||||
| 		\item Git does LOADS of stuff | ||||
| 	\end{itemize} | ||||
| 	Hopefully after this you will be able to use Git well for most day-to-day tasks. Git has very | ||||
| 	compressive documentation. I hope that this will also give you enough of a background to | ||||
| 	understand the documentation. | ||||
| \frame{ | ||||
| 	\titlepage | ||||
| 	\note{% | ||||
| 		A few people recently have asked me about Git. | ||||
| 
 | ||||
| 		Git has a reputation for being hard. I think this is (at least partly) because so much of | ||||
| 		its inner workings are abstracted away making the interface feel like magic. Not to mention | ||||
| 		videos with titles like "Learn git in 15 minutes" | ||||
| 
 | ||||
| 		I think that understanding a bit about how Git works under the hood will help de-mistily it. | ||||
| 		It certainly did for me. | ||||
| 
 | ||||
| 		Git's data model is actually quite simple (beautiful even). Understanding the basics of this | ||||
| 	can really help. | ||||
| 
 | ||||
| 	} | ||||
| \end{frame} | ||||
| } | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{What is Git} | ||||
|  | @ -101,9 +98,9 @@ | |||
| 	\end{itemize} | ||||
| 
 | ||||
| 	\note{% | ||||
| 		Git is still being developed. | ||||
| 
 | ||||
| 		Being distributed means you can work on repositories offline (Unlike SVN). | ||||
| 		It keeps track by maintaining a series of snapshots containing all of the files and folders | ||||
| 		at each point. | ||||
| 
 | ||||
| 		It's useful even if you're working on things by your self. This presentation is version | ||||
| 		controlled. | ||||
|  | @ -111,31 +108,147 @@ | |||
| 		You can use it to find out when something broke. I won't be covering it today but there is a | ||||
| 		tool called git bisect that can take a unit test (or script) to analyse when something broke | ||||
| 		using a binary search. | ||||
| 
 | ||||
| 		Being distributed means you can work on repositories offline (Unlike SVN). | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{What is Git} | ||||
| 
 | ||||
| 	\begin{center} | ||||
| 		\Huge Git $\ne$ Github | ||||
| 	\end{center} | ||||
| 
 | ||||
| 	\note{% | ||||
| 		Although the names are similar, Git and Github are separate projects. Github is a Microsoft | ||||
| 		owned, closed source company that is a remote repository for Git projects. | ||||
| 		 | ||||
| 		There are others such as Bitbucket, Gitlab, Gitea | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Naïve Approach} | ||||
| 	\begin{columns} | ||||
| 		\begin{column}{0.5\textwidth} | ||||
| 			\dirtree{% | ||||
| 				.1 Project. | ||||
| 				.2 draft. | ||||
| 				.3 some. | ||||
| 				.3 files. | ||||
| 				.2 final-draft. | ||||
| 				.3 some. | ||||
| 				.3 files. | ||||
| 				.2 final. | ||||
| 				.3 some. | ||||
| 				.3 files. | ||||
| 			} | ||||
| 		\end{column} | ||||
| 		\begin{column}{0.5\textwidth} | ||||
| 			\textbf{Pros} | ||||
| 			\begin{itemize} | ||||
| 				\item Simple | ||||
| 				\item No dependencies | ||||
| 				\item No Learning curve | ||||
| 			\end{itemize} | ||||
| 			\vspace{1em} | ||||
| 			\textbf{Cons} | ||||
| 			\begin{itemize} | ||||
| 				\item Difficult to collaborate | ||||
| 				\item Lot's of wasted disk space | ||||
| 				\item Hard to find particular versions of files | ||||
| 			\end{itemize} | ||||
| 		\end{column} | ||||
| 	\end{columns} | ||||
| 	\note{% | ||||
| 		There are many approaches you could take to version control | ||||
| 
 | ||||
| 		I think, being honest, we have all done this. This sort of works, if you're working on | ||||
| 		something by yourself. Once you start collaborating on software, you are going to have a bad | ||||
| 		time. | ||||
| 
 | ||||
| 		You could add time stamps and zip up changes when you need to collaborate. | ||||
| 
 | ||||
| 		Git has a well thought out model that allows us to address these problems. | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Files and Folders} | ||||
| 
 | ||||
| 	\textbf{Blob} In Git, a file is called a blob. | ||||
| 
 | ||||
| 	\textbf{Tree} In Git, a directory is called a tree. | ||||
| 
 | ||||
| 	 | ||||
| 	\note{% | ||||
| 		Git needs a way of modeling files and folders in a file system independent way. | ||||
| 
 | ||||
| 		These concepts are pretty familiar. A tree can contain other trees or blobs. | ||||
| 
 | ||||
| 		At its core, Git is a content addressed storage tool. All files and folders are addressed by | ||||
| 		a (hardened) sha1 hash. | ||||
| 
 | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| 
 | ||||
| \begin{frame} | ||||
| \frametitle{Obligitary XKCD Comic} | ||||
| 	\frametitle{Commits} | ||||
| 	\framesubtitle{(Snapshots)} | ||||
| 	\begin{center} | ||||
| 		\includegraphics[width=\textwidth,height=0.8\textheight,keepaspectratio]{auto-xkcd-1597.png} | ||||
| 		\begin{tikzpicture} | ||||
| 		%\draw (-1.5,-1.5) rectangle (7.5,1.5); | ||||
| 		%\node at (-2.5,0) {master}; | ||||
| 		\node[commit,minimum size=2cm] at (0,0) (commit1) {Draft}; | ||||
| 		\node[commit,minimum size=2cm] at (3,0) (commit2) {Final Draft}; | ||||
| 		\node[commit,minimum size=2cm,draw=red] at (6,0) (commit3) {Final}; | ||||
| 		\draw[arrow] (commit1) -- (commit2); | ||||
| 		\draw[arrow] (commit2) -- (commit3); | ||||
| 		\node[draw,text width=1.8cm,anchor=north,align=center] at (0, -1.5) {\small \vdots\\[0.1cm] }; | ||||
| 		\node[draw,text width=1.8cm,anchor=north,align=center] at (3, -1.5) {\small \vdots\\[0.1cm] Draft }; | ||||
| 		\node[draw,text width=1.8cm,anchor=north,align=center] at (6, -1.5) {\small \vdots\\[0.1cm] Final Draft }; | ||||
| 	\end{tikzpicture} | ||||
| 	\end{center} | ||||
| 	\note{% | ||||
| 		I have done this | ||||
| 		\begin{itemize} | ||||
| 			\item We could then think of history as a linear series of snapshots. | ||||
| 			\item Each circle here represents a snapshot. | ||||
| 			\item The previous snapshot is referenced somewhere in each snapshot. | ||||
| 			\item We then just need to record the most recent version somewhere. | ||||
| 		\end{itemize} | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| 		Git has a reputation for being hard. | ||||
| \begin{frame} | ||||
| 	\frametitle{Commits} | ||||
| 	\begin{center} | ||||
| 		\begin{tikzpicture} | ||||
| 		%\draw (-1.5,-1.5) rectangle (7.5,1.5); | ||||
| 		%\node at (-2.5,0) {master}; | ||||
| 		\node[commit] at (0,0) (commit1) {93e4d3d\ldots}; | ||||
| 		\node[commit] at (3,0) (commit2) {2557962\ldots}; | ||||
| 		\node[commit,draw=red] at (6,0) (commit3) {od68560\ldots}; | ||||
| 		\draw[arrow] (commit1) -- (commit2); | ||||
| 		\draw[arrow] (commit2) -- (commit3); | ||||
| 		\node[draw,text width=1.8cm,anchor=north,align=center] at (0, -1.5) {\small \vdots\\[0.1cm] }; | ||||
| 		\node[draw,text width=1.8cm,anchor=north,align=center] at (3, -1.5) {\small \vdots\\[0.1cm] 93e4d3d\ldots }; | ||||
| 		\node[draw,text width=1.8cm,anchor=north,align=center] at (6, -1.5) {\small \vdots\\[0.1cm] 2557962\ldots }; | ||||
| 	\end{tikzpicture} | ||||
| 	\end{center} | ||||
| 	\note{% | ||||
| 		\begin{itemize} | ||||
| 			\item Rather than human readable names, Git references each snapshot (called a commit) | ||||
| 				by a cryptographic hash. Currently using a hardened sha1 but there is an effort to | ||||
| 				move to sha256. | ||||
| 			\item Similarly to the model above, each commit references the previous (except the | ||||
| 				first obviously) | ||||
| 			\item The commit also includes meta information such as the committer, a timestamp and a | ||||
| 				message. | ||||
| 			\item We will look at this in more detail a bit later. | ||||
| 		\end{itemize} | ||||
| 
 | ||||
| 		It's interface abstracts away a lot of the work, meaning it's commands can feel like magic. | ||||
| 		When it works, this is fine but unfortunately when things go wrong, you can be left - like | ||||
| 		in this comic - with no idea how to proceed. | ||||
| 
 | ||||
| 		It's interface can be confusing, there are some commands that do a lot (checkout) and there | ||||
| 		are often multiple ways to achieve something. | ||||
| 
 | ||||
| 		I think that understanding a bit about how Git works under the hood will help de-mistily it. | ||||
| 
 | ||||
| 		Git's data model is actually quite simple (beautiful even). Understanding the basics of this | ||||
| can really help. | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
|  | @ -159,7 +272,7 @@ can really help. | |||
| 		git --version | ||||
| 	\end{minted} | ||||
| 
 | ||||
| 	\href{https://gitforwindows.org/}{Git for Windows: https://gitforwindows.org/} | ||||
| 	Git for Windows: \href{https://gitforwindows.org/}{https://gitforwindows.org/} | ||||
| 
 | ||||
| 	\note{% | ||||
| 		Git is probably already installed if you are on a Linux system. However, if not, it will | ||||
|  | @ -224,226 +337,6 @@ can really help. | |||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| %\begin{frame}[fragile] | ||||
| %	\frametitle{Setting It Up} | ||||
| %	\framesubtitle{Preferences} | ||||
| % | ||||
| %	\textbf{Pick One} | ||||
| %	\begin{minted}{bash} | ||||
| %		# No colour | ||||
| %		git config --global color.ui never | ||||
| % | ||||
| %		# Auto colour | ||||
| %		git config --global color.ui auto | ||||
| % | ||||
| %		# Force colour | ||||
| %		git config --global color.ui always | ||||
| % | ||||
| %		# Overide for a command | ||||
| %		git -c color.ui=always status > ~/some-file | ||||
| % | ||||
| %	\end{minted} | ||||
| %	 | ||||
| %	\note{% | ||||
| %		On Linux systems, this is set to auto by default. Might be different on a Mac. Generally | ||||
| %		auto is probably what you want. It will be coloured unless you are piping the output to a | ||||
| %		file or another process. | ||||
| % | ||||
| %		Take note of the incorrect spelling of colour. | ||||
| % | ||||
| %		You can override all configuration options on an individual command basis if you like. | ||||
| %	} | ||||
| %\end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Terminology} | ||||
| 	\framesubtitle{Objects} | ||||
| 
 | ||||
| 	\textbf{Blob} In Git, a file is called a blob. | ||||
| 
 | ||||
| 	\textbf{Tree} In Git, a directory is called a tree. | ||||
| 
 | ||||
| 	\textbf{Commit} A snapshot of your code | ||||
| 
 | ||||
| 	% All of these are referenced by a hash and stored in the \mintinline{bash}{.git/objects/} | ||||
| 	% directory. | ||||
| 	 | ||||
| 	\note{% | ||||
| 		Technically, a blob is kind of like an inode on the file system so also represents symbolic | ||||
| 		links. | ||||
| 
 | ||||
| 		There are some other types such as submodules but I won't be addressing them in this | ||||
| 		presentation. | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Naïve Approach} | ||||
| 	\begin{columns} | ||||
| 		\begin{column}{0.5\textwidth} | ||||
| 			\dirtree{% | ||||
| 				.1 Project. | ||||
| 				.2 draft. | ||||
| 				.3 some. | ||||
| 				.3 files. | ||||
| 				.2 final-draft. | ||||
| 				.3 some. | ||||
| 				.3 files. | ||||
| 				.2 final. | ||||
| 				.3 some. | ||||
| 				.3 files. | ||||
| 				% .2 real-final. | ||||
| 				% .3 some. | ||||
| 				% .3 files. | ||||
| 				% .2 actual-real-final. | ||||
| 				% .3 some. | ||||
| 				% .3 files. | ||||
| 			} | ||||
| 		\end{column} | ||||
| 		\begin{column}{0.5\textwidth} | ||||
| 			\textbf{Pros} | ||||
| 			\begin{itemize} | ||||
| 				\item Simple | ||||
| 				\item No dependencies | ||||
| 				\item No Learning curve | ||||
| 			\end{itemize} | ||||
| 			\vspace{1em} | ||||
| 			\textbf{Cons} | ||||
| 			\begin{itemize} | ||||
| 				\item Difficult to collaborate | ||||
| 				\item Lot's of wasted disk space | ||||
| 				\item Can be difficult to work out chronological order | ||||
| 			\end{itemize} | ||||
| 		\end{column} | ||||
| 	\end{columns} | ||||
| 	\note{% | ||||
| 		I think, being honest, we have all done this. This sort of works, if you're working on | ||||
| 		something by yourself. Once you start collaborating on software, you are going to have a bad | ||||
| 		time. | ||||
| 
 | ||||
| 		However, this is a simple approach and not a million miles from what Git does internally. | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Model it} | ||||
| 	\begin{center} | ||||
| 		\begin{tikzpicture} | ||||
| 		%\draw (-1.5,-1.5) rectangle (7.5,1.5); | ||||
| 		%\node at (-2.5,0) {master}; | ||||
| 		\node[commit,minimum size=2cm] at (0,0) (commit1) {Draft}; | ||||
| 		\node[commit,minimum size=2cm] at (3,0) (commit2) {Final Draft}; | ||||
| 		\node[commit,minimum size=2cm,draw=red] at (6,0) (commit3) {Final}; | ||||
| 		\draw[arrow] (commit1) -- (commit2); | ||||
| 		\draw[arrow] (commit2) -- (commit3); | ||||
| 		\node[draw,text width=1.8cm,anchor=north,align=center] at (0, -1.5) {\small \vdots\\[0.1cm] }; | ||||
| 		\node[draw,text width=1.8cm,anchor=north,align=center] at (3, -1.5) {\small \vdots\\[0.1cm] Draft }; | ||||
| 		\node[draw,text width=1.8cm,anchor=north,align=center] at (6, -1.5) {\small \vdots\\[0.1cm] Final Draft }; | ||||
| 	\end{tikzpicture} | ||||
| 	\end{center} | ||||
| 	\note{% | ||||
| 		\begin{itemize} | ||||
| 			\item This is a simple representation of the folder structure we saw. | ||||
| 			\item Notice that so the computer knows the order, somewhere in each ``snapshot", we | ||||
| 				include a reference to the previous snapshot. | ||||
| 			\item We then just need to record the most recent version somewhere. | ||||
| 		\end{itemize} | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Commits} | ||||
| 	\begin{center} | ||||
| 		\begin{tikzpicture} | ||||
| 		%\draw (-1.5,-1.5) rectangle (7.5,1.5); | ||||
| 		%\node at (-2.5,0) {master}; | ||||
| 		\node[commit] at (0,0) (commit1) {93e4d3d\ldots}; | ||||
| 		\node[commit] at (3,0) (commit2) {2557962\ldots}; | ||||
| 		\node[commit] at (6,0) (commit3) {od68560\ldots}; | ||||
| 		\draw[arrow] (commit1) -- (commit2); | ||||
| 		\draw[arrow] (commit2) -- (commit3); | ||||
| 		\node[draw,text width=1.8cm,anchor=north,align=center] at (0, -1.5) {\small \vdots\\[0.1cm] }; | ||||
| 		\node[draw,text width=1.8cm,anchor=north,align=center] at (3, -1.5) {\small \vdots\\[0.1cm] 93e4d3d\ldots }; | ||||
| 		\node[draw,text width=1.8cm,anchor=north,align=center] at (6, -1.5) {\small \vdots\\[0.1cm] 2557962\ldots }; | ||||
| 	\end{tikzpicture} | ||||
| 	\end{center} | ||||
| 	\note{% | ||||
| 		\begin{itemize} | ||||
| 			\item Rather than human readable names, Git references each snapshot (called a commit) | ||||
| 				by a cryptographic hash. Currently using a hardened sha1 but there is an effort to | ||||
| 				move to sha256. | ||||
| 			\item Similarly to the model above, each commit references the previous (except the | ||||
| 				first obviously) | ||||
| 			\item The commit also includes meta information such as the committer, a timestamp and a | ||||
| 				message. | ||||
| 			\item We will look at this in more detail a bit later. | ||||
| 		\end{itemize} | ||||
| 
 | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Commits / Branches} | ||||
| 	\begin{center} | ||||
| 		\begin{tikzpicture} | ||||
| 			%\draw (-1.5,-1.5) rectangle (7.5,1.5); | ||||
| 			%\node at (-2.5,0) {master}; | ||||
| 			\node[commit] at (0,0) (commit1) {}; | ||||
| 			\node[commit] at (2,0) (commit2) {A}; | ||||
| 			\node[commit] at (4,0) (commit3) {B}; | ||||
| 			\node[commit] at (4,-2) (commit3b) {C}; | ||||
| 			\draw[arrow] (commit1) -- (commit2); | ||||
| 			\draw[arrow] (commit2) -- (commit3); | ||||
| 			\draw[arrow] (commit2) -- (commit3b); | ||||
| 		\end{tikzpicture} | ||||
| 	\end{center} | ||||
| 	\note{% | ||||
| 		The linear graph we just saw is an overly simplistic representation. In reality, Git | ||||
| 		represents history using a Directed acyclic graph which allows parents to be shared my | ||||
| 		multiple commits. This is useful because it allows for Branches. We will look at these a bit | ||||
| 		more later. | ||||
| 
 | ||||
| 		It is good practice to develop features on a separate branch. This allows for multiple | ||||
| 		people to work on a project as well as allowing things like bug-fixes to be deployed without | ||||
| 		having to worry about interference from a new feature. | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Commits / Branches} | ||||
| 	\begin{center} | ||||
| 		\begin{tikzpicture} | ||||
| 			%\draw (-1.5,-1.5) rectangle (7.5,1.5); | ||||
| 			%\node at (-2.5,0) {master}; | ||||
| 			\node[commit] at (0,0) (commit1) {}; | ||||
| 			\node[commit] at (2,0) (commit2) {}; | ||||
| 			\node[commit] at (5,0) (commit4) {A}; | ||||
| 			\node[commit] at (8,0) (commit5) {C}; | ||||
| 			\node[commit] at (4,-2) (commit3b) {}; | ||||
| 			\node[commit] at (6,-2) (commit4b) {B}; | ||||
| 			\draw[arrow] (commit1) -- (commit2); | ||||
| 			\draw[arrow] (commit2) -- (commit4); | ||||
| 			\draw[arrow] (commit4) -- (commit5); | ||||
| 			\draw[arrow] (commit2) -- (commit3b); | ||||
| 			\draw[arrow] (commit3b) -- (commit4b); | ||||
| 			\draw[arrow] (commit4b) -- (commit5); | ||||
| 		\end{tikzpicture} | ||||
| 	\end{center} | ||||
| 	\note{% | ||||
| 		As well as 2 commits' ability to share a parent, the opposite is also true, Here, we see | ||||
| 		that a commit is able to have multiple parents. | ||||
| 
 | ||||
| 		This is called a merge commit - because it merges two branches. In a lot of situations git | ||||
| 		is smart enough to auto-merge branches although at times human intervention is necessary. | ||||
| 
 | ||||
| 		By default, git creates a branch called Master when you create a repository. | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Create a repository} | ||||
| 	\begin{center} | ||||
|  | @ -457,6 +350,19 @@ can really help. | |||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Create a repository} | ||||
| 	\begin{center} | ||||
| 		\includegraphics[width=\textwidth,height=0.8\textheight,keepaspectratio]{auto-shell-tree-empty-git.pdf} | ||||
| 	\end{center} | ||||
| 	\note{% | ||||
| 		Do this in a live terminal. MAKE SURE YOU MAKE YOUR FONT BIGGER | ||||
| 
 | ||||
| 		Show that the \mintinline{bash}{.git} folder has been created and do a tree to show what is | ||||
| 		in it. | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame}[fragile] | ||||
| 	\frametitle{Git status} | ||||
| 	 | ||||
|  | @ -471,6 +377,31 @@ can really help. | |||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Staging Area} | ||||
| 	\begin{itemize} | ||||
| 		\item Sometimes called the git index | ||||
| 		\item An intermediate area in which you can pick files to be included in the next commit. | ||||
| 		\item Also allows you to exclude some files from your version history. | ||||
| 			\begin{itemize} | ||||
| 				\item Log files | ||||
| 				\item Binary files | ||||
| 				\item Minified files | ||||
| 			\end{itemize} | ||||
| 	\end{itemize} | ||||
| 	\note{% | ||||
| 		This is the last thing before we start actually doing stuff (promise). | ||||
| 
 | ||||
| 		This is particularly useful if you have multiple logically unrelated changes and want to | ||||
| 		make separate snapshots for each. | ||||
| 
 | ||||
| 		Also useful if when programming you write your tests along side your code, you would | ||||
| 		normally want those to be separate snapshots. | ||||
| 
 | ||||
| 		We will talk about .gitignore later which is another way of ignoring files | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| 
 | ||||
| \begin{frame}[fragile] | ||||
| 	\frametitle{Staging Area} | ||||
|  | @ -481,14 +412,6 @@ can really help. | |||
| 		git add -A | ||||
| 	\end{minted} | ||||
| 	\note{% | ||||
| 		The staging area is where you put things that you want to be committed. | ||||
| 
 | ||||
| 		It can often be useful to manually split changes up into different commits. You might be | ||||
| 		working on feature A and feature B simultaneously. It is good practice to have each feature | ||||
| 		as a separate commit so you could add feature A to the staging area, commit it, then do the | ||||
| 		same for feature B. | ||||
| 
 | ||||
| 		We will talk about \mintinline{bash}{.gitignore} in a bit. | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
|  | @ -505,11 +428,8 @@ can really help. | |||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame}[fragile] | ||||
| \begin{frame} | ||||
| 	\frametitle{Committing} | ||||
| 	\begin{minted}{bash} | ||||
| 		git commit | ||||
| 	\end{minted} | ||||
| 
 | ||||
| 	\begin{itemize} | ||||
| 		\item First line should be concise summary around 50 chars | ||||
|  | @ -537,6 +457,7 @@ can really help. | |||
| 	\framesubtitle{Commit early, commit often} | ||||
| 	\begin{itemize} | ||||
| 		\item Every time you complete a small change or fix a bug | ||||
| 		\item For each point on a detailed to-do list | ||||
| 		\item You don't normally want to commit broken code (intentionally at least) | ||||
| 		\item In some instances you might want to auto-commit - but probably not too often. | ||||
| 			\begin{itemize} | ||||
|  | @ -595,6 +516,8 @@ can really help. | |||
| 	\note{% | ||||
| 		Diff is pretty smart. It will normally work for whatever combinations of commits, references | ||||
| 		(more on that later) or files. | ||||
| 
 | ||||
| 		Change Hello to Hello World | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
|  | @ -675,6 +598,8 @@ can really help. | |||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{References} | ||||
| 		\begin{itemize} | ||||
|  | @ -685,8 +610,35 @@ can really help. | |||
| 		\end{itemize} | ||||
| 	\note{% | ||||
| 		We've seen a couple of these (sort of) | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| 		Master and Head | ||||
| \begin{frame} | ||||
| 	\frametitle{References} | ||||
| 	\begin{itemize} | ||||
| 		\item Branches | ||||
| 			\begin{itemize} | ||||
| 				\item Parallel development | ||||
| 			\end{itemize} | ||||
| 		\item Tags | ||||
| 			\begin{itemize} | ||||
| 				\item Special points in history (Release versions) | ||||
| 			\end{itemize} | ||||
| 		\item HEAD | ||||
| 			\begin{itemize} | ||||
| 				\item Current position in history | ||||
| 			\end{itemize} | ||||
| 	\end{itemize} | ||||
| 	\note{% | ||||
| 		Branches allow for parallel development, individually or multiple people. We well look at | ||||
| 		these in more detail in a minute. | ||||
| 
 | ||||
| 		Tags allow you to mark special commits. Normally this is used for release versions or | ||||
| 		similar. | ||||
| 
 | ||||
| 		HEAD refers to the commit or branch you are currently looking at. We will see in a minute | ||||
| 		that you can revert a whole project to a previous point in time. This is how git knows | ||||
| 		where (when?) you are. | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
|  | @ -716,40 +668,105 @@ can really help. | |||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{References} | ||||
| 	\framesubtitle{HEAD} | ||||
| 	\begin{itemize} | ||||
| 		\item The HEAD references is directly in the \mintinline{bash}{.git} folder. | ||||
| 		\item It refers to the ``current" commit. It is how git knows where you are. | ||||
| 		\item This normally refers to a branch's head commit. | ||||
| 		\item In some situations it will refer to a commit directly. | ||||
| 	\end{itemize} | ||||
| 	\note{% | ||||
| 		Not sure why it is not in refs folder | ||||
| 
 | ||||
| 		If it refers directly to a commit, the repository is in what is called a ``detached head" | ||||
| 		state. | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| 	 | ||||
| \begin{frame}[fragile] | ||||
| 	\frametitle{Branches} | ||||
| 
 | ||||
| 	\begin{itemize} | ||||
| 		\item By default Git will create a branch called Master (maybe?). | ||||
| 		\item Allows multiple features to be developed in parallel without interference. | ||||
| 		\item Allows multiple people to collaborate easily. | ||||
| 	\end{itemize} | ||||
| 
 | ||||
| 	\note{% | ||||
| 		So, when I originally wrote this slide, git would create a branch called master by default. | ||||
| 		The convention was that this was your "main" branch. Currently on my system it still does | ||||
| 		although there is a movement to switch the default to main or primary or something similar. | ||||
| 
 | ||||
| 		I have no intentions to make this a political talk so make of it what you want. | ||||
| 	} | ||||
| 
 | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Commits / Branches} | ||||
| 	\begin{center} | ||||
| 		\begin{tikzpicture} | ||||
| 			%\draw (-1.5,-1.5) rectangle (7.5,1.5); | ||||
| 			%\node at (-2.5,0) {master}; | ||||
| 			\node[commit] at (0,0) (commit1) {}; | ||||
| 			\node[commit] at (2,0) (commit2) {A}; | ||||
| 			\node[commit] at (4,0) (commit3) {B}; | ||||
| 			\node[commit] at (4,-2) (commit3b) {C}; | ||||
| 			\node[anchor=west] at (4.5,0.5) {+Bugfix}; | ||||
| 			\node[anchor=west] at (4.5,-2.5) {+Feature}; | ||||
| 			\draw[arrow] (commit1) -- (commit2); | ||||
| 			\draw[arrow] (commit2) -- (commit3); | ||||
| 			\draw[arrow] (commit2) -- (commit3b); | ||||
| 			\draw[draw=red] (-1,1) rectangle (6.5,-0.99); | ||||
| 			\node[fill=red,text=white,anchor=north west] at (-1,1) {Branch 1}; | ||||
| 			\draw[draw=green] (-1,-1) rectangle (6.5,-3); | ||||
| 			\node[fill=green,text=white,anchor=north west] at (-1,-1) {Branch 2}; | ||||
| 		\end{tikzpicture} | ||||
| 	\end{center} | ||||
| 	\note{% | ||||
| 		The linear graph we just saw is an overly simplistic representation. In reality, Git | ||||
| 		represents history using a Directed acyclic graph which allows parents to be shared my | ||||
| 		multiple commits. This is useful because it allows for Branches. | ||||
| 
 | ||||
| 		It is good practice to develop features on a separate branch. This allows for multiple | ||||
| 		people to work on a project as well as allowing things like bug-fixes to be deployed without | ||||
| 		having to worry about interference from a new feature. | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Commits / Branches} | ||||
| 	\begin{center} | ||||
| 		\begin{tikzpicture} | ||||
| 			%\draw (-1.5,-1.5) rectangle (7.5,1.5); | ||||
| 			%\node at (-2.5,0) {master}; | ||||
| 			\node[commit] at (0,0) (commit1) {}; | ||||
| 			\node[commit] at (2,0) (commit2) {}; | ||||
| 			\node[commit] at (5,0) (commit4) {A}; | ||||
| 			\node[commit] at (8,0) (commit5) {C}; | ||||
| 			\node[commit] at (4,-2) (commit3b) {}; | ||||
| 			\node[commit] at (6,-2) (commit4b) {B}; | ||||
| 			\node[anchor=west] at (5.5,0.5) {+Bugfix}; | ||||
| 			\node[anchor=west] at (6.5,-2.5) {+Feature}; | ||||
| 			\node[anchor=south west] at (8.7,-0.2) {\parbox{\textwidth}{+Bugfix \\ +Feature}}; | ||||
| 			\draw[arrow] (commit1) -- (commit2); | ||||
| 			\draw[arrow] (commit2) -- (commit4); | ||||
| 			\draw[arrow] (commit4) -- (commit5); | ||||
| 			\draw[arrow] (commit2) -- (commit3b); | ||||
| 			\draw[arrow] (commit3b) -- (commit4b); | ||||
| 			\draw[arrow] (commit4b) -- (commit5); | ||||
| 			\draw[draw=red] (-1,1) rectangle (10.5,-0.99); | ||||
| 			\node[fill=red,text=white,anchor=north west] at (-1,1) {Branch 1}; | ||||
| 			\draw[draw=green] (-1,-1) rectangle (10.5,-3); | ||||
| 			\node[fill=green,text=white,anchor=north west] at (-1,-1) {Branch 2}; | ||||
| 		\end{tikzpicture} | ||||
| 	\end{center} | ||||
| 	\note{% | ||||
| 		As well as 2 commits' ability to share a parent, the opposite is also true, Here, we see | ||||
| 		that a commit is able to have multiple parents. | ||||
| 
 | ||||
| 		This is called a merge commit - because it merges two branches. In a lot of situations git | ||||
| 		is smart enough to auto-merge branches although at times human intervention is necessary. | ||||
| 	} | ||||
| \end{frame} | ||||
| 	 | ||||
| \begin{frame}[fragile] | ||||
| 	\begin{minted}{bash} | ||||
| 	# List Branches | ||||
| 	git branch # -v adds more info | ||||
| 
 | ||||
| 	# Create a branch called test | ||||
| 	git branch test # or | ||||
| 	cp ~/.git/refs/heads/master ~/.git/refs/heads/test | ||||
| 
 | ||||
| 	# Switch to new branch | ||||
| 	git switch test # or | ||||
| 	git checkout test | ||||
| 
 | ||||
| 	# Create and switch in one go | ||||
| 	git switch -c test # or | ||||
| 	git checkout -b test | ||||
|  | @ -909,7 +926,6 @@ can really help. | |||
| 		\begin{itemize} | ||||
| 			\item HTTP(S) | ||||
| 			\item SSH | ||||
| 			\item GIT | ||||
| 			\item Local Filesystem | ||||
| 		\end{itemize} | ||||
| 	\end{itemize} | ||||
|  | @ -1038,45 +1054,65 @@ can really help. | |||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Useful supporting tools} | ||||
| 	\framesubtitle{Bat} | ||||
| 	\begin{center} | ||||
| 		\includegraphics[width=\textwidth,height=0.8\textheight,keepaspectratio]{auto-download-aHR0cHM6Ly9jYW1vLmdpdGh1YnVzZXJjb250ZW50LmNvbS82N2U0NGY0YTY4MTUwMzI1Zjc0YjNhNDY4MjBiNzQ3M2ZmN2I5MWE2LzY4NzQ3NDcwNzMzYTJmMmY2OTJlNjk2ZDY3NzU3MjJlNjM2ZjZkMmYzMjZjNTM1NzM0NTI0NTJlNzA2ZTY3.png} | ||||
| 	\end{center} | ||||
| 	\href{https://github.com/sharkdp/bat}{https://github.com/sharkdp/bat} | ||||
| 	\frametitle{Issues} | ||||
| 	\begin{itemize} | ||||
| 		\item Not part of Git, rather something most Git hosting providers offer. | ||||
| 		\item You can normally reference issues in commit messages using \# symbol. | ||||
| 	\end{itemize} | ||||
| 	\note{% | ||||
| 		Bat is described as cat with wings. | ||||
| 		Demonstrate this in a browser using Github | ||||
| 	} | ||||
| 	 | ||||
| 		It adds syntax highlighting to files. Useful even if you're not using Git | ||||
| \end{frame} | ||||
| 
 | ||||
| 		As this is a git talk, it shows lines that have changed since the last commit | ||||
| \begin{frame} | ||||
| 	\frametitle{Pull Requests} | ||||
| 	\framesubtitle{Merge Requests} | ||||
| 
 | ||||
| 	\begin{enumerate} | ||||
| 		\item Fork | ||||
| 		\item Clone | ||||
| 		\item Branch | ||||
| 		\item Commit | ||||
| 		\item Push | ||||
| 	\end{enumerate} | ||||
| 	 | ||||
| 	\note{% | ||||
| 		\begin{itemize} | ||||
| 			\item Not part of Git, rather something most Git hosting providers offer. | ||||
| 			\item It allows for people to contribute code to repositories that they don't have | ||||
| 				write access to | ||||
| 		\end{itemize} | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Useful supporting tools} | ||||
| 	\framesubtitle{RigGrep / Fd} | ||||
| 	\href{https://github.com/sharkdp/fd}{https://github.com/sharkdp/fd} | ||||
| 	\framesubtitle{Shell Integration} | ||||
| 	Git ships with completion for bash, zsh and tcsh. You may need to source it in the relevant rc | ||||
| 	file. | ||||
| 
 | ||||
| 	\href{https://github.com/BurntSushi/ripgrep}{https://github.com/BurntSushi/ripgrep} | ||||
| 	Prompt customisation is available out of the box for bash and zsh. | ||||
| 	\note{% | ||||
| 		Alternatives to grep and find | ||||
| 
 | ||||
| 		Fd, in particular, is not a full replacement for find but does most of what you want | ||||
| 
 | ||||
| 		Both (by default) will respect your gitignore file. | ||||
| 		If you haven't ever tried zsh, give it a shot. Tab completion is so much more useful than | ||||
| 		Bach's. | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Useful supporting tools} | ||||
| 	\framesubtitle{Delta} | ||||
| 	\begin{center} | ||||
| 		\includegraphics[width=\textwidth,height=0.6\textheight,keepaspectratio]{auto-download-aHR0cHM6Ly91c2VyLWltYWdlcy5naXRodWJ1c2VyY29udGVudC5jb20vNTIyMDUvNjUyNDg1MjUtMzIyNTA0ODAtZGFlYS0xMWU5LTk5NjUtMWEwNWM2YTRiZGY0LnBuZw==.png} | ||||
| 	\end{center} | ||||
| 	\href{https://github.com/dandavison/delta}{https://github.com/dandavison/delta}  | ||||
| 	\framesubtitle{Editor Plugin} | ||||
| 	\begin{itemize} | ||||
| 		\item Git Gutters | ||||
| 		\item Easy staging of parts of a file | ||||
| 		\item Merge Conflict Resolution | ||||
| 	\end{itemize} | ||||
| 	\note{% | ||||
| 		This is a tool that can make your diff output look better. | ||||
| 		There are obviously hundreds of editors so find one that works well with yours. | ||||
| 
 | ||||
| 		I think Atom and VS Code have built in integration.  | ||||
| 
 | ||||
| 		I use vim-fugitive. I've heard good things about magit for emacs. | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
|  | @ -1095,14 +1131,66 @@ can really help. | |||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Useful supporting tools} | ||||
| 	\framesubtitle{Shell Integration} | ||||
| 	Git ships with completion for bash, zsh and tcsh. You may need to source it in the relevant rc | ||||
| 	file. | ||||
| 	\framesubtitle{Git Crypt} | ||||
| 
 | ||||
| 	Prompt customisation is available out of the box for bash and zsh. | ||||
| 	For storing sensitive information in a git repository. | ||||
| 
 | ||||
| 	\href{https://github.com/AGWA/git-crypt}{https://github.com/AGWA/git-crypt} | ||||
| 	\note{% | ||||
| 		If you haven't ever tried zsh, give it a shot. Tab completion is so much more useful than | ||||
| 		Bash's. | ||||
| 		This will encrypt files with gpg key(s) and transparently decrypt them on the file system. | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Useful supporting tools} | ||||
| 	\framesubtitle{Git Large File Storage} | ||||
| 
 | ||||
| 	A solution to the issue of storing binary files | ||||
| 
 | ||||
| 	\href{https://git-lfs.github.com/}{https://git-lfs.github.com/} | ||||
| 	\note{% | ||||
| 		As mentioned, git is not good at storing binary files because they can't be compressed or | ||||
| 		diff-ed or merged. | ||||
| 
 | ||||
| 		This allows you to store links to large files and transparently add them to the file system | ||||
| 		as though they were normal git blobs. | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Useful supporting tools} | ||||
| 	\framesubtitle{Bat} | ||||
| 	\begin{center} | ||||
| 		\includegraphics[width=\textwidth,height=0.8\textheight,keepaspectratio]{auto-download-aHR0cHM6Ly9jYW1vLmdpdGh1YnVzZXJjb250ZW50LmNvbS82N2U0NGY0YTY4MTUwMzI1Zjc0YjNhNDY4MjBiNzQ3M2ZmN2I5MWE2LzY4NzQ3NDcwNzMzYTJmMmY2OTJlNjk2ZDY3NzU3MjJlNjM2ZjZkMmYzMjZjNTM1NzM0NTI0NTJlNzA2ZTY3.png} | ||||
| 	\end{center} | ||||
| 	\href{https://github.com/sharkdp/bat}{https://github.com/sharkdp/bat} | ||||
| 	\note{% | ||||
| 		Bat is described as cat with wings. | ||||
| 
 | ||||
| 		It adds syntax highlighting to files. Useful even if you're not using Git | ||||
| 
 | ||||
| 		As this is a git talk, it shows lines that have changed since the last commit | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Useful supporting tools} | ||||
| 	\framesubtitle{RipGrep / Fd / Exa} | ||||
| 
 | ||||
| 	\textbf{FD} replaces find | ||||
| 
 | ||||
| 	\href{https://github.com/sharkdp/fd}{https://github.com/sharkdp/fd} | ||||
| 
 | ||||
| 	\textbf{RigGrep} replaces grep | ||||
| 
 | ||||
| 	\href{https://github.com/BurntSushi/ripgrep}{https://github.com/BurntSushi/ripgrep} | ||||
| 
 | ||||
| 	\textbf{Exa} replaces ls | ||||
| 
 | ||||
| 	\href{https://github.com/ogham/exa}{https://github.com/ogham/exa} | ||||
| 	\note{% | ||||
| 
 | ||||
| 		Fd and RipGrep will respect your gitignore by default. | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
|  | @ -1147,4 +1235,16 @@ can really help. | |||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \begin{frame} | ||||
| 	\frametitle{Questions} | ||||
| 
 | ||||
| 	You can find this presentation here: | ||||
| 
 | ||||
| 	\href{https://git.jonathanh.co.uk/jab2870/Git-Presentation}{https://git.jonathanh.co.uk/jab2870/Git-Presentation} | ||||
| 
 | ||||
| 	\note{% | ||||
| 		Yes, this presentation uses git for version control | ||||
| 	} | ||||
| \end{frame} | ||||
| 
 | ||||
| \end{document} | ||||
|  |  | |||
|  | @ -1,5 +1,6 @@ | |||
| #!/usr/bin/env bash | ||||
| 
 | ||||
| cd /tmp/demo | ||||
| ( | ||||
| rm -rf /tmp/demo-remote | ||||
| mkdir -p /tmp/demo-remote | ||||
|  | @ -7,7 +8,6 @@ git init --bare /tmp/demo-remote | |||
| git remote remove origin | ||||
| ) > /dev/null 2>&1 | ||||
| 
 | ||||
| cd /tmp/demo | ||||
| echo '$ git remote add origin /tmp/demo-remote' | ||||
| git remote add origin /tmp/demo-remote | ||||
| echo '$ git remote' | ||||
|  |  | |||
|  | @ -22,5 +22,5 @@ git -c color.ui=always status | |||
| echo '$ git log --oneline --all --graph' | ||||
| git -c color.ui=always log --oneline --all --graph --decorate=short | ||||
| 
 | ||||
| echo '$ git merge' | ||||
| echo '$ git merge origin/master' | ||||
| git -c color.ui=always merge origin/master | ||||
|  |  | |||
							
								
								
									
										4
									
								
								shell/tree-empty-git
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										4
									
								
								shell/tree-empty-git
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1,4 @@ | |||
| #!/usr/bin/env bash | ||||
| echo '$ tree .git' | ||||
| cd /tmp/demo | ||||
| tree .git | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue