summaryrefslogtreecommitdiff
path: root/src/git-in-reverse.tex
diff options
context:
space:
mode:
authorkballou <kballou@devnulllabs.io>2016-03-17 17:53:25 -0600
committerkballou <kballou@devnulllabs.io>2016-03-17 17:53:25 -0600
commit4d8c7c38524e380a8c521a8bf605357188bbc567 (patch)
treeb61ae801321e54e19fe5e6886e5a32ce3b515403 /src/git-in-reverse.tex
parent6c5f6fb871747080baf33a867da586c5c39e2a59 (diff)
downloadgit-in-reverse-4d8c7c38524e380a8c521a8bf605357188bbc567.tar.gz
git-in-reverse-4d8c7c38524e380a8c521a8bf605357188bbc567.tar.xz
Update slides
Add content for more basic commands, merging, rebasing, commit messages, commit frequency, etc.
Diffstat (limited to 'src/git-in-reverse.tex')
-rw-r--r--src/git-in-reverse.tex369
1 files changed, 332 insertions, 37 deletions
diff --git a/src/git-in-reverse.tex b/src/git-in-reverse.tex
index 90ed5a6..91a1249 100644
--- a/src/git-in-reverse.tex
+++ b/src/git-in-reverse.tex
@@ -13,6 +13,7 @@
\usetikzlibrary{trees, shapes.misc, arrows}
\usepackage{pgfkeys}
\usepackage{graphicx}
+\usepackage[normalem]{ulem}
\graphicspath{{./images/}}
\setbeamertemplate{headline}{}
@@ -474,7 +475,7 @@ What does Git store?
\begin{tikzpicture}
\node[text=solarizedBlue] (foo) at (10, -10) {foo};
\node[text=solarizedBlue] (hfoo) at (10, -8) {257cc564};
- \draw[-o] (hfoo) -- (foo);
+ \draw[-o,thick] (hfoo) -- (foo);
\end{tikzpicture}
\end{figure}
\end{frame}
@@ -486,8 +487,8 @@ What does Git store?
\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);
+ \draw[-o,thick] (hfoo) -- (foo);
+ \draw[-o,thick] (tree1) -- (hfoo);
\end{tikzpicture}
\end{figure}
\end{frame}
@@ -500,9 +501,9 @@ What does Git store?
\node[text=solarizedBlue] (hfoo) at (10, -8) {257cc564};
\node[text=solarizedMagenta] (tree1) at (9, -6) {fcf0be4d};
\node[text=solarizedCyan] (commit1) at (5, -6) {a619a045a5};
- \draw[-o] (hfoo) -- (foo);
- \draw[-o] (tree1) -- (hfoo);
- \draw[-o] (commit1) -- (tree1);
+ \draw[-o,thick] (hfoo) -- (foo);
+ \draw[-o,thick] (tree1) -- (hfoo);
+ \draw[-o,thick] (commit1) -- (tree1);
\end{tikzpicture}
\end{figure}
\end{frame}
@@ -517,10 +518,10 @@ What does Git store?
\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);
+ \draw[-o,thick] (hfoo) -- (foo);
+ \draw[-o,thick] (hbar) -- (bar);
+ \draw[-o,thick] (tree1) -- (hfoo);
+ \draw[-o,thick] (commit1) -- (tree1);
\end{tikzpicture}
\end{figure}
\end{frame}
@@ -536,12 +537,12 @@ What does Git store?
\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);
+ \draw[-o,thick] (hfoo) -- (foo);
+ \draw[-o,thick] (hbar) -- (bar);
+ \draw[-o,thick] (tree2) -- (hfoo);
+ \draw[-o,thick] (tree2) -- (hbar);
+ \draw[-o,thick] (commit2) -- (tree2);
+ \draw[-o,thick] (commit2) -- (commit1);
\end{tikzpicture}
\end{figure}
\end{frame}
@@ -558,13 +559,13 @@ What does Git store?
\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);
+ \draw[-o,thick] (hfoo) -- (foo);
+ \draw[-o,thick] (hbar) -- (bar);
+ \draw[-o,thick] (tree2) -- (hfoo);
+ \draw[-o,thick] (tree2) -- (hbar);
+ \draw[-o,thick] (commit3) -- (tree3);
+ \draw[-o,thick] (commit3) -- (commit2);
+ \draw[-o,thick] (commit2) -- (commit1);
\end{tikzpicture}
\end{figure}
\end{frame}
@@ -580,19 +581,9 @@ What does Git store?
\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}
-
+\subsection{git-status}
\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}
@@ -604,6 +595,16 @@ Combines:
\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}[fragile]
\frametitle{\texttt{git-add}}
\lstinputlisting[language=bash,numbers=none]{code/4/1}
@@ -613,7 +614,7 @@ Combines:
\begin{frame}
\frametitle{\texttt{git-commit}}
\begin{itemize}
-\item{Creates ``commit'' out of current staging area}
+\item{Creates a ``commit'' out of the current staging area}
\begin{itemize}
\item{Requires a short message}
\item{Will implicitly figure out the parent commit}
@@ -627,6 +628,46 @@ Combines:
\lstinputlisting[language=bash,numbers=none]{code/4/2}
\end{frame}
+\subsection{git-mv}
+\begin{frame}
+\frametitle{\texttt{git-mv}}
+\begin{itemize}
+\item{Combines:}
+\begin{itemize}
+\item{\texttt{mv}}
+\item{\texttt{git-add}}
+\end{itemize}
+\item{Rename detection is automatic}
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{\texttt{git-mv}}
+\lstinputlisting[language=bash,numbers=none]{code/4/3}
+\end{frame}
+
+\subsection{git-rm}
+\begin{frame}
+\frametitle{\texttt{git-rm}}
+\begin{itemize}
+\item{Removes the file from working tree}
+\item{Stops tracking the file}
+\item{Adds the removal to the staging area}
+\end{itemize}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{\texttt{git-rm}}
+\lstinputlisting[language=bash,numbers=none]{code/4/4}
+\end{frame}
+
+\begin{frame}
+\frametitle{\texttt{git-rm}}
+\begin{itemize}
+\item{Can also use regular \texttt{rm} and \texttt{git-add}}
+\end{itemize}
+\end{frame}
+
\section{Advanced Git±}
\subsection{References}
\begin{frame}
@@ -677,6 +718,85 @@ Currently, all branches are pointing to the same commit:
\lstinputlisting[language=bash,numbers=none]{code/5/7}
\end{frame}
+\subsection{Merging}
+\begin{frame}
+\frametitle{Git± Merging}
+\begin{itemize}
+\item{Fast-Forward Merge}
+\item{$N$-parent Merge, where $N$ usually is $2$}
+\item{Both achieved via the \texttt{git-merge} command}
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git± Merging}
+\framesubtitle{Fast-Forward Merges}
+\begin{figure}
+\begin{tikzpicture}
+\node (C0) at (0, 4.5) {C0};
+\node (C1) at (0, 3) {C1};
+\node (C2) at (0, 1.5) {C2};
+\node (C3) at (1, 0) {C3};
+\node[text=solarizedCyan] (master) at (-3, 1.5) {master};
+\node[text=solarizedCyan] (develop) at (3, 0) {develop};
+
+\draw[-o,thick] (C0) -- (C1);
+\draw[-o,thick] (C1) -- (C2);
+\draw[-o,thick] (C2) to[out=-90,in=90] (C3);
+\draw[-o,thick] (master) -- (C2);
+\draw[-o,thick] (develop) -- (C3);
+
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git± Merging}
+\framesubtitle{Fast-Forward Merges}
+\begin{figure}
+\begin{tikzpicture}
+\node (C0) at (0, 4.5) {C0};
+\node (C1) at (0, 3) {C1};
+\node (C2) at (0, 1.5) {C2};
+\node (C3) at (0, 0) {C3};
+\node[text=solarizedCyan] (master) at (-3, 0) {master};
+\node[text=solarizedCyan] (develop) at (3, 0) {develop};
+
+\draw[-o,thick] (C0) -- (C1);
+\draw[-o,thick] (C1) -- (C2);
+\draw[-o,thick] (C2) -- (C3);
+\draw[-o,thick] (master) -- (C3);
+\draw[-o,thick] (develop) -- (C3);
+
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git± Merging}
+\framesubtitle{$2$-Parent Merge}
+\begin{figure}
+\begin{tikzpicture}
+\node (C0) at (0, 6.5) {C0};
+\node (C1) at (0, 5) {C1};
+\node (C2) at (0, 3) {C2};
+\node[text=solarizedMagenta] (C2') at (1, 3) {C2};
+\node[text=solarizedMagenta] (C3) at (1, 2) {C3};
+\node[text=solarizedOrange] (M1) at (0, 0) {M1};
+
+\coordinate (M) at (0, 0.5);
+
+\draw[-o,thick] (C0) -- (C1);
+\draw[-o,thick] (C1) -- (C2);
+\draw[-o,thick] (C1) to[in=90,out=-90] (C2');
+\draw[-o,thick] (C2') -- (C3);
+\draw[thick] (C2) -- (M);
+\draw[thick] (C3) to[in=90,out=-90] (M);
+\draw[-o,thick] (M) -- (M1);
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
\subsection{Synchronization}
\begin{frame}[fragile]
\frametitle{Working with remotes}
@@ -695,7 +815,7 @@ Example Usage:
\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{HTTP (S)://}: Bi-directional, authenticated, unintelligent}
\item{\texttt{File://}: Strange}
\end{itemize}
\item{\texttt{git-push}: Push local changes to remote repository}
@@ -704,6 +824,168 @@ Example Usage:
\end{itemize}
\end{frame}
+\subsection{Rebase}
+\begin{frame}
+\frametitle{Git± Rebase}
+\framesubtitle{Another way to \sout{merge} rewrite history}
+Or, more realistically, a great way to have a bad time\ldots{}
+\begin{itemize}
+\item{Merges branches via a pop, play, replay strategy}
+\begin{enumerate}
+\item{Find common ancestor}
+\item{Pop ``ours'' off the ancestor}
+\item{Play ``theirs'' onto ancestor}
+\item{Replay ``ours'' onto result}
+\end{enumerate}
+\item{Inherently changes the replayed commits}
+\item{If this sounds scary, it is}
+\end{itemize}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git± Rebase}
+\begin{figure}
+\begin{tikzpicture}
+\coordinate (root) at (0, -0.27);
+\node (C0) at (1, 0) {C0};
+\node (C1) at (3, 0) {C1};
+\node (C2) at (5, 0) {C2};
+
+\draw[-o,thick,dotted] (root) -- (C0);
+\draw[-o,thick] (C0) -- (C1);
+\draw[-o,thick] (C1) -- (C2);
+
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git± Rebase}
+\begin{figure}
+\begin{tikzpicture}
+\coordinate (root) at (0, -0.27);
+\node (C0) at (1, 0) {C0};
+\node (C1) at (3, 0) {C1};
+\node (C2) at (5, 0) {C2};
+\node[text=solarizedMagenta] (U1) at (3.5, -1) {U1};
+\node[text=solarizedMagenta] (U2) at (5.5, -1) {U2};
+
+\draw[-o,thick,dotted] (root) -- (C0);
+\draw[-o,thick] (C0) -- (C1);
+\draw[-o,thick] (C0) to[out=0,in=180] (U1);
+\draw[-o,thick] (C1) -- (C2);
+\draw[-o,thick] (U1) -- (U2);
+
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git± Rebase}
+\begin{figure}
+\begin{tikzpicture}
+\coordinate (root) at (0, -0.27);
+\node (C0) at (1, 0) {C0};
+\node (C1) at (3, 2) {C1};
+\node (C2) at (5, 2) {C2};
+\node[text=solarizedMagenta] (U1) at (3, 0) {U1};
+\node[text=solarizedMagenta] (U2) at (5, 0) {U2};
+
+\draw[-o,thick,dotted] (root) -- (C0);
+\draw[-o,thick] (C0) -- (U1);
+\draw[-o,thick] (C1) -- (C2);
+\draw[-o,thick] (U1) -- (U2);
+\draw[-o,thick,dotted] (C0) to[out=0,in=180] (C1);
+
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git± Rebase}
+\begin{figure}
+\begin{tikzpicture}
+\coordinate (root) at (0, -0.27);
+\node (C0) at (1, 0) {C0};
+\node[text=solarizedOrange] (C1) at (7, 0) {C1'};
+\node[text=solarizedOrange] (C2) at (9, 0) {C2'};
+\node (U1) at (3, 0) {U1};
+\node (U2) at (5, 0) {U2};
+
+\draw[-o,thick,dotted] (root) -- (C0);
+\draw[-o,thick] (C0) -- (U1);
+\draw[-o,thick] (U1) -- (U2);
+\draw[-o,thick] (U2) -- (C1);
+\draw[-o,thick] (C1) -- (C2);
+
+\end{tikzpicture}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Git± Rebase}
+\begin{itemize}
+\item{When to rebase?}
+\begin{itemize}
+\item{Squashing Work in Progress (WIP) commits}
+\item{Rebase Private Trees}
+\item{Pulling upstream changes in before sharing a new branch}
+\item{Preference toward linear history}
+\end{itemize}
+\item{When \textbf{not} to rebase?}
+\begin{itemize}
+\item{Non-Private Tree}
+\item{Other people's commits}
+\item{Preference toward chronological history}
+\end{itemize}
+\end{itemize}
+\end{frame}
+
+\section{Notes and Tips}
+\subsection{Commit Frequency}
+\begin{frame}
+\frametitle{Commit Frequency}
+\framesubtitle{How often to create commits}
+\begin{itemize}
+\item{WIP commits}
+\item{Logical Changes}
+\begin{itemize}
+\item{Implemented a new feature}
+\item{Fixed a bug}
+\end{itemize}
+\end{itemize}
+\end{frame}
+
+\subsection{Commit Messages}
+\begin{frame}
+\frametitle{Writing Good Commit Messages}
+\begin{figure}
+\includegraphics[scale=0.45]{xkcd_git_commit.png}
+\caption{XKCD and Git Log\cite{website:xkcd_revision_history_comic}}
+\end{figure}
+\end{frame}
+
+\begin{frame}
+\frametitle{Writing Good Commit Messages}
+\begin{enumerate}
+\item{Separate subject from body with a blank line}
+\item{Limit the subject line to 50 characters}
+\item{Capitalize the subject line}
+\item{Do not end the subject line with a period}
+\item{Use the imperative voice in the subject line}
+\item{Wrap the body at 72 characters}
+\item{Use the body to explain what and why vs.\ how}
+\end{enumerate}
+\end{frame}
+
+\begin{frame}[fragile]
+\frametitle{Writing Good Commit Messages}
+\framesubtitle{Why?}
+Because \texttt{git-log} output \textit{needs} to be beautiful:
+\lstinputlisting[numbers=none]{code/gitlog}
+\end{frame}
+
+\subsection{git-pull}
\begin{frame}[fragile]
\frametitle{\texttt{git-pull} considered harmful}
\begin{itemize}
@@ -713,12 +995,25 @@ Example Usage:
\texttt{git pull} unless you actually want to merge the remote branch.''}
\item{I personally prefer creating an alias for \texttt{git-remote}}
\end{itemize}
-\lstinputlisting[
+\lstinputlisting[%
language=bash,
numbers=none,
title=\texttt{\~{}/.gitconfig}]{code/5/9}
\end{frame}
+\subsection{Moving Forward}
+\begin{frame}
+\frametitle{Git± Moving Forward}
+\begin{itemize}
+\item<2->{Read the output}
+\item<3->{No, \textit{really}, Read the output!}
+\item<4->{\url{git-scm.com} and ``Pro Git''}
+\item<5->{\texttt{\#{}git} on Freenode}
+\item<6->{Git± man pages~\cite{website:git_man_pages}}
+\item<7->{Git± workflows~\cite{website:gitworkflows7}}
+\end{itemize}
+\end{frame}
+
\section*{References}
\begin{frame}[allowframebreaks]
\frametitle{References}