Commit ec8f7203 authored by Sven Greiner's avatar Sven Greiner
Browse files

Initial commit

parents
*.aux
*.fdb_latexmk
*.fls
*.log
*.nav
*.out
*.pdf
*.snm
*.toc
ROOTTEX = vortrag
.PHONY: all pdf live clean clean-all
all: pdf
pdf:
latexmk -pdf $(ROOTTEX)
live:
latexmk -pdf -pvc $(ROOTTEX)
clean:
latexmk -c $(ROOTTEX)
clean-all: clean
latexmk -C $(ROOTTEX)
matrix.jpg

91.7 KB

\documentclass[aspectratio=169,12pt]{beamer}
% \documentclass[12pt]{beamer}
%--- includes ------------------------------------------------------------------
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[ngerman]{babel}
\usepackage{helvet}
\usepackage{inconsolata}
\usepackage{xspace}
\xspaceaddexceptions{"=}
\usepackage{microtype}
\usepackage{multicol}
\usepackage{tabu}
\usepackage{multirow}
\usepackage{booktabs}
\usepackage{xcolor}
\usepackage{tikz}
\usetikzlibrary{arrows,automata,calc,chains,trees,positioning,scopes,decorations.pathmorphing,decorations.pathreplacing,shapes,backgrounds,tikzmark,fadings,fit}
\usepackage{amsmath}
\usepackage{amssymb}
\usepackage{mathtools}
\usepackage{hyperref}
%--- colors and layout ---------------------------------------------------------
\usetheme{default}
\usecolortheme{rose}
\definecolor{uniblue}{rgb}{0,0.31,0.62}
\colorlet{maincolor}{uniblue}
\setbeamercolor{structure}{fg=maincolor}
\setbeamercolor{block title alerted}{fg=red!90!black}
\setbeamertemplate{navigation symbols}{}
\setbeamertemplate{blocks}[rounded]
% \setbeamertemplate{footline}{\raisebox{5pt}{\makebox[\paperwidth]{\color{lightgray}\scriptsize\hyperlink{TableOfContents}{\insertframenumber}}}}
\setbeamertemplate{footline}{\raisebox{5pt}{\makebox[\paperwidth]{\color{lightgray}\scriptsize \insertframenumber}}}
\setbeamertemplate{section page}{
\centering
\begin{beamercolorbox}[sep=12pt,center]{part title}
\usebeamerfont{section title}\insertsection\par
\end{beamercolorbox}
}
\setbeamerfont{title}{size=\LARGE,series=\bfseries,parent=structure}
\setbeamerfont{subtitle}{size=\footnotesize,series=\normalfont,parent=structure}
\setbeamerfont{author}{size=\footnotesize}
\setbeamerfont{date}{size=\footnotesize}
\defbeamertemplate*{title page}{customized}[1][]
{
\vbox{}
\vfill
\begingroup
\centering
\begin{beamercolorbox}[sep=8pt,center,#1]{title}
\usebeamerfont{title}\inserttitle\par%
\ifx\insertsubtitle\@empty%
\else%
\vskip0.25em%
{\usebeamerfont{subtitle}\usebeamercolor[fg]{subtitle}\insertsubtitle\par}%
\fi%
\end{beamercolorbox}%
\vskip1em\par
{\usebeamercolor[fg]{titlegraphic}\inserttitlegraphic\par}
\vskip1em\par
\begin{beamercolorbox}[center,#1]{author}
\usebeamerfont{author}\insertauthor
\end{beamercolorbox}
\begin{beamercolorbox}[center,#1]{institute}
\usebeamerfont{institute}\insertinstitute
\end{beamercolorbox}
\begin{beamercolorbox}[center,#1]{date}
\usebeamerfont{date}\insertdate
\end{beamercolorbox}\vskip0.5em
\endgroup
}
%--- metadata ------------------------------------------------------------------
\title{Git-Workshop}
\author{Sven Greiner}
\date{23. März 2017}
\titlegraphic{\includegraphics[width=.2\linewidth]{git-logo}\vskip2em}
%--- text replacements ---------------------------------------------------------
\newcommand{\zB}{z.\,B.~}
\newcommand{\ZB}{Z.\,B.~}
\newcommand{\bzw}{bzw.~}
\newcommand{\dphp}{d.\,h.~}
\newcommand{\Dphp}{D.\,h.~}
\newcommand{\ggf}{ggf.~}
\newcommand{\vgl}{vgl.~}
\newcommand{\ua}{u.\,a.~}
%--- helpers -------------------------------------------------------------------
\newcommand{\lstinline}[1]{{\ttfamily #1\xspace}}
\newcommand{\homepath}{\raise.17ex\hbox{$\scriptstyle\mathtt{\sim}$}}
\newcommand{\MM}{\--\--}
%--- git branch tikz -----------------------------------------------------------
\definecolor{gitnormalcolor}{HTML}{03a9f4}
\definecolor{gitbranchcolor}{HTML}{ff9800}
\tikzset{
commit/.pic={\draw[line width=\commitwidth, fill=\commitfill] circle (\commitsize) coordinate (x); \node[commitlabel] {#1};},
head/.pic={\pic {commit=#1}; \fill circle (.55*\commitsize);},
commit size/.store in=\commitsize,
commit width/.store in=\commitwidth,
commit fill/.store in=\commitfill,
commit size=5pt,
commit width=1.4pt,
commit fill=white,
gitlog/.style={line width=2pt, out=0, in=180, looseness=1.5, gitnormalcolor},
gitbranch/.style={gitlog, gitbranchcolor},
commitlabel/.style={draw=none, above=3pt of x, font=\footnotesize, color=black},
}
\newcommand{\gitcommit}[1]{pic {commit=#1}}
\newcommand{\githead}[1]{pic {head=#1}}
\newcommand{\gitbranch}{to ++(2,1)}
\newcommand{\gitmerge}{to ++(2,-1)}
\newcommand{\gitskip}{to ++(1,0)}
\begin{document}
\begin{frame}[plain]
\titlepage
\end{frame}
\begin{frame}{Versionsverwaltung}
\begin{itemize}
\item Was eine Versionsverwaltung ist:
\medskip
\begin{itemize}
\item Erfassen von Änderungen
\item Archiv mit Zeitstempel und Autor
\end{itemize}
\vfill
\item Wozu man eine Versionsverwaltung braucht:
\medskip
\begin{itemize}
\item Herausfinden, wann etwas geändert wurde
\item Änderungen rückgängig machen
\item Mit mehreren Leuten zusammenarbeiten
\end{itemize}
\end{itemize}
\end{frame}
\begin{frame}{Was ihr hier lernt \ldots}
\begin{center}
\ldots reicht für \textbf{95\%} aller Fälle.
\vspace{1cm}
\pause
Für den Rest gibt es Google.
\end{center}
\end{frame}
\begin{frame}{Die Kommandozeile ist dein Freund}
\centering
\includegraphics[width=\linewidth]{matrix}
\end{frame}
\begin{frame}{Wie ist dein Name?}
\begin{itemize}
\item Einmalig deinen Namen und deine E-Mail-Adresse festlegen:
\bigskip
\lstinline{git config --global user.name "Dein Name"} \\
\lstinline{git config --global user.email foobar@example.com}
\bigskip
\item Wird in \lstinline{\homepath/.gitconfig} gespeichert
\bigskip
\item Viele weitere Einstellungen über \lstinline{git config} möglich
\end{itemize}
\end{frame}
\begin{frame}{Alles hat ein Anfang: Init}
\begin{enumerate}
\setlength{\itemsep}{1em}
\item Konsole öffnen
\item Verzeichnis betreten
\item \lstinline{\$ git init}
\item Fertig (es wurde ein Verzeichnis \lstinline{.git} angelegt)
\end{enumerate}
\end{frame}
\begin{frame}{Mein erster Commit}
\begin{itemize}
\item (Alle) Dateien in den \emph{Index} hinzufügen:
\medskip\lstinline{\$ git add -A}
\bigskip
\item Den Commit erzeugen:
\medskip\lstinline{\$ git commit}
\end{itemize}
\bigskip
\begin{center}
\only<1>{%
\begin{tikzpicture}[y=-1cm]
\path[use as bounding box] (-0.5,-0.7) rectangle (4.5,0.5);
\draw[gitlog] (0,0) \githead{A};
\end{tikzpicture}%
}%
\only<2>{%
\begin{tikzpicture}[y=-1cm]
\path[use as bounding box] (-0.5,-0.7) rectangle (4.5,0.5);
\draw[gitlog] (0,0) \gitcommit{A} \gitskip \gitskip \gitcommit{B} \gitskip \gitskip \githead{C};
\end{tikzpicture}
}%
\end{center}
\end{frame}
\begin{frame}{Ein Commit im Detail}
\tabulinesep=2mm
\begin{tabu}to \linewidth{>{\ttfamily\raggedright}X[4]X[3]}
80cadb22bcd2cc2dd4b9a337\ldots & SHA1-Hash\\
SammysHP <sven@sammyshp.de> & Autor \\
Fri Mar 24 14:42:14 2017 +0100 & Zeit\\
Kurzbeschreibung & Kurzbeschreibung (eine Zeile)\\
Und ein längerer Text, welcher diesen Commit genauer beschreibt. & Ausführliche Beschreibung\\
& Und die Änderungen
\end{tabu}
\end{frame}
\begin{frame}{Vereinfachung und Ausnahmen}
\begin{itemize}
\item Alle bereits versionierten Dateien committen:
\medskip\lstinline{\$ git commit -a}
\bigskip
\item Änderungen am Index (\lstinline{git add}) rückgängig machen:
\medskip\lstinline{\$ git reset [\--\-- file]}
\bigskip
\item Dateien ignorieren: \lstinline{.gitignore}
\medskip
\begin{itemize}
\item Textdatei im Stammverzeichnis des Repository
\item Ein Dateinamen pro Zeile
\end{itemize}
\end{itemize}
\end{frame}
\begin{frame}{Vergangenes ist nicht vergessen: Log}
\begin{center}
\lstinline{\$ git log}
\bigskip
\lstinline{\$ git log \--\--graph \--\--oneline}
\end{center}
\end{frame}
\begin{frame}<-5>[label=branchmerge]
\frametitle<1->{Auf verzweigten Wegen: Branches}
\frametitle<6>{Und wieder vereint: Merges}
\begin{center}
\begin{minipage}{.6\linewidth}
\uncover<2->{\lstinline{\$ git checkout \MM branch <NAME>}}
\uncover<3->{\lstinline{\$ git commit -a}}
\uncover<4->{\lstinline{\$ git checkout master}}
\uncover<5->{\lstinline{\$ git commit -a}}
\uncover<6->{\lstinline{\$ git merge <NAME>}}
\end{minipage}
\vskip1cm
\begin{tikzpicture}[y=-1cm]
\path[use as bounding box] (-0.5,-0.7) rectangle (5.5,1.3);
\only<-2>{
\draw[gitlog] (0,0) \gitcommit{A} \gitskip \githead{B};
}
\only<3>{
\draw[gitbranch] (1,0) \gitbranch \githead{C};
\draw[gitlog] (0,0) \gitcommit{A} \gitskip \gitcommit{B};
}
\only<4>{
\draw[gitbranch] (1,0) \gitbranch \gitcommit{C};
\draw[gitlog] (0,0) \gitcommit{A} \gitskip \githead{B};
}
\only<5>{
\draw[gitbranch] (1,0) \gitbranch \gitcommit{C};
\draw[gitlog] (0,0) \gitcommit{A} \gitskip \gitcommit{B} \gitskip \gitskip \githead{D};
}
\only<6->{
\draw[gitbranch] (1,0) \gitbranch \gitcommit{C} \gitmerge;
\draw[gitlog] (0,0) \gitcommit{A} \gitskip \gitcommit{B} \gitskip \gitskip \gitcommit{D} \gitskip \gitskip \githead{E};
}
\end{tikzpicture}
\end{center}
\end{frame}
\againframe<6>{branchmerge}
\begin{frame}{Verteiltes Arbeiten: Remotes}
\begin{itemize}
\item Git ist dezentral -- kann aber zentral genutzt werden
\end{itemize}
\begin{center}
\begin{tikzpicture}
\tikzset{
remote/.style={draw, cylinder, minimum height=8mm, minimum width=10mm, shape border rotate=90, aspect=0.3},
computer/.style={draw},
user/.style={font=\footnotesize},
}
\node[remote] (A) at (0,0) {A};
\node[remote] (B) at (3,0) {B};
\node[remote] (C) at (-1,-1.5) {C};
\node[remote] (D) at (1,-1.5) {D};
\node[remote] (E) at (3,-1.5) {E};
\draw
(D) edge (C)
(D) edge (A)
(D) edge (B)
(E) edge (B);
\node[user] (U1) at (0,-2.2) {User 1};
\node[user] (U2) at (3,-2.2) {User 2};
\node[computer, fit=(C)(D)(U1)] {};
\node[computer, fit=(E)(U2)] {};
\end{tikzpicture}
\end{center}
\begin{itemize}
\item Jedes Remote hat (meistens) alle Daten
\medskip
\item \lstinline{\$ git remote add <NAME> <URL>}
\end{itemize}
\end{frame}
\begin{frame}{Branch Tracking}
\begin{itemize}
\item Beziehungen zwischen Branches
\bigskip
\item Lokale Branches, \zB \lstinline{master}
\begin{itemize}
\item Nur lokal, wurden mit keinem anderen Remote geteilt
\end{itemize}
\bigskip
\item Remote Branches, \zB \lstinline{origin/master}
\begin{itemize}
\item Referenz zu einem Branch in einem anderen Remote
\item Kann man nicht bearbeiten
\end{itemize}
\bigskip
\item Upstream Branches, \zB \lstinline{origin/master} für \lstinline{master}
\begin{itemize}
\item Der lokale Branch \lstinline{master} ist eine Kopie des Branches \lstinline{master} in dem Remote \lstinline{origin}
\end{itemize}
\end{itemize}
\end{frame}
\begin{frame}{clone, push, pull}
\begin{itemize}
\item Ein vorhandenes Remote herunterladen:
\medskip\lstinline{\$ git clone <URL>}
\bigskip
\item Änderungen hochladen:
\medskip\lstinline{\$ git push [-u] [<REMOTE>]}
\begin{itemize}
\item \lstinline{git commit} nicht vergessen
\item \lstinline{-u} legt den \emph{upstream tracking branch} fest
\end{itemize}
\bigskip
\item Lokale Kopie aktualisieren:
\medskip\lstinline{\$ git pull [<REMOTE>]}
\end{itemize}
\end{frame}
\begin{frame}{Pull im Detail}
\end{frame}
\begin{frame}{Schönere History: Rebase}
\begin{itemize}
\item<2-> Commit in Master
\item<3-> Merge würde einen Merge-Commit erzeugen
\item<4-> \lstinline{\$ git rebase master}
\item<5-> \lstinline{\$ git checkout master \&\& git merge <NAME>}
\medskip
$\quad\implies$ Fast-Forward
\end{itemize}
\bigskip
\begin{center}
\begin{tikzpicture}[y=-1cm]
\path[use as bounding box] (-0.5,-0.7) rectangle (5.5,1.3);
\only<1>{
\draw[gitbranch] (1,0) \gitbranch \githead{C};
\draw[gitlog] (0,0) \gitcommit{A} \gitskip \gitcommit{B};
}
\only<2>{
\draw[gitbranch] (1,0) \gitbranch \githead{C};
\draw[gitlog] (0,0) \gitcommit{A} \gitskip \gitcommit{B} \gitskip \gitskip \gitcommit{D};
}
\only<3>{
\draw[gitbranch] (1,0) \gitbranch \gitcommit{C} \gitmerge;
\draw[gitlog] (0,0) \gitcommit{A} \gitskip \gitcommit{B} \gitskip \gitskip \gitcommit{D} \gitskip \gitskip \githead{E};
}
\only<4>{
\draw[gitbranch] (3,0) \gitbranch \githead{C};
\draw[gitlog] (0,0) \gitcommit{A} \gitskip \gitcommit{B} \gitskip \gitskip \gitcommit{D};
}
\only<5>{
\draw[gitlog] (0,0) \gitcommit{A} \gitskip \gitcommit{B} \gitskip \gitskip \gitcommit{D} \gitskip \gitskip \githead{C};
}
\end{tikzpicture}
\end{center}
\end{frame}
\begin{frame}{Wenn's mal schief läuft: Revert}
\begin{itemize}
\item Commit B macht Mist und soll rückgängig gemacht werden
\item<2->{\lstinline{\$ git revert B}}
\end{itemize}
\begin{center}
\begin{tikzpicture}[y=-1cm]
\path[use as bounding box] (-0.5,-0.7) rectangle (3.5,0.3);
\only<1>{
\draw[gitlog] (0,0) \gitcommit{A} \gitskip \gitcommit{B} \gitskip \githead{C};
}
\only<2->{
\draw[gitlog] (0,0) \gitcommit{A} \gitskip \gitcommit{B} \gitskip \gitcommit{C} \gitskip \githead{D};
}
\end{tikzpicture}
\end{center}
\begin{itemize}
\item<3-> Wir können Vergangenes nicht ändern!
\item<4-> (Es gibt Möglichkeiten -- die wollen wir aber möglichst nie nutzen)
\end{itemize}
\end{frame}
\begin{frame}{Wenn's mal schief läuft: Amend}
\end{frame}
\begin{frame}{Rebase revisited: Interactive Rebase}
\end{frame}
\begin{frame}{(Do NOT) Use the \--\--force, Luke!}
\begin{center}
\lstinline{\$ git push \MM force}
\end{center}
\bigskip
\pause
\begin{itemize}
\item Wir löschen damit Daten aus einem Remote!
\item Andere haben diese Daten möglicherweise schon gepullt
$\quad\implies$ Konflikte vorprogrammiert!
\end{itemize}
\end{frame}
\begin{frame}{}
\end{frame}
\begin{frame}{Hilfreiche Seiten}
\begin{itemize}
\item man pages von Git:\quad \lstinline{\$ man git-<BEFEHL>}
\bigskip
\item Git Book: \url{https://git-scm.com/book/}
\end{itemize}
\end{frame}
% \begin{frame}[plain]{Inhalt}
% \label{TableOfContents}
% \vfill
% \begin{multicols}{3}
% \tableofcontents
% \end{multicols}
% \vfill
% \end{frame}
\end{document}
% vim: set fdm=marker fmr=\\begin{frame},\\end{frame}:
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment