From 2df0f5e8118996358b3fa84f0954924b7f488348 Mon Sep 17 00:00:00 2001 From: Sebastian Harl Date: Wed, 24 Nov 2010 20:43:57 +0100 Subject: [PATCH 1/1] Imported initial slides used at OpenRheinRuhr 2010. --- Makefile | 15 ++ gitlogo.pdf | Bin 0 -> 1356 bytes handout.tex | 6 + main.tex | 717 +++++++++++++++++++++++++++++++++++++++++++++++++++ orr-logo.pdf | Bin 0 -> 5397 bytes slides.tex | 4 + 6 files changed, 742 insertions(+) create mode 100644 Makefile create mode 100644 gitlogo.pdf create mode 100644 handout.tex create mode 100644 main.tex create mode 100644 orr-logo.pdf create mode 100644 slides.tex diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..ce663fa --- /dev/null +++ b/Makefile @@ -0,0 +1,15 @@ +all: slides.pdf handout.pdf + +%.pdf: %.tex + pdflatex $< + +slides.pdf: slides.tex main.tex + +handout.pdf: handout.tex main.tex + +clean: + rm -f *.aux *.log *.nav *.out *.snm *.toc *.vrb + rm -f slides.pdf handout.pdf + +.PHONY: all clean + diff --git a/gitlogo.pdf b/gitlogo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bf9c89defe1cce92235044ce51f4abdbb7b3e356 GIT binary patch literal 1356 zcmY!laBlN#im7wyP%dw=i?mRB!~FTIekbxKq?c_?zr zUi*NoKQh-pD!Hv#zR<&KfB!+h@B8iFe|da;!T0^`ykf>de!;&~Jm(2L$ua(D?d#E0 znp*B5c+0d~FJYytUd+xH2H&=3`0*7BB^$Klc6l5B3gFuCL+R*o7Og!TmySwF_hwyU zW)**beCgj%w~Ib}XRF_bl;y{TirLIMG&6e1!3OK~PfHlAmfe0d^P*By@|m#wz$FHW zt0kx930gPa-p(EQp^JsRkV@-pV~w%(T+e2wYZePz<8tg2r%T-|A*e(2-L zb!~AHf=8Zw=)172Ff7l0^R69t@7$fcW2L}7Q9)(EZ>Vrzdu8{Lr6bF|9kh^;GHQ*4MvPmI}=)Uu-zf z&|_CI$AinxPkt2EEPi#;%Kht}FHE8ZYZI>)`_G(eq3`~^({(~zY0swR`xCy*t=?s8 z5vSE8dS9gaUF?3bee>qX^-n*Q{O<4B#R50}+&Z=RpKwvsPP?)XsqfzYsQkmc@7x7* zuGG8~Xbb~cptJ!>5Fi?uBuvbWK=L4-5j^F9(~4_FiFYSff0@Pcq07~GH)a+iAUs{0VI*4Up zQJ8~+fleq&%quPcS)5!66LtoQyQG$7CZ`6uJAnit-p~(9EzU13N=_|S00l-6lBYmU zhGi>+r;5Q&^Uh2u26_PG?;yBqOF{lbGQbSU0B2x!E6FcX&`3_qEXr3f)U(htG*HmU zC@Cqh(g%hsP%ynHu^=NexmYj1C|y$%Y)wE>eoARFF#8g(4G}5kNY+E#@0?hYn3JCl zF&Y>_#n5O$=&2}5P2)09u;4O)0|hfvQ)5$wGzFNLg*hPm_dGjmdlz-3-=W>qTC$)MC4l%HRs0P;8_ hxp?NK_P98UhPXRabvEE&w-H)M@|# literal 0 HcmV?d00001 diff --git a/handout.tex b/handout.tex new file mode 100644 index 0000000..2c0625c --- /dev/null +++ b/handout.tex @@ -0,0 +1,6 @@ +\documentclass[handout]{beamer} + +\usepackage{pgfpages} +\pgfpagesuselayout{4 on 1}[a4paper,landscape] + +\input{main.tex} diff --git a/main.tex b/main.tex new file mode 100644 index 0000000..03f0b1b --- /dev/null +++ b/main.tex @@ -0,0 +1,717 @@ +\usetheme{default} +\setbeamertemplate{navigation symbols}{} + +\mode +{ + \setbeamercolor{background canvas}{bg=black!10} +} +\setbeamercolor*{block body}{fg=black,bg=white} +\setbeamercolor*{block title}{use=titlelike,fg=titlelike.fg!80!black,bg=black!10} + +\usepackage{ngerman} +\usepackage[utf8]{inputenc} + +\usepackage{listings} +\usepackage{xcolor} +\definecolor{darkgreen}{rgb}{0,0.39,0} + +\usepackage{graphicx} +\usepackage{icomma} +\usepackage[normalem]{ulem} + +\usepackage{multirow} + +\usepackage[overlay,absolute]{textpos} + +\usepackage{tikz} +\usetikzlibrary{shadows} +\usetikzlibrary{decorations.pathreplacing} +\usetikzlibrary{shapes.geometric} + +\usepackage{wasysym} + +\title[Versionierung für OpenSourcler]{{\small Verteilte Versionskontrolle mit Git}\\ + \LARGE Versionierung für OpenSourcler} + +\author[Sebastian "`tokkee"' Harl]{Sebastian "`tokkee"' Harl\\ + $<$tokkee@debian.org$>$} +%\institute{Debian RRDtool Team} + +\date[ORR 2010]{\textbf{OpenRheinRuhr 2010}\\ 14.\ November 2010} + +\subject{Versionierung für OpenSourcler} + +\titlegraphic{ + \vspace*{-10mm} + \begin{minipage}[c]{19mm} + \includegraphics[height=20mm]{orr-logo.pdf} + \end{minipage} + \hfill + \begin{minipage}[c]{13mm} + \includegraphics[height=25mm]{gitlogo.pdf} + \end{minipage} +} + +% This is rather a hack, but it's easier than defining custom beamer themes +% for now. +\setbeamertemplate{frametitle}{} +\newenvironment{frameframe}[1] + { + \begin{frame}[fragile,environment=frameframe] + % width of a slide is 128 mm + \begin{textblock*}{116mm}(6mm,4mm) + \begin{tikzpicture}[x=1mm,y=1mm] + \filldraw[fill=white,rounded corners=2mm,very thick] + (0,0) rectangle (116,75); + \draw[thin] (58,75) node [fill=white,drop shadow,draw] + { \usebeamerfont*{frametitle}\usebeamercolor[fg]{frametitle}#1 }; + \draw (58,78) node {}; + \end{tikzpicture} + \end{textblock*} + \begin{textblock*}{122mm}(3mm,85mm) + \begin{minipage}[c]{8mm} + \includegraphics[width=8mm]{orr-logo.pdf} + \end{minipage} + \hfill + \begin{minipage}[c]{105mm} + \centering + {\tiny \insertshorttitle{} + \hspace{3mm}---\hspace{3mm} + \insertshortauthor{} + \hspace{3mm}---\hspace{3mm} + \insertframenumber\,/\,\inserttotalframenumber} + \end{minipage} + \hfill + \begin{minipage}[c]{5mm} + \includegraphics[width=5mm]{gitlogo.pdf} + \end{minipage} + \end{textblock*} + \begin{textblock*}{\textwidth}(10mm,12mm) + % even hackier ... ;-) + % vertically center the text in the frame + \begin{minipage}[c]{-1pt}\rule{0mm}{71mm} + \end{minipage}\begin{minipage}[c]{\textwidth} + } + { + \end{minipage} + \end{textblock*} + \end{frame} + } + +\AtBeginSection[] +{ + \begin{frame} + % width of a slide is 128 mm + \begin{textblock*}{116mm}(6mm,4mm) + \begin{tikzpicture}[x=1mm,y=1mm] + \filldraw[fill=white,rounded corners=2mm,very thick] + (0,0) rectangle (116,75); + \draw (58,78) node {}; + \end{tikzpicture} + \end{textblock*} + \begin{textblock*}{122mm}(3mm,85mm) + \begin{minipage}[c]{8mm} + \includegraphics[width=8mm]{orr-logo.pdf} + \end{minipage} + \hfill + \begin{minipage}[c]{105mm} + \centering + {\tiny \insertshorttitle{} + \hspace{3mm}---\hspace{3mm} + \insertshortauthor{} + \hspace{3mm}---\hspace{3mm} + \insertframenumber\,/\,\inserttotalframenumber} + \end{minipage} + \hfill + \begin{minipage}[c]{5mm} + \includegraphics[width=5mm]{gitlogo.pdf} + \end{minipage} + \end{textblock*} + \begin{textblock*}{\textwidth}(10mm,14mm) + \tableofcontents[currentsection,hideothersubsections] + \end{textblock*} + \end{frame} +} + +\begin{document} + +\lstset{% + basicstyle=\scriptsize,% + language=C,% + identifierstyle=\color{black}\bfseries,% + keywordstyle=\color{darkgreen}\bfseries,% + commentstyle=\color{teal},% + stringstyle=\color{red}, + showstringspaces=false,% + tabsize=4% +} + +\begin{frame} + % width of a slide is 128 mm + \begin{textblock*}{116mm}(6mm,6mm) + \begin{tikzpicture}[x=1mm,y=1mm] + \filldraw[fill=white,rounded corners=2mm,very thick] + (0,0) rectangle (116,84); + \end{tikzpicture} + \end{textblock*} + \begin{textblock*}{\textwidth}(10mm,16mm) + \titlepage + \end{textblock*} +\end{frame} + +\begin{frameframe}{Statistiken: Wer seid ihr?} + \begin{itemize} + \item<+-> Wer bezeichnet sich als Programmierer? + \item<+-> Wer arbeitet an einem OpenSource-Projekt? + \begin{itemize} + \item<+-> … mit mehr als 1 Entwickler? + \item<+-> … mit mehr als 10 Entwicklern? + \item<+-> … mit mehr als 100 Entwicklern? + \item<+-> … mit mehr als 1000 Entwicklern? + \end{itemize} + \item<+-> Wer hat schon ein Versionsverwaltungssystem (VCS) verwendet? + \item<+-> Wer hat schon ein zentrales VCS (CVS, SVN, …) verwendet? + \item<+-> Wer hat schon ein dezentrales VCS (Git, bzr, Mercurial, …) + verwendet? + \item<+-> Wer hat schon mit Git gearbeitet? + \end{itemize} +\end{frameframe} + +\section{Grundlagen: Was ist Versionskontrolle?} +\begin{frameframe}{Grundlagen: Was ist Versionskontrolle?} + \begin{itemize} + \item technisch gesehen: ein Haufen Dateien mit Meta-Informationen und + irgendwelchen Beziehungen untereinander \smiley{} + + \vspace{5mm} + + \uncover<2>{ + \item Protokollieren von Änderungen an (Quell-)text + \item Archivierung mit "`Rücksetz-Operation"' + \item koordinierter Zugriff + \item parallele Entwicklungszweige (neue Features, alte Releases) + } + \end{itemize} +\end{frameframe} + +\begin{frameframe}{Grundlagen: Typen von VCSen} + \begin{textblock*}{\textwidth}(10mm,30mm) + \begin{itemize} + \item lock/modify/write + \item copy/modify/merge + + \vspace{5mm} + + \uncover<2->{ + \item \alert<2>{lokale Versionierung} + \item \alert<3>{zentrale Versionierung} + \item \alert<5>{dezentrale Versionierung} + } + \end{itemize} + \end{textblock*} + + \only<4>{ + \begin{textblock*}{\textwidth}(10mm,20mm) + \centering + \begin{tikzpicture}[x=1mm,y=1mm] + \filldraw[fill=white,color=white] (-52,-27) rectangle (52,27); + \draw (0,0) node[thin,rounded corners=2mm,draw] + (repo) { zentrales Repo }; + \draw (-30, 10) node[rounded corners,fill=yellow,draw] + (c0) { Committer 0 }; + \draw (0, 20) node[rounded corners,fill=yellow,draw] + (c1) { Committer 1 }; + \draw (30, 10) node[rounded corners,fill=yellow,draw] + (c2) { Committer 2 }; + \draw (30, -10) node[rounded corners,fill=yellow,draw] + (c3) { Committer 3 }; + \draw (0, -20) node { \LARGE … }; + \draw [->] (c0.south east) -- (repo.north west); + \draw [->] (c1.south) -- (repo.north); + \draw [->] (c2.south west) -- (repo.north east); + \draw [->] (c3.north west) -- (repo.south east); + \end{tikzpicture} + \end{textblock*} + } +\end{frameframe} + +\section{Dezentrale Versionskontrolle} +\begin{frameframe}{Workflow in OpenSource Projekten} + \begin{textblock*}{\textwidth}(10mm,30mm) + \begin{itemize} + \item üblicherweise ein/wenige Hauptentwickler/Projektleiter + \item viele Mitwirkende (versch.\ Umfang/Arbeitsgebiet) + \item ggf.\ Subsystem-Verantwortliche;\newline + Entwickler mit mehreren Arbeitsrechnern + \item ein "`zentraler"'/"`offizielles"' Repository + \item temporäre und Feature-Branches + \end{itemize} + \end{textblock*} + + \only<2>{ + \begin{textblock*}{\textwidth}(10mm,20mm) + \centering + \begin{tikzpicture}[x=1mm,y=1mm] + \filldraw[fill=white,color=white] (-52,-27) rectangle (52,27); + \draw (0,0) node[thin,rounded corners=2mm,draw] + (r0) { Repo 0 }; + \draw (-25, 10) node[rounded corners,fill=yellow,draw] + (r1) { Repo 1 }; + \draw (0, 20) node[rounded corners,fill=yellow,draw] + (r2) { Repo 2 }; + \draw (-30, 27) node[rounded corners,fill=yellow,draw] + (r3) { Repo 3 }; + \draw (30, 10) node[rounded corners,fill=yellow,draw] + (r4) { Repo 4 }; + \draw (30, -10) node[rounded corners,fill=yellow,draw] + (r5) { Repo 5 }; + \draw (0, -20) node { \LARGE … }; + \draw [<->] (r1.south east) -- (r0.west); + \draw [<->] (r2.south west) -- (r1.north east); + \draw [<->] (r3.south) -- (r1.north); + \draw [<->] (r3.east) -- (r2.north west); + \draw [<->] (r4.south west) -- (r0.north east); + \draw [<->] (r5.north west) -- (r0.south east); + \draw [<->] (r5.north) -- (r4.south); + \end{tikzpicture} + \end{textblock*} + } +\end{frameframe} + +\begin{frameframe}{Grundlagen von dezentralen VCSen} + \begin{itemize} + \item "`Peer-to-Peer"' Ansatz + \item jede Arbeitskopie bringt ein komplettes Repository mit (Klon) + \item gearbeitet wird auf lokalem Repository\newline + $\Rightarrow$ kein Netzwerk-Zugriff nötig\newline + $\Rightarrow$ Operationen schnell\newline + $\Rightarrow$ Offline-Arbeit möglich + \item automatisches "`Backup"' durch Repository-Klons + \item Zusammenführen meist auf Basis eines "`Web-of-Trust"' + \end{itemize} +\end{frameframe} + +\begin{frameframe}{Arbeitsweise} + { + \vspace*{-5mm} + \hspace*{10mm} + \begin{tikzpicture}[x=1mm,y=1mm] + \node[cylinder,draw,shape border rotate=90,black,% + minimum width=25mm, minimum height=10mm,% + cylinder uses custom fill,cylinder end fill=yellow!90,% + cylinder body fill=yellow!60] at (0,0) {}; + \draw (25, 0) node[anchor=west] { Repository }; + \node[cylinder,draw,shape border rotate=90,black,% + minimum width=25mm, minimum height=10mm,% + cylinder uses custom fill,cylinder end fill=orange!90,% + cylinder body fill=orange!60] at (0,20) {}; + \draw (25, 20) node[anchor=west] { Arbeitskopie }; + + \uncover<2,7>{ + \draw[thick,->] (12.5, 5) -- (12.5, 17); + \draw (15,11) node[anchor=west] { \ttfamily checkout }; + } + + \uncover<3,7>{ + \draw[thick,->] (0,25) .. controls (7,35) and (-7,35) .. (0,25); + \draw (0, 37.5) node { \ttfamily modify }; + } + + \uncover<4,7>{ + \draw[thick,->] (-12.5, 17) -- (-12.5, 5); + \draw (-10,11) node[anchor=west] { \ttfamily commit }; + } + + \only<5->{ + \node[cylinder,draw,shape border rotate=90,black,% + minimum width=25mm, minimum height=10mm,% + cylinder uses custom fill,cylinder end fill=yellow!90,% + cylinder body fill=yellow!60] at (0,-20) {}; + \draw (25, -20) node[anchor=west] { anderes Repository }; + + \uncover<6>{ + \draw[thick,->] (12.5, -15) -- (12.5, -3); + \draw (15,-9) node[anchor=west] { \ttfamily fetch }; + } + + \uncover<8>{ + \draw[thick,->] (-12.5, -3) -- (-12.5, -15); + \draw (-10,-9) node[anchor=west] { \ttfamily push }; + } + } + \end{tikzpicture} + } +\end{frameframe} + +% TODO - Datenhaltung in Git (-> Git for Computer Scientists) + +\section{Arbeiten mit Git} +\begin{frameframe}{Git: Übersicht} + \begin{itemize} + \item \url{http://www.git.or.cz/} + \item VCS (Version Control System) + \item 2005 von Linus Torvalds initiiert\newline + (aktueller Maintainer: Junio C. Hamano) + \item dezentral + \item schnell und effizient + \item kryptographisch gesichert + \item "`Toolkit design"' + \item OpenSource (GPLv2) + \item weit verbreitet im Einsatz (z.B.\ Linux Kernel, Ruby on Rails, Perl, + WINE, X.org, GNOME, Qt, Debian, …) + \end{itemize} +\end{frameframe} + +\begin{frameframe}{Arbeiten mit Git: Grundlagen} + \begin{itemize} + \item $>>$ 100 einzelne Befehle + \item "`Porcelains"' und "`Plumbing"' + \item Dokumentation als Manpages - \texttt{git(7)} + \item \texttt{git help}, \texttt{git $<$command$>$ -h} + \item Benutzer Handbuch: + \url{http://www.kernel.org/pub/software/scm/git/docs/user-manual.html} + \end{itemize} +\end{frameframe} + +\begin{frameframe}{Datenhaltung: Git Objektdatenbank} + \begin{itemize} + \item DAG (directed acyclic graph) + \item Objekte identifiziert durch SHA-1 Summe + \end{itemize} + + \hspace*{15mm} + \begin{tikzpicture}[x=1mm,y=1mm] + \draw (0,0) node[thin,rounded corners=2mm,draw] + (blob) { blob }; + + \uncover<2->{ + \draw (0, 20) node[thin,rounded corners=2mm,draw] + (tree) { tree }; + \draw [->] (tree.south) -- (blob.north); + \draw (2,10) node[anchor=west] { \footnotesize name, mode }; + \draw [->] (tree.north east) .. controls (10,25) and (10,15) + .. (tree.south east); + \draw (10, 20) node[anchor=west] { \footnotesize subdir }; + } + + \uncover<3->{ + \draw (0,40) node[thin,rounded corners=2mm,draw] + (commit) { commit }; + \draw [->] (commit.south) -- (tree.north); + \draw [->] (commit.north east) .. controls (15,45) and (15,35) + .. (commit.south east); + \draw (15,40) node[anchor=west] { \footnotesize parents }; + } + + \uncover<4->{ + \draw (-20,40) node[thin,draw,fill=yellow] + (branch) { branch }; + \draw [->] (branch.east) -- (commit.west); + \draw (-20,30) node[thin,draw,fill=yellow] + (head) { HEAD }; + \draw[dashed,->] (head.north) -- (branch.south); + } + + \uncover<5->{ + \draw (-20,10) node[thin,draw,fill=orange] + (tag) { tag }; + \draw [->] (tag.north east) -- (commit.south west); + \draw (-20, 3) node { \footnotesize name, message }; + } + \end{tikzpicture} +\end{frameframe} + +\begin{frameframe}{Git konfigurieren} + \begin{block}{Sich Git vorstellen} + \begin{itemize} + \item \texttt{git config --global user.name $<$Dein Name$>$} + \item \texttt{git config --global user.email $<$du@deine-domain.tld$>$} + \item $\rightarrow$ Benutzerinformationen für Commit-Metadaten + \end{itemize} + \end{block} + + \uncover<2>{ + \begin{block}{Bunt und in Farbe} + \begin{itemize} + \item \texttt{git config --global color.ui auto} + \item $\rightarrow$ farbige \texttt{branch}, \texttt{diff}, \texttt{grep}, + \texttt{status} Ausgaben + \end{itemize} + \end{block} + } +\end{frameframe} + +\begin{frameframe}{Repositories erstellen} + \begin{block}{Neues, leeres Repository} + \ttfamily + \footnotesize + \$ mkdir project\newline + \$ cd project\newline + \$ git init\newline + Initialized empty Git\newline + repository in .../.git/ + \end{block} + + \vspace{5mm} + + \uncover<2>{ + \begin{block}{Bestehendes Repository "`klonen"'} + \ttfamily + \footnotesize + \$ git clone $<$rep$>$\newline + ... + \end{block} + } +\end{frameframe} + +\begin{frameframe}{Änderungen vornehmen} + \begin{block}{Ändern} + {\ttfamily + \footnotesize + \$ vim foo bar\newline + \$ git add foo bar + } + + \begin{itemize} + \item \texttt{add}, \texttt{rm}, \texttt{mv} + \end{itemize} + \end{block} + + \uncover<2>{ + \begin{block}{Geschichte fortführen/ändern} + {\ttfamily + \footnotesize + \$ git commit + } + + \vspace{5mm} + + {\ttfamily + \footnotesize + \$ git reset --hard HEAD\textasciicircum + } + + \begin{itemize} + \item \texttt{reset}, \texttt{revert}, \texttt{checkout} + \end{itemize} + \end{block} + } +\end{frameframe} + +\begin{frameframe}{Exkurs: Commit Meldungen schreiben} + \begin{itemize} + \item Einzeilige, kurze ($<$ 80, optimal $<$ 50 Zeichen) + Zusammenfassung + \item Leerzeile + \item Detaillierte Beschreibung/Erklärung + \item nicht vorgeschrieben, aber "`common practice"' und von vielen + Tools erwartet + \end{itemize} +\end{frameframe} + +\begin{frameframe}{Exkurs: Commit Meldungen schreiben} + \footnotesize + \begin{verbatim} +git-remote: do not use user input in a printf format string + +'git remote show' substituted the remote name into a string that +was later used as a printf format string. If a remote name contains +a printf format specifier like this: + + $ git remote add foo%sbar . + +then the command + + $ git remote show foo%sbar + +would print garbage (if you are lucky) or crash. This fixes it. + \end{verbatim} +\end{frameframe} + +\begin{frameframe}{Aus der Geschichte lernen} + \begin{block}{Status der Arbeitskopie} + \ttfamily + \footnotesize + \$ git status\newline + \$ git diff + \end{block} + + \uncover<2->{ + \begin{block}{Historie betrachten} + \ttfamily + \footnotesize + \$ git log\newline + \$ tig + \end{block} + } + + \uncover<3->{ + \begin{block}{Objekte betrachten} + {\ttfamily + \footnotesize + \$ git show\newline + \$ git show HEAD:foo + } + + \begin{itemize} + \item Commits, Trees, Blobs, Tags + \end{itemize} + \end{block} + } +\end{frameframe} + +\begin{frameframe}{Tags} + {\ttfamily + \footnotesize + \$ git tag -m ``$<$Beschreibung$>$'' $<$Name$>$ $<$Commit$>$\newline + \$ git tag -l + } + + \vspace{5mm} + + \begin{itemize} + \item "`Zeiger"' auf einen Commit\newline + optional mit Metadaten ("'annotated tag"') + \item Kennzeichnung von bestimmten Entwicklungsständen (insb.\ Releases) + \item "`annotated tag"': Autor, Datum, Beschreibung, optional GnuPG + Signatur + \end{itemize} +\end{frameframe} + +\begin{frameframe}{Branching und Merging} + \begin{itemize} + \item Branch: "`automatischer"' Zeiger auf eine Reihe von Commits + \item \texttt{HEAD}: Zeiger auf den aktuellen Branch + \item \texttt{master}: "`Standard"'-Branch + \item Merge: Zusammenführen von zwei Entwicklungssträngen + \end{itemize} + + \begin{block}{Branch erzeugen} + \ttfamily + \footnotesize + \$ git checkout -b $<$Name$>$ + + \vspace{5mm} + + \uncover<2>{ + \$ git branch\newline + \hspace*{1em}master\newline + * new-branch + } + \end{block} +\end{frameframe} + +\begin{frameframe}{Branching und Merging} + \begin{block}{Branches zusammenführen} + \ttfamily + \footnotesize + \$ git merge master\newline + \$ git rebase master + \end{block} + + \uncover<2>{ + \begin{block}{Konflikte auflösen} + \begin{itemize} + \item Konflikte entstehen, wenn die gleiche Stelle unterschiedlich + geändert wurde\newline + $\Rightarrow$ manuelles Eingreifen nötig + \item Commit-Erzeugung wird unterbrochen + \item Konfliktanzeiger in den betroffenen Dateien + \item manuelle Entscheidung, wie beide Änderungen zusammengeführt werden + \end{itemize} + \end{block} + } +\end{frameframe} + +\begin{frameframe}{Arbeiten mit anderen Repositories} + \begin{block}{Repository klonen} + \ttfamily + \footnotesize + \$ git clone + \end{block} + + \begin{block}{Austauschen von Änderungen} + {\ttfamily + \footnotesize + \$ git pull\newline + \$ git push + } + + \vspace{5mm} + + Alternativ: + \begin{itemize} + \item \texttt{git format-patch}, \texttt{git send-mail} + \end{itemize} + \end{block} +\end{frameframe} + +\begin{frameframe}{Arbeiten mit anderen Repositories} + \begin{itemize} + \item "`remote"': Repository, dessen Änderungen verfolgt werden + \item "`remote branch"': Branch, welcher der Zustand in einem anderen + Repository wiederspiegelt + \item technisch: Branch in einem anderen Namensraum mit anderer Semantik + \end{itemize} + + \vspace{5mm} + + \begin{block}{Arbeiten mit "`remotes"'} + \ttfamily + \footnotesize + \$ git remote add $<$Name$>$ URL\newline + \$ git remote update $<$Name$>$ + \end{block} +\end{frameframe} + +\begin{frameframe}{Repository URLs} + \begin{itemize} + \item lokal: \texttt{/path/to/repository/} + \item http: \texttt{http://domain.tld/repository.git} + \item git: \texttt{git://domain.tld/repository.git} + \item ssh: \texttt{domain.tld:path/to/repository/} + \end{itemize} +\end{frameframe} + +\begin{frameframe}{Frontends} + \begin{itemize} + \item \texttt{tig} (ncurses) + \item \texttt{gitk} (Tk, read-only) + \item \texttt{qgit} (Qt) + \item \texttt{magit} (emacs) + \end{itemize} +\end{frameframe} + +\begin{frameframe}{Goodies} + \begin{itemize} + \item<+-> \texttt{git reflog} + \item<+-> \texttt{git rebase -i} + \item<+-> \texttt{git commit --amend} + \item<+-> \texttt{git add -p} + \item<+-> \texttt{git stash} + \item<+-> \texttt{git bisect} + \item<+-> \texttt{git cherry} / \texttt{git-wtf} + \item<+-> \texttt{git diff color-words} + \item<+-> \texttt{git svn} + \end{itemize} +\end{frameframe} + +\begin{frameframe}{\insertshorttitle{}} + \begin{center} + Vielen Dank für die Aufmerksamkeit! + + \vspace{10mm} + + {\Large Gibt es Fragen?} + + \vspace{10mm} + + Kontakt:\\ + Sebastian "`tokkee"' Harl\\ + $<$tokkee@debian.org$>$ + \end{center} +\end{frameframe} + +\end{document} + +% vim: set shiftwidth=2 softtabstop=2 tabstop=8 spelllang=de_de : diff --git a/orr-logo.pdf b/orr-logo.pdf new file mode 100644 index 0000000000000000000000000000000000000000..885bcc99bda0e0bf50e475998960377a384fcf91 GIT binary patch literal 5397 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