summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkballou <kballou@devnulllabs.io>2016-01-18 12:31:48 -0700
committerkballou <kballou@devnulllabs.io>2016-01-18 14:50:11 -0700
commitb2a2859ed6a747c248c2e9dd1bb85200785ba154 (patch)
tree1e89c6abf1c0d4c838e6b56a7b8f53a2f433d3fd
parent9941423988e575fecbfc5f2507a3dd296c60f188 (diff)
downloadgit-in-reverse-b2a2859ed6a747c248c2e9dd1bb85200785ba154.tar.gz
git-in-reverse-b2a2859ed6a747c248c2e9dd1bb85200785ba154.tar.xz
Add initial presentation
First version of git-in-reverse presentation
-rw-r--r--src/beamercolorthemesolarized.sty156
-rw-r--r--src/code/1/13
-rw-r--r--src/code/1/216
-rw-r--r--src/code/1/34
-rw-r--r--src/code/1/47
-rw-r--r--src/code/1/54
-rw-r--r--src/code/1/62
-rw-r--r--src/code/2/18
-rw-r--r--src/code/2/24
-rw-r--r--src/code/2/38
-rw-r--r--src/code/2/45
-rw-r--r--src/code/2/510
-rw-r--r--src/code/2/67
-rw-r--r--src/code/3/19
-rw-r--r--src/code/3/211
-rw-r--r--src/code/3/311
-rw-r--r--src/code/3/411
-rw-r--r--src/code/4/113
-rw-r--r--src/code/4/27
-rw-r--r--src/code/5/14
-rw-r--r--src/code/5/24
-rw-r--r--src/code/5/32
-rw-r--r--src/code/5/46
-rw-r--r--src/code/5/54
-rw-r--r--src/code/5/68
-rw-r--r--src/code/5/78
-rw-r--r--src/code/5/81
-rw-r--r--src/code/5/92
-rw-r--r--src/git-in-reverse.tex703
-rw-r--r--src/images/xkcd_git.pngbin0 -> 48767 bytes
-rw-r--r--src/references.bib23
31 files changed, 1061 insertions, 0 deletions
diff --git a/src/beamercolorthemesolarized.sty b/src/beamercolorthemesolarized.sty
new file mode 100644
index 0000000..101bee2
--- /dev/null
+++ b/src/beamercolorthemesolarized.sty
@@ -0,0 +1,156 @@
+% Beamer Color Theme using the Solarized Palette,
+% http://ethanschoonover.com/solarized.
+%
+% Copyright 2012 Jeffrey B. Arnold
+%
+% This program is free software: you can redistribute it and/or modify
+% it under the terms of the GNU General Public License as published by
+% the Free Software Foundation, either version 3 of the License, or
+% (at your option) any later version.
+%
+% This program is distributed in the hope that it will be useful,
+% but WITHOUT ANY WARRANTY; without even the implied warranty of
+% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+% GNU General Public License for more details.
+%
+% You should have received a copy of the GNU General Public License
+% along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+\ProvidesPackage{beamercolorthemesolarized}
+\RequirePackage{etoolbox}
+\RequirePackage{kvoptions}
+
+%% This is ugly. First time using options and conditionals in LaTeX
+\SetupKeyvalOptions{
+ family=solarized,
+ prefix=solarized@,
+}
+\DeclareBoolOption[false]{dark}
+\DeclareComplementaryOption{light}{dark}
+\DeclareStringOption[yellow]{accent}[yellow]
+\ProcessKeyvalOptions*
+
+% Solarized palette
+\definecolor{solarizedBase03}{HTML}{002B36}
+\definecolor{solarizedBase02}{HTML}{073642}
+\definecolor{solarizedBase01}{HTML}{586e75}
+\definecolor{solarizedBase00}{HTML}{657b83}
+\definecolor{solarizedBase0}{HTML}{839496}
+\definecolor{solarizedBase1}{HTML}{93a1a1}
+\definecolor{solarizedBase2}{HTML}{EEE8D5}
+\definecolor{solarizedBase3}{HTML}{FDF6E3}
+\definecolor{solarizedYellow}{HTML}{B58900}
+\definecolor{solarizedOrange}{HTML}{CB4B16}
+\definecolor{solarizedRed}{HTML}{DC322F}
+\definecolor{solarizedMagenta}{HTML}{D33682}
+\definecolor{solarizedViolet}{HTML}{6C71C4}
+\definecolor{solarizedBlue}{HTML}{268BD2}
+\definecolor{solarizedCyan}{HTML}{2AA198}
+\definecolor{solarizedGreen}{HTML}{859900}
+
+% Set Accent color
+% Ugly. Should be done with a switch
+\ifdefstring{\solarized@accent}{yellow}{
+ \colorlet{solarizedAccent}{solarizedYellow}
+}{}
+\ifdefstring{\solarized@accent}{orange}{
+ \colorlet{solarizedAccent}{solarizedOrange}
+}{}
+\ifdefstring{\solarized@accent}{red}{
+ \colorlet{solarizedAccent}{solarizedRed}
+}{}
+\ifdefstring{\solarized@accent}{magenta}{
+ \colorlet{solarizedAccent}{solarizedMagenta}
+}{}
+\ifdefstring{\solarized@accent}{violet}{
+ \colorlet{solarizedAccent}{solarizedViolet}
+}{}
+\ifdefstring{\solarized@accent}{blue}{
+ \colorlet{solarizedAccent}{solarizedBlue}
+}{}
+\ifdefstring{\solarized@accent}{cyan}{
+ \colorlet{solarizedAccent}{solarizedCyan}
+}{}
+\ifdefstring{\solarized@accent}{green}{
+ \colorlet{solarizedAccent}{solarizedGreen}
+}{}
+
+%% Set base colors for dark or light versions
+%% Dark
+% Switch between light and dark themes using the method in the CSS
+% stylesheet http://ethanschoonover.com/solarized
+\ifboolexpe{ bool {solarized@dark}}{
+ \colorlet{solarizedRebase03}{solarizedBase03}
+ \colorlet{solarizedRebase02}{solarizedBase02}
+ \colorlet{solarizedRebase01}{solarizedBase01}
+ \colorlet{solarizedRebase00}{solarizedBase00}
+ \colorlet{solarizedRebase0}{solarizedBase0}
+ \colorlet{solarizedRebase1}{solarizedBase1}
+ \colorlet{solarizedRebase2}{solarizedBase2}
+ \colorlet{solarizedRebase3}{solarizedBase3}
+}{
+ %% Light
+ \colorlet{solarizedRebase03}{solarizedBase3}
+ \colorlet{solarizedRebase02}{solarizedBase2}
+ \colorlet{solarizedRebase01}{solarizedBase1}
+ \colorlet{solarizedRebase00}{solarizedBase0}
+ \colorlet{solarizedRebase0}{solarizedBase00}
+ \colorlet{solarizedRebase1}{solarizedBase01}
+ \colorlet{solarizedRebase2}{solarizedBase02}
+ \colorlet{solarizedRebase3}{solarizedBase03}
+}
+
+\mode<presentation>
+
+\setbeamercolor{normal text}{fg=solarizedRebase0, bg=solarizedRebase03}
+\setbeamercolor{alerted text}{fg=solarizedAccent}
+% based css pre element
+\setbeamercolor{example text}{fg=solarizedRebase1, bg=solarizedRebase02}
+
+% Header and footer from CSS
+\setbeamercolor{footline}{bg=solarizedRebase02,fg=solarizedRebase01}
+\setbeamercolor{headline}{bg=solarizedRebase01,fg=solarizedRebase1}
+
+% Titles
+\setbeamercolor*{titlelike}{fg=solarizedAccent}
+\setbeamercolor*{frametitle}{fg=solarizedAccent}
+\setbeamercolor*{title}{fg=solarizedAccent}
+
+% Structure elements use css style for header
+\setbeamercolor*{structure}{bg=solarizedRebase01, fg=solarizedRebase1}
+
+% Do not mess with subtle colors in palette. I don't like it.
+\setbeamercolor*{palette primary}{bg=solarizedRebase01, fg=solarizedRebase1}
+\setbeamercolor*{palette secondary}{bg=solarizedRebase01, fg=solarizedRebase1}
+\setbeamercolor*{palette tertiary}{bg=solarizedRebase01, fg=solarizedRebase1}
+\setbeamercolor*{palette quaternary}{bg=solarizedRebase01, fg=solarizedRebase1}
+
+% Make Blocks slightly lighter/darker
+\setbeamercolor{block title}{fg=solarizedAccent, bg=solarizedRebase02}
+%\setbeamercolor{block title alerted}{}
+%\setbeamercolor{block title example}{}
+
+\setbeamercolor{block body}{parent=normal text, bg=solarizedRebase02}
+% \setbeamercolor{block body alerted}{}
+% \setbeamercolor{block body example}{}
+
+% same as footline
+% Set Sidebar and footline to use the css style for footer
+\setbeamercolor*{sidebar}{parent=headline}
+\setbeamercolor*{palette sidebar primary}{fg=solarizedRebase01, fg=solarizedRebase1}
+\setbeamercolor*{palette sidebar secondary}{fg=solarizedRebase01, fg=solarizedRebase1}
+\setbeamercolor*{palette sidebar tertiary}{fg=solarizedRebase01, fg=solarizedRebase1}
+\setbeamercolor*{palette sidebar quaternary}{fg=solarizedRebase01, fg=solarizedRebase1}
+
+% border-color for headings
+\setbeamercolor{separation line}{fg=solarizedRebase0}
+\setbeamercolor{fine separation line}{fg=solarizedRebase0}
+
+\setbeamercolor*{section in sidebar shaded}{parent=palette sidebar primary}
+% a.hover.navlink in CSS
+\setbeamercolor*{section in sidebar}{parent=palette sidebar primary, fg=solarizedRooebase02}
+\setbeamercolor*{subsection in sidebar}{parent=section in sidebar}
+\setbeamercolor*{subsection in sidebar shaded}{parent=section in sidebar shaded}
+
+\mode
+<all>
diff --git a/src/code/1/1 b/src/code/1/1
new file mode 100644
index 0000000..54c8e5f
--- /dev/null
+++ b/src/code/1/1
@@ -0,0 +1,3 @@
+cd /tmp
+git init foo
+cd foo
diff --git a/src/code/1/2 b/src/code/1/2
new file mode 100644
index 0000000..b10fd83
--- /dev/null
+++ b/src/code/1/2
@@ -0,0 +1,16 @@
+± find .git
+.git
+.git/objects
+.git/objects/info
+.git/objects/pack
+.git/config
+.git/HEAD
+.git/hooks
+.git/hooks/post-checkout
+.git/hooks/post-commit
+.git/hooks/ctags
+.git/hooks/post-merge
+.git/hooks/post-rewrite
+.git/refs
+.git/refs/tags
+.git/refs/heads
diff --git a/src/code/1/3 b/src/code/1/3
new file mode 100644
index 0000000..bcd66a8
--- /dev/null
+++ b/src/code/1/3
@@ -0,0 +1,4 @@
+± echo 'foo' | git hash-object --stdin
+257cc5642cb1a054f08cc83f2d943e56fd3ebe99
+± echo 'bar' | git hash-object --stdin
+5716ca5987cbf97d6bb54920bea6adde242d87e6
diff --git a/src/code/1/4 b/src/code/1/4
new file mode 100644
index 0000000..e76c383
--- /dev/null
+++ b/src/code/1/4
@@ -0,0 +1,7 @@
+± echo 'foo' | git hash-object -w --stdin
+257cc5642cb1a054f08cc83f2d943e56fd3ebe99
+± echo 'bar' | git hash-object -w --stdin
+5716ca5987cbf97d6bb54920bea6adde242d87e6
+± find .git/objects -type f
+.git/objects/57/16ca5987cbf97d6bb54920bea6adde242d87e6
+.git/objects/25/7cc5642cb1a054f08cc83f2d943e56fd3ebe99
diff --git a/src/code/1/5 b/src/code/1/5
new file mode 100644
index 0000000..9c9dc4a
--- /dev/null
+++ b/src/code/1/5
@@ -0,0 +1,4 @@
+± git cat-file -p 257cc5642cb1a054f08cc83f2d943e56fd3ebe99
+foo
+± git cat-file -p 5716ca5987cbf97d6bb54920bea6adde242d87e6
+bar
diff --git a/src/code/1/6 b/src/code/1/6
new file mode 100644
index 0000000..c62ede5
--- /dev/null
+++ b/src/code/1/6
@@ -0,0 +1,2 @@
+± cat .git/objects/25/7cc5642cb1a054f08cc83f2d943e56fd3ebe99 | zlib-flate -uncompress
+blob 4foo
diff --git a/src/code/2/1 b/src/code/2/1
new file mode 100644
index 0000000..ee69d5a
--- /dev/null
+++ b/src/code/2/1
@@ -0,0 +1,8 @@
+± git update-index --add --cacheinfo 100644 \
+ 257cc5642cb1a054f08cc83f2d943e56fd3ebe99 foo.txt
+± git write-tree
+fcf0be4d7e45f0ef9592682ad68e42270b0366b4
+± git cat-file -p fcf0be4d7e45f0ef9592682ad68e42270b0366b4
+100644 blob 257cc5642cb1a054f08cc83f2d943e56fd3ebe99 foo.txt
+± git cat-file -t fcf0be4d7e45f0ef9592682ad68e42270b0366b4
+tree
diff --git a/src/code/2/2 b/src/code/2/2
new file mode 100644
index 0000000..6b0d0f5
--- /dev/null
+++ b/src/code/2/2
@@ -0,0 +1,4 @@
+± find .git/objects -type f
+.git/objects/fc/f0be4d7e45f0ef9592682ad68e42270b0366b4
+.git/objects/57/16ca5987cbf97d6bb54920bea6adde242d87e6
+.git/objects/25/7cc5642cb1a054f08cc83f2d943e56fd3ebe99
diff --git a/src/code/2/3 b/src/code/2/3
new file mode 100644
index 0000000..235fc3a
--- /dev/null
+++ b/src/code/2/3
@@ -0,0 +1,8 @@
+± git update-index
+± git update-index --add --cacheinfo 100644 \
+ 5716ca5987cbf97d6bb54920bea6adde242d87e6 bar.txt
+± git write-tree
+b98c9a9f9501ddcfcbe02a9de52964ed7dd76d5a
+± git cat-file -p b98c9a9f9501ddcfcbe02a9de52964ed7dd76d5a
+100644 blob 5716ca5987cbf97d6bb54920bea6adde242d87e6 bar.txt
+100644 blob 257cc5642cb1a054f08cc83f2d943e56fd3ebe99 foo.txt
diff --git a/src/code/2/4 b/src/code/2/4
new file mode 100644
index 0000000..73eed8e
--- /dev/null
+++ b/src/code/2/4
@@ -0,0 +1,5 @@
+± find .git/objects -type f
+.git/objects/b9/8c9a9f9501ddcfcbe02a9de52964ed7dd76d5a
+.git/objects/fc/f0be4d7e45f0ef9592682ad68e42270b0366b4
+.git/objects/57/16ca5987cbf97d6bb54920bea6adde242d87e6
+.git/objects/25/7cc5642cb1a054f08cc83f2d943e56fd3ebe99
diff --git a/src/code/2/5 b/src/code/2/5
new file mode 100644
index 0000000..08da386
--- /dev/null
+++ b/src/code/2/5
@@ -0,0 +1,10 @@
+± echo 'foo 2' > foo.txt
+± git hash-object -w foo.txt
+a3f555b643cbba18c0e69c82d8820c7487cebe15
+± git update-index
+± git update-index --add foo.txt
+± git write-tree
+68b757546e08c1d9033c8802e4de1c0d591d90c8
+± git cat-file -p 68b757546e08c1d9033c8802e4de1c0d591d90c8
+100644 blob 5716ca5987cbf97d6bb54920bea6adde242d87e6 bar.txt
+100644 blob a3f555b643cbba18c0e69c82d8820c7487cebe15 foo.txt
diff --git a/src/code/2/6 b/src/code/2/6
new file mode 100644
index 0000000..1e40f5f
--- /dev/null
+++ b/src/code/2/6
@@ -0,0 +1,7 @@
+± find .git/objects -type f
+.git/objects/68/b757546e08c1d9033c8802e4de1c0d591d90c8
+.git/objects/a3/f555b643cbba18c0e69c82d8820c7487cebe15
+.git/objects/b9/8c9a9f9501ddcfcbe02a9de52964ed7dd76d5a
+.git/objects/fc/f0be4d7e45f0ef9592682ad68e42270b0366b4
+.git/objects/57/16ca5987cbf97d6bb54920bea6adde242d87e6
+.git/objects/25/7cc5642cb1a054f08cc83f2d943e56fd3ebe99
diff --git a/src/code/3/1 b/src/code/3/1
new file mode 100644
index 0000000..26f6915
--- /dev/null
+++ b/src/code/3/1
@@ -0,0 +1,9 @@
+± echo 'our first commit' | git commit-tree \
+ fcf0be4d7e45f0ef9592682ad68e42270b0366b4
+a619a045a5220ad975ee244140ec8f2a92a5a5ca
+± git cat-file -p a619a045a5220ad975ee244140ec8f2a92a5a5ca
+tree fcf0be4d7e45f0ef9592682ad68e42270b0366b4
+author kballou <kballou@devnulllabs.io> 1452897824 -0700
+committer kballou <kballou@devnulllabs.io> 1452897824 -0700
+
+our first commit
diff --git a/src/code/3/2 b/src/code/3/2
new file mode 100644
index 0000000..8c7159f
--- /dev/null
+++ b/src/code/3/2
@@ -0,0 +1,11 @@
+± echo 'our second commit' | git commit-tree \
+ -p a619a045a5220ad975ee244140ec8f2a92a5a5ca \
+ b98c9a9f9501ddcfcbe02a9de52964ed7dd76d5a
+2de9adf2b64be21358265a9fd61f70b87a200c20
+± git cat-file -p 2de9adf2b64be21358265a9fd61f70b87a200c20
+tree b98c9a9f9501ddcfcbe02a9de52964ed7dd76d5a
+parent a619a045a5220ad975ee244140ec8f2a92a5a5ca
+author kballou <kballou@devnulllabs.io> 1452898023 -0700
+committer kballou <kballou@devnulllabs.io> 1452898023 -0700
+
+our second commit
diff --git a/src/code/3/3 b/src/code/3/3
new file mode 100644
index 0000000..6953399
--- /dev/null
+++ b/src/code/3/3
@@ -0,0 +1,11 @@
+± echo 'our third commit' | git commit-tree \
+ -p 2de9adf2b64be21358265a9fd61f70b87a200c20 \
+ 68b757546e08c1d9033c8802e4de1c0d591d90c8
+e0ea04248e16ffffd8a5cd1ba61bdf28a6e23be9
+± git cat-file -p e0ea04248e16ffffd8a5cd1ba61bdf28a6e23be9
+tree 68b757546e08c1d9033c8802e4de1c0d591d90c8
+parent 2de9adf2b64be21358265a9fd61f70b87a200c20
+author kballou <kballou@devnulllabs.io> 1452898092 -0700
+committer kballou <kballou@devnulllabs.io> 1452898092 -0700
+
+our third commit
diff --git a/src/code/3/4 b/src/code/3/4
new file mode 100644
index 0000000..bb62aa7
--- /dev/null
+++ b/src/code/3/4
@@ -0,0 +1,11 @@
+± git log --stat --oneline e0ea04248
+
+e0ea042 our third commit
+ foo.txt | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+2de9adf our second commit
+ bar.txt | 1 +
+ 1 file changed, 1 insertion(+)
+a619a04 our first commit
+ foo.txt | 1 +
+ 1 file changed, 1 insertion(+)
diff --git a/src/code/4/1 b/src/code/4/1
new file mode 100644
index 0000000..d50fd8c
--- /dev/null
+++ b/src/code/4/1
@@ -0,0 +1,13 @@
+± cd /tmp; git init bar; cd /tmp/bar
+± echo bar > bar.txt
+± git add bar.txt
+± git status
+On branch master
+
+Initial commit
+
+Changes to be committed:
+ (use "git rm --cached <file>..." to unstage)
+
+ new file: bar.txt
+
diff --git a/src/code/4/2 b/src/code/4/2
new file mode 100644
index 0000000..ee6c3d6
--- /dev/null
+++ b/src/code/4/2
@@ -0,0 +1,7 @@
+± git commit -m "Initial commit"
+[master (root-commit) 8cbc334] Initial commit
+ 1 file changed, 1 insertion(+)
+ create mode 100644 bar.txt
+± git status
+On branch master
+nothing to commit, working directory clean
diff --git a/src/code/5/1 b/src/code/5/1
new file mode 100644
index 0000000..bc448e3
--- /dev/null
+++ b/src/code/5/1
@@ -0,0 +1,4 @@
+± find .git/refs -type f
+.git/refs/heads/master
+± cat .git/refs/heads/master
+8cbc33461c800c20acea3b055886f8bed21c2092
diff --git a/src/code/5/2 b/src/code/5/2
new file mode 100644
index 0000000..c75fcee
--- /dev/null
+++ b/src/code/5/2
@@ -0,0 +1,4 @@
+± git branch my_new_branch
+± find .git/refs -type f
+.git/refs/heads/my_new_branch
+.git/refs/heads/master
diff --git a/src/code/5/3 b/src/code/5/3
new file mode 100644
index 0000000..4855e46
--- /dev/null
+++ b/src/code/5/3
@@ -0,0 +1,2 @@
+± git checkout my_new_branch
+Switched to branch 'my_new_branch'
diff --git a/src/code/5/4 b/src/code/5/4
new file mode 100644
index 0000000..63d3082
--- /dev/null
+++ b/src/code/5/4
@@ -0,0 +1,6 @@
+± git checkout -b my_other_branch master
+Switched to a new branch 'my_other_branch'
+± find .git/refs -type f
+.git/refs/heads/my_other_branch
+.git/refs/heads/my_new_branch
+.git/refs/heads/master
diff --git a/src/code/5/5 b/src/code/5/5
new file mode 100644
index 0000000..ea2ba88
--- /dev/null
+++ b/src/code/5/5
@@ -0,0 +1,4 @@
+± find .git/refs -type f -exec cat {} \;
+8cbc33461c800c20acea3b055886f8bed21c2092
+8cbc33461c800c20acea3b055886f8bed21c2092
+8cbc33461c800c20acea3b055886f8bed21c2092
diff --git a/src/code/5/6 b/src/code/5/6
new file mode 100644
index 0000000..1471c75
--- /dev/null
+++ b/src/code/5/6
@@ -0,0 +1,8 @@
+± git branch
+my_other_branch
+± echo 'foo' > foo.txt
+± git add foo.txt
+± git commit -m 'add foo.txt'
+[my_other_branch 3a8b37d] add foo.txt
+ 1 file changed, 1 insertion(+)
+ create mode 100644 foo.txt
diff --git a/src/code/5/7 b/src/code/5/7
new file mode 100644
index 0000000..dedcb36
--- /dev/null
+++ b/src/code/5/7
@@ -0,0 +1,8 @@
+± find .git/refs -type -f
+.git/refs/heads/my_other_branch
+.git/refs/heads/my_new_branch
+.git/refs/heads/master
+± find .git/refs -type -f -exec cat {} \;
+3a8b37dc0f79859b5b58f5cb0a859d4ddd0f99a0
+8cbc33461c800c20acea3b055886f8bed21c2092
+8cbc33461c800c20acea3b055886f8bed21c2092
diff --git a/src/code/5/8 b/src/code/5/8
new file mode 100644
index 0000000..43af277
--- /dev/null
+++ b/src/code/5/8
@@ -0,0 +1 @@
+± git remote add origin ssh://remote_host/project_path
diff --git a/src/code/5/9 b/src/code/5/9
new file mode 100644
index 0000000..ddc2875
--- /dev/null
+++ b/src/code/5/9
@@ -0,0 +1,2 @@
+[alias]
+ up = !git remote update -p
diff --git a/src/git-in-reverse.tex b/src/git-in-reverse.tex
new file mode 100644
index 0000000..5bf33d1
--- /dev/null
+++ b/src/git-in-reverse.tex
@@ -0,0 +1,703 @@
+\documentclass{beamer}
+\usetheme{Berlin}
+\usecolortheme[light,accent=blue]{solarized}
+\usepackage{fontspec}
+\usepackage{xunicode}
+\usepackage{xltxtra}
+\setmainfont{DejaVuSans}
+\usepackage{booktabs}
+\usepackage{lmodern}
+\usepackage{listings}
+\usepackage{color}
+\usepackage{tikz}
+\usetikzlibrary{trees, shapes.misc, arrows}
+\usepackage{pgfkeys}
+\usepackage{graphicx}
+\graphicspath{{./images/}}
+\setbeamertemplate{headline}{}
+
+\lstset{%
+ basicstyle=\footnotesize\ttfamily,
+ breakatwhitespace=false,
+ breaklines=true,
+ captionpos=b,
+ frame=signle,
+ keepspaces=true,
+ columns=flexible,
+ language=Java,
+ numbers=left,
+ numbersep=5pt,
+ numberstyle=\tiny\color{solarizedBase00},
+ showspaces=false,
+ showstringspaces=false,
+ stepnumber=1,
+ showtabs=false,
+ stringstyle=\color{solarizedMagenta},
+ keywordstyle=\color{solarizedCyan},
+ commentstyle=\color{solarizedGreen},
+ tabsize=2
+}
+
+\title{Learning Git± in Reverse}
+\subtitle{A Backwards Introduction to the ``information manager from hell''
+[e83c51633]}
+\author[Ballou]{Kenny Ballou}
+\institute[zData]{%
+ \inst{}%
+ zData, Inc.
+}
+
+\AtBeginSection[]{%
+ \begin{frame}
+ \tableofcontents[
+ currentsection,
+ sectionstyle=show/shaded,
+ subsectionstyle=show/show/hide]
+ \end{frame}
+}
+
+\begin{document}
+% TikZ Styles
+\tikzstyle{every node}=[%
+ fill=solarizedBase02,
+ draw=solarizedBase01,
+ thick,
+ rounded corners,
+ anchor=north,
+ sibling distance=6cm]
+\tikzstyle{edge from parent}=[%
+ solarizedBase00,
+ -o,
+ thick,
+ draw]
+
+%\tikzstyle{edge from parent path}=[%
+% \tikzparentnode.east |- \tikzchildnode.south]
+
+\begin{frame}[label=titleslide]
+\titlepage{}
+\end{frame}
+
+\begin{frame}
+\tableofcontents[subsectionstyle=hide]
+\end{frame}
+
+\begin{frame}
+\frametitle{Who am I?}
+\begin{itemize}
+\item{Hacker}
+\item{Developer (read gardener)}
+\item{Mathematician}
+\item{Student}
+\end{itemize}
+
+\end{frame}
+
+\section{Introduction}
+
+\begin{frame}
+\begin{figure}
+\includegraphics[scale=0.45]{xkcd_git.png}
+\caption{XKCD on Git\cite{website:xkcd_git_comic}}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git±}
+\framesubtitle{What is Git?}
+\begin{itemize}
+\item<2->{Distributed Versioning Control system (D-VCS)}
+\item<3->{``A way to manage code''}
+\item<4->{``My preferred VCS tool''}
+\item<5->{The ``information manager from hell''}
+\item<6->{A distributed DAG}
+\item<7->{An object store}
+\item<8->{An content addressable filesystem}
+\item<9->{A key-value store}
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git±}
+What does Git store?
+\begin{itemize}
+\item<2->{Objects}
+\item<3->{``Packs''}
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git Definitions}
+\begin{itemize}
+\item{Objects}
+\item{Trees}
+\item{Commits}
+\end{itemize}
+\end{frame}
+
+\section{Plumbing}
+\subsection{Blobs}
+\begin{frame}
+\frametitle{Git Objects}
+\begin{itemize}
+\item{ZLIB compressed blob}
+\item{Dumb containers, storing provided content}
+\item{Created using the \texttt{git-hash-object} plumbing command}
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git Objects}
+\begin{figure}
+\begin{tikzpicture}
+ \node[text=solarizedBlue] at (0, 0) {257cc5642}
+ child{node[text=solarizedGreen] {foo}};
+ \node[text=solarizedBlue] at (3, 0) {5716ca598}
+ child{node[text=solarizedGreen] {bar}};
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{\texttt{git-init}}
+\lstinputlisting[language=bash,numbers=none]{code/1/1}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Results of \texttt{git-init}}
+\lstinputlisting[language=bash,numbers=none]{code/1/2}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{\texttt{git-hash-object}}
+\lstinputlisting[language=bash,numbers=none]{code/1/3}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{\texttt{git-hash-object}}
+\lstinputlisting[language=bash,numbers=none]{code/1/4}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{\texttt{git-cat-file}}
+\lstinputlisting[language=bash,numbers=none]{code/1/5}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Raw Access to Git Objects}
+\lstinputlisting[language=bash,numbers=none]{code/1/6}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git Object Limitations}
+\begin{itemize}
+\item{Remembering 40 character SHA's is hard}
+\item{What about file names? Where did that go?}
+\item{Big files?}
+\end{itemize}
+\end{frame}
+
+\subsection{Trees}
+
+\begin{frame}
+\frametitle{Git Trees}
+\begin{itemize}
+\item{ZLIB compressed blobs}
+\item{Contain references to files and other trees}
+\item{Created using the \texttt{git-update-index} and \texttt{git-write-tree}}
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git Trees}
+\begin{figure}
+\begin{tikzpicture}[sibling distance=3cm]
+ \node[text=solarizedMagenta]{./}
+ child{node[text=solarizedBlue] {blob}
+ child {node[text=solarizedGreen] {foo}}}
+ child{node[text=solarizedBlue] {blob}
+ child {node[text=solarizedGreen] {bar}}};
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{\texttt{git-update-index} and \texttt{git-write-tree}}
+\lstinputlisting[language=bash,numbers=none]{code/2/1}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Current Git Objects}
+\lstinputlisting[language=bash,numbers=none]{code/2/2}
+\end{frame}
+
+\begin{frame}
+\frametitle{Current Git Objects}
+\begin{figure}
+\begin{tikzpicture}[sibling distance=3cm]
+ \node[text=solarizedMagenta] at (0, 0) {fcf0be4d7}
+ child{node[text=solarizedBlue] {257cc5642}
+ child{node[text=solarizedGreen]{foo}}};
+ \node[text=solarizedBlue] at (3, -1) {5716ca598} child [missing] {};
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Adding \texttt{bar.txt}}
+\lstinputlisting[language=bash,numbers=none]{code/2/3}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Git Objects}
+\lstinputlisting[language=bash,numbers=none]{code/2/4}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git Objects, Updated}
+\begin{figure}
+\begin{tikzpicture}[sibling distance=3cm]
+ \node[text=solarizedMagenta] at (0, 0) {b98c9a9f}
+ child{node[text=solarizedBlue] {257cc5642}
+ child{node[text=solarizedGreen]{foo}}}
+ child{node[text=solarizedBlue] {5716ca598}
+ child{node[text=solarizedGreen] {bar}}};
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Modifying Files}
+\lstinputlisting[language=bash,numbers=none]{code/2/5}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git Objects, Updated}
+\begin{figure}
+\begin{tikzpicture}[sibling distance=3cm]
+ \node[text=solarizedMagenta] at (0, 0) {68b75754}
+ child{node[text=solarizedBlue] {a3f555b64}
+ child{node[text=solarizedGreen]{foo 2}}}
+ child{node[text=solarizedBlue] {5716ca598}
+ child{node[text=solarizedGreen] {bar}}};
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Modifying Files}
+\framesubtitle{Current Objects}
+\lstinputlisting[language=bash,numbers=none]{code/2/6}
+\end{frame}
+
+\begin{frame}
+\frametitle{Modifying Files}
+\framesubtitle{Current Objects}
+\begin{figure}
+\begin{tikzpicture}[sibling distance=3cm]
+ \node[text=solarizedMagenta] at (0, 0) {68b75754}
+ child{node[text=solarizedBlue] {a3f555b64}
+ child{node[text=solarizedGreen]{foo 2}}}
+ child{node[text=solarizedBlue] {5716ca598}
+ child{node[text=solarizedGreen] {bar}}};
+ \node[text=solarizedMagenta] at (5, 0) {b98c9a9f}
+ child{node[text=solarizedBlue] {257cc5642}
+ child{node[text=solarizedGreen]{foo}}}
+ child{node[text=solarizedBlue] {5716ca598}
+ child{node[text=solarizedGreen] {bar}}};
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Modifying Files}
+\framesubtitle{Current Objects}
+\begin{figure}
+\begin{tikzpicture}[sibling distance=3cm]
+ \node at (0, 0) {Current Tree}
+ child{node[text=solarizedMagenta] {68b75754}
+ child{node[text=solarizedBlue] {a3f555b64}
+ child{node[text=solarizedGreen]{foo 2}}}
+ child{node[text=solarizedBlue] {5716ca598}
+ child{node[text=solarizedGreen] {bar}}}};
+ \node at (5, 0) {Old Tree}
+ child{node[text=solarizedMagenta] {b98c9a9f}
+ child{node[text=solarizedBlue] {257cc5642}
+ child{node[text=solarizedGreen]{foo}}}
+ child{node[text=solarizedBlue] {5716ca598}
+ child{node[text=solarizedGreen] {bar}}}};
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Current Objects}
+\framesubtitle{The Beginnings of a DAG}
+\begin{figure}
+\begin{tikzpicture}[sibling distance=3cm]
+ \node at (0, 0) {Current Tree}
+ child{node[text=solarizedMagenta] {68b75754}
+ child{node[text=solarizedBlue] {a3f555b64}
+ child{node[text=solarizedGreen]{foo 2}}}
+ child{node[text=solarizedBlue,dashed] {5716ca598}
+ child{node[text=solarizedGreen,dashed] {bar}}}};
+ \node at (5, 0) {Old Tree}
+ child{node[text=solarizedMagenta] {b98c9a9f}
+ child{node[text=solarizedBlue] {5716ca598}
+ child{node[text=solarizedGreen] {bar}}}
+ child{node[text=solarizedBlue] {257cc5642}
+ child{node[text=solarizedGreen]{foo}}}};
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Limitation of Git± Trees}
+\begin{itemize}
+\item{Remembering SHA's is \textit{still} hard}
+\item{No metadata about the who, when, and why}
+\end{itemize}
+\end{frame}
+
+\subsection{Commits}
+
+\begin{frame}
+\frametitle{Git± Commit Objects}
+\begin{itemize}
+\item{ZLIB compressed blob}
+\item{Stores metadata about changes}
+\item{Stores a reference to the tree being saved}
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{\texttt{git-commit-tree}}
+\lstinputlisting[language=bash,numbers=none]{code/3/1}
+\end{frame}
+
+\begin{frame}
+\frametitle{\texttt{git-commit-tree}}
+\begin{figure}
+\begin{tikzpicture}
+ \node[text=solarizedCyan] {a619a045a}
+ child{node[text=solarizedMagenta] {fcf0be4d7}
+ child{node[text=solarizedBlue] {257cc5642}
+ child{node[text=solarizedGreen]{foo}}}};
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{\texttt{git-commit-tree}}
+\lstinputlisting[language=bash,numbers=none]{code/3/2}
+\end{frame}
+
+\begin{frame}
+\frametitle{\texttt{git-commit-tree}}
+\begin{figure}
+\begin{tikzpicture}[sibling distance=3cm]
+ \node[text=solarizedCyan] {2de9adf2b}
+ child{node[text=solarizedCyan] {a619a045a}}
+ child{node[text=solarizedMagenta] {b98c9a9f9}
+ child{node[text=solarizedBlue] {5716ca598}
+ child{node[text=solarizedGreen] {bar}}}
+ child{node[text=solarizedBlue] {257cc5642}
+ child{node[text=solarizedGreen]{foo}}}};
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{\texttt{git-commit-tree}}
+\lstinputlisting[language=bash,numbers=none]{code/3/3}
+\end{frame}
+
+\begin{frame}
+\frametitle{\texttt{git-commit-tree}}
+\begin{figure}
+\begin{tikzpicture}[sibling distance=3cm]
+ \node[text=solarizedCyan] {e0ea04248}
+ child{node[text=solarizedCyan] {2de9adf2b}}
+ child{node[text=solarizedMagenta] {68b757546}
+ child{node[text=solarizedBlue] {5716ca598}
+ child{node[text=solarizedGreen] {bar}}}
+ child{node[text=solarizedBlue] {a3f555b64}
+ child{node[text=solarizedGreen]{foo 2}}}};
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Git± History}
+\lstinputlisting[language=bash,numbers=none]{code/3/4}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git± Thus Far}
+\begin{figure}
+\begin{tikzpicture}
+ \node[text=solarizedBlue] (foo) at (10, -10) {foo};
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git± Thus Far}
+\begin{figure}
+\begin{tikzpicture}
+ \node[text=solarizedBlue] (foo) at (10, -10) {foo};
+ \node[text=solarizedBlue] (hfoo) at (10, -8) {257cc564};
+ \draw[-o] (hfoo) -- (foo);
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git± Thus Far}
+\begin{figure}
+\begin{tikzpicture}
+ \node[text=solarizedBlue] (foo) at (10, -10) {foo};
+ \node[text=solarizedBlue] (hfoo) at (10, -8) {257cc564};
+ \node[text=solarizedMagenta] (tree1) at (9, -6) {fcf0be4d};
+ \draw[-o] (hfoo) -- (foo);
+ \draw[-o] (tree1) -- (hfoo);
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git± Thus Far}
+\begin{figure}
+\begin{tikzpicture}
+ \node[text=solarizedBlue] (foo) at (10, -10) {foo};
+ \node[text=solarizedBlue] (hfoo) at (10, -8) {257cc564};
+ \node[text=solarizedMagenta] (tree1) at (9, -6) {fcf0be4d};
+ \node[text=solarizedCyan] (commit1) at (5, -6) {a619a045a};
+ \draw[-o] (hfoo) -- (foo);
+ \draw[-o] (tree1) -- (hfoo);
+ \draw[-o] (commit1) -- (tree1);
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git± Thus Far}
+\begin{figure}
+\begin{tikzpicture}
+ \node[dashed,text=solarizedBlue] (foo) at (10, -10) {foo};
+ \node[text=solarizedBlue] (bar) at (8, -10) {bar};
+ \node[dashed,text=solarizedBlue] (hfoo) at (10, -8) {257cc564};
+ \node[text=solarizedBlue] (hbar) at (8, -8) {5716ca59};
+ \node[text=solarizedMagenta] (tree1) at (9, -6) {fcf0be4d};
+ \node[text=solarizedCyan] (commit1) at (5, -6) {a619a045a5};
+ \draw[-o] (hfoo) -- (foo);
+ \draw[-o] (hbar) -- (bar);
+ \draw[-o] (tree1) -- (hfoo);
+ \draw[-o] (commit1) -- (tree1);
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git± Thus Far}
+\begin{figure}
+\begin{tikzpicture}
+ \node[dashed,text=solarizedBlue] (foo) at (10, -10) {foo};
+ \node[text=solarizedBlue] (bar) at (8, -10) {bar};
+ \node[dashed,text=solarizedBlue] (hfoo) at (10, -8) {257cc564};
+ \node[text=solarizedBlue] (hbar) at (8, -8) {5716ca59};
+ \node[text=solarizedMagenta] (tree2) at (9, -6) {b98c9a9f9};
+ \node[text=solarizedCyan] (commit2) at (5, -6) {2de9adf2b};
+ \node[text=solarizedCyan] (commit1) at (5, -8) {a619a045a5};
+ \draw[-o] (hfoo) -- (foo);
+ \draw[-o] (hbar) -- (bar);
+ \draw[-o] (tree2) -- (hfoo);
+ \draw[-o] (tree2) -- (hbar);
+ \draw[-o] (commit2) -- (tree2);
+ \draw[-o] (commit2) -- (commit1);
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git± Thus Far}
+\begin{figure}
+\begin{tikzpicture}
+ \node[text=solarizedBlue] (foo) at (10, -10) {foo 2};
+ \node[dashed,text=solarizedBlue] (bar) at (8, -10) {bar};
+ \node[text=solarizedBlue] (hfoo) at (10, -8) {a3f555b6};
+ \node[dashed,text=solarizedBlue] (hbar) at (8, -8) {5716ca59};
+ \node[text=solarizedMagenta] (tree3) at (9, -6) {68b75754};
+ \node[text=solarizedCyan] (commit3) at (5, -6) {e0ea04248};
+ \node[text=solarizedCyan] (commit2) at (5, -8) {2de9adf2b};
+ \node[text=solarizedCyan] (commit1) at (5, -10) {a619a045a5};
+ \draw[-o] (hfoo) -- (foo);
+ \draw[-o] (hbar) -- (bar);
+ \draw[-o] (tree2) -- (hfoo);
+ \draw[-o] (tree2) -- (hbar);
+ \draw[-o] (commit3) -- (tree3);
+ \draw[-o] (commit3) -- (commit2);
+ \draw[-o] (commit2) -- (commit1);
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\section{Using Git±}
+\begin{frame}
+\frametitle{Using Git±}
+\framesubtitle{The porcelain over the pipes}
+\begin{itemize}
+\item{Plumbing commands are difficult, painful, and error prone}
+\item{Thankfully, we have friendly ``porcelain'' commands}
+\item{The basics can be covered with \texttt{git-add} and \texttt{git-commit}}
+\end{itemize}
+\end{frame}
+
+\subsection{git-add}
+\begin{frame}
+\frametitle{\texttt{git-add}}
+Combines:
+\begin{itemize}
+\item<1->{\texttt{git-hash-object}}
+\item<2->{\texttt{git-update-index}}
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{\texttt{git-status}}
+\framesubtitle{Short aside about \texttt{git-status}}
+\begin{itemize}
+\item{The go-to command for peering into the current state of a repository}
+\item{Provides information about state of all files}
+\begin{itemize}
+\item{Currently untracked files}
+\item{Currently modified files}
+\item{Current state of ``staging'' area}
+\end{itemize}
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{\texttt{git-add}}
+\lstinputlisting[language=bash,numbers=none]{code/4/1}
+\end{frame}
+
+\subsection{git-commit}
+\begin{frame}
+\frametitle{\texttt{git-commit}}
+\begin{itemize}
+\item{Creates ``commit'' out of current staging area}
+\begin{itemize}
+\item{Requires a short message}
+\item{Will implicitly figure out the parent commit}
+\item{Forwards the \texttt{HEAD} pointer and the current branch pointer}
+\end{itemize}
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{\texttt{git-commit}}
+\lstinputlisting[language=bash,numbers=none]{code/4/2}
+\end{frame}
+
+\section{Advanced Git±}
+\subsection{References}
+\begin{frame}
+\frametitle{Git± Branches}
+\begin{itemize}
+\item<2->{Named reference to a commit hash}
+\item<3->{Defined in text files under \texttt{./.git/refs}}
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Git± Branches}
+\lstinputlisting[language=bash,numbers=none]{code/5/1}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{\texttt{git-branch}}
+Branches can be created with a simple invocation of \texttt{git-branch}:
+\lstinputlisting[language=bash,numbers=none]{code/5/2}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{\texttt{git-checkout}}
+After the branch is created, we can switch into that branch with
+\texttt{git-checkout}:
+\lstinputlisting[language=bash,numbers=none]{code/5/3}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{\texttt{git-checkout -b}}
+Or, we can do all in the same command:
+\lstinputlisting[language=bash,numbers=none]{code/5/4}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Git± Branches}
+Currently, all branches are pointing to the same commit:
+\lstinputlisting[language=bash,numbers=none]{code/5/5}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Git± Branches}
+\lstinputlisting[language=bash,numbers=none]{code/5/6}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Git± Branches}
+\lstinputlisting[language=bash,numbers=none]{code/5/7}
+\end{frame}
+
+\subsection{Synchronization}
+\begin{frame}[fragile]
+\frametitle{Working with remotes}
+\begin{itemize}
+\item{Clone a repository from, say, Github, will create the remote reference}
+\item{Otherwise, can be created with \texttt{git-remote}}
+\end{itemize}
+Example Usage:
+\lstinputlisting[language=bash,numbers=none]{code/5/8}
+\end{frame}
+
+\begin{frame}
+\frametitle{Working with remotes}
+\begin{itemize}
+\item{\texttt{git-clone}: Clone ``remote'' repository}
+\begin{itemize}
+\item{\texttt{SSH://}: Bi-directional}
+\item{\texttt{Git://}: Pull only, not authenticated}
+\item{\texttt{HTTP (S)://}: Bi-directional, authenticated, but stupid}
+\item{\texttt{File://}: Strange}
+\end{itemize}
+\item{\texttt{git-push}: Push local changes to remote repository}
+\item{\texttt{git-remote}: Utility command for working with remotes}
+\item{\texttt{git-pull}: Pull remote changes into working copy}
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{\texttt{git-pull} considered harmful}
+\begin{itemize}
+\item{Standard use of \texttt{git-pull} requires clean working directory}
+\item{Will force a merge, if drift between remote and local}
+\item{I personally prefer creating an alias for \texttt{git-remote}}
+\end{itemize}
+\lstinputlisting[
+ language=bash,
+ numbers=none,
+ title=\texttt{\~{}/.gitconfig}]{code/5/9}
+\end{frame}
+
+\section*{References}
+\begin{frame}[allowframebreaks]
+\frametitle{References}
+\nocite{*}
+\renewcommand{\refname}{}
+\bibliographystyle{plain}
+\bibliography{references}
+\end{frame}
+
+\againframe{titleslide}
+\end{document}
diff --git a/src/images/xkcd_git.png b/src/images/xkcd_git.png
new file mode 100644
index 0000000..3f35d2d
--- /dev/null
+++ b/src/images/xkcd_git.png
Binary files differ
diff --git a/src/references.bib b/src/references.bib
new file mode 100644
index 0000000..83c71d9
--- /dev/null
+++ b/src/references.bib
@@ -0,0 +1,23 @@
+@misc{website:git-scm,
+ howpublished="\url{http://git-scm.com/}"
+}
+@book{book:pro-git,
+ author="Scott Chacon and Ben Straub",
+ title="Pro Git",
+ year="2014",
+ publisher="Apress"
+}
+@misc{website:xkcd_git_comic,
+ howpublished="\url{https://xkcd.com/1597}",
+ author="Randall Munroe"
+}
+@misc{website:wiki_zlib,
+ howpublished="\url{https://en.wikipedia.org/wiki/Zlib}"
+}
+@misc{website:git_initial_commit,
+ title="e83c51633",
+ howpublished="\url{https://github.com/git/git/commit/e83c5163316f89bfbde7d9ab23ca2e25604af290}"
+}
+@misc{website:SO_gitpull_considered_harmfull,
+ howpublished="\url{http://stackoverflow.com/questions/15316601/in-what-cases-could-git-pull-be-harmful#15316602}"
+}