diff options
author | kballou <kballou@devnulllabs.io> | 2016-01-18 12:31:48 -0700 |
---|---|---|
committer | kballou <kballou@devnulllabs.io> | 2016-01-18 14:50:11 -0700 |
commit | b2a2859ed6a747c248c2e9dd1bb85200785ba154 (patch) | |
tree | 1e89c6abf1c0d4c838e6b56a7b8f53a2f433d3fd | |
parent | 9941423988e575fecbfc5f2507a3dd296c60f188 (diff) | |
download | git-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.sty | 156 | ||||
-rw-r--r-- | src/code/1/1 | 3 | ||||
-rw-r--r-- | src/code/1/2 | 16 | ||||
-rw-r--r-- | src/code/1/3 | 4 | ||||
-rw-r--r-- | src/code/1/4 | 7 | ||||
-rw-r--r-- | src/code/1/5 | 4 | ||||
-rw-r--r-- | src/code/1/6 | 2 | ||||
-rw-r--r-- | src/code/2/1 | 8 | ||||
-rw-r--r-- | src/code/2/2 | 4 | ||||
-rw-r--r-- | src/code/2/3 | 8 | ||||
-rw-r--r-- | src/code/2/4 | 5 | ||||
-rw-r--r-- | src/code/2/5 | 10 | ||||
-rw-r--r-- | src/code/2/6 | 7 | ||||
-rw-r--r-- | src/code/3/1 | 9 | ||||
-rw-r--r-- | src/code/3/2 | 11 | ||||
-rw-r--r-- | src/code/3/3 | 11 | ||||
-rw-r--r-- | src/code/3/4 | 11 | ||||
-rw-r--r-- | src/code/4/1 | 13 | ||||
-rw-r--r-- | src/code/4/2 | 7 | ||||
-rw-r--r-- | src/code/5/1 | 4 | ||||
-rw-r--r-- | src/code/5/2 | 4 | ||||
-rw-r--r-- | src/code/5/3 | 2 | ||||
-rw-r--r-- | src/code/5/4 | 6 | ||||
-rw-r--r-- | src/code/5/5 | 4 | ||||
-rw-r--r-- | src/code/5/6 | 8 | ||||
-rw-r--r-- | src/code/5/7 | 8 | ||||
-rw-r--r-- | src/code/5/8 | 1 | ||||
-rw-r--r-- | src/code/5/9 | 2 | ||||
-rw-r--r-- | src/git-in-reverse.tex | 703 | ||||
-rw-r--r-- | src/images/xkcd_git.png | bin | 0 -> 48767 bytes | |||
-rw-r--r-- | src/references.bib | 23 |
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 Binary files differnew file mode 100644 index 0000000..3f35d2d --- /dev/null +++ b/src/images/xkcd_git.png 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}" +} |