Code

Added 'egit' to the list of frontends.
[talk-dvcs-git.git] / main.tex
1 %
2 % Copyright (C) 2010-2011 Sebastian 'tokkee' Harl <sh@tokkee.org>
3 % All rights reserved.
4 %
5 % Redistribution and use in source and binary forms, with or without
6 % modification, are permitted provided that the following conditions
7 % are met:
8 % 1. Redistributions of source code must retain the above copyright
9 %    notice, this list of conditions and the following disclaimer.
10 % 2. Redistributions in binary form must reproduce the above copyright
11 %    notice, this list of conditions and the following disclaimer in the
12 %    documentation and/or other materials provided with the distribution.
13 %
14 % THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15 % ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
16 % TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
17 % PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR
18 % CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
19 % EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
20 % PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
21 % OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
22 % WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
23 % OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
24 % ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25 %
27 \usetheme{default}
28 \setbeamertemplate{navigation symbols}{}
30 \mode<beamer>
31 {
32   \setbeamercolor{background canvas}{bg=black!10}
33 }
34 \setbeamercolor*{block body}{fg=black,bg=white}
35 \setbeamercolor*{block title}{use=titlelike,fg=titlelike.fg!80!black,bg=black!10}
37 \usepackage{ngerman}
38 \usepackage[utf8]{inputenc}
40 \usepackage{listings}
41 \usepackage{xcolor}
42 \definecolor{darkgreen}{rgb}{0,0.39,0}
44 \usepackage{graphicx}
45 \usepackage{icomma}
46 \usepackage[normalem]{ulem}
48 \usepackage{multirow}
50 \usepackage[overlay,absolute]{textpos}
52 \usepackage{tikz}
53 \usetikzlibrary{shadows}
54 \usetikzlibrary{decorations.pathreplacing}
55 \usetikzlibrary{shapes.geometric}
57 \usepackage{wasysym}
59 \title[Versionierung für OpenSourcler]{{\small Verteilte Versionskontrolle mit Git}\\
60   \LARGE Versionierung für OpenSourcler}
62 \author[Sebastian "`tokkee"' Harl]{Sebastian "`tokkee"' Harl\\
63   $<$tokkee@debian.org$>$}
64 \institute{team(ix) GmbH}
66 \date[ALIT 2011]{\textbf{Augsburger Linux-Infotag 2011}\\ 26.\ März 2011}
68 \subject{Versionierung für OpenSourcler}
70 \titlegraphic{
71   \vspace*{-12mm}
72   \begin{minipage}[b]{19mm}
73     \includegraphics[height=10mm]{teamix_logo_cmyk.pdf}
74   \end{minipage}
75   \hfill
76   \begin{minipage}[b]{13mm}
77     \includegraphics[height=25mm]{gitlogo.pdf}
78   \end{minipage}
79 }
81 % This is rather a hack, but it's easier than defining custom beamer themes
82 % for now.
83 \setbeamertemplate{frametitle}{}
84 \newenvironment{frameframe}[1]
85   {
86     \begin{frame}[fragile,environment=frameframe]
87     % width of a slide is 128 mm
88     \begin{textblock*}{116mm}(6mm,4mm)
89       \begin{tikzpicture}[x=1mm,y=1mm]
90         \filldraw[fill=white,rounded corners=2mm,very thick]
91           (0,0) rectangle (116,75);
92         \draw[thin] (58,75) node [fill=white,drop shadow,draw]
93           { \usebeamerfont*{frametitle}\usebeamercolor[fg]{frametitle}#1 };
94         \draw (58,78) node {};
95       \end{tikzpicture}
96     \end{textblock*}
97     \begin{textblock*}{122mm}(3mm,85mm)
98       \begin{minipage}[c]{20mm}
99         \includegraphics[width=20mm]{teamix_logo_cmyk.pdf}
100       \end{minipage}
101       \hfill
102       \begin{minipage}[c]{93mm}
103         \centering
104         {\tiny \insertshorttitle{}
105          \hspace{3mm}---\hspace{3mm}
106          \insertshortauthor{}
107          \hspace{3mm}---\hspace{3mm}
108          \insertframenumber\,/\,\inserttotalframenumber}
109       \end{minipage}
110       \hfill
111       \begin{minipage}[c]{5mm}
112         \includegraphics[width=5mm]{gitlogo.pdf}
113       \end{minipage}
114     \end{textblock*}
115     \begin{textblock*}{\textwidth}(10mm,12mm)
116       % even hackier ... ;-)
117       % vertically center the text in the frame
118       \begin{minipage}[c]{-1pt}\rule{0mm}{71mm}
119       \end{minipage}\begin{minipage}[c]{\textwidth}
120   }
121   {
122       \end{minipage}
123     \end{textblock*}
124     \end{frame}
125   }
127 \AtBeginSection[]
129   \begin{frame}
130     % width of a slide is 128 mm
131     \begin{textblock*}{116mm}(6mm,4mm)
132       \begin{tikzpicture}[x=1mm,y=1mm]
133         \filldraw[fill=white,rounded corners=2mm,very thick]
134           (0,0) rectangle (116,75);
135         \draw (58,78) node {};
136       \end{tikzpicture}
137     \end{textblock*}
138     \begin{textblock*}{122mm}(3mm,85mm)
139       \begin{minipage}[c]{20mm}
140         \includegraphics[width=20mm]{teamix_logo_cmyk.pdf}
141       \end{minipage}
142       \hfill
143       \begin{minipage}[c]{93mm}
144         \centering
145         {\tiny \insertshorttitle{}
146          \hspace{3mm}---\hspace{3mm}
147          \insertshortauthor{}
148          \hspace{3mm}---\hspace{3mm}
149          \insertframenumber\,/\,\inserttotalframenumber}
150       \end{minipage}
151       \hfill
152       \begin{minipage}[c]{5mm}
153         \includegraphics[width=5mm]{gitlogo.pdf}
154       \end{minipage}
155     \end{textblock*}
156     \begin{textblock*}{\textwidth}(10mm,14mm)
157       \tableofcontents[currentsection,hideothersubsections]
158     \end{textblock*}
159   \end{frame}
162 \begin{document}
164 \lstset{%
165   basicstyle=\scriptsize,%
166   language=C,%
167   identifierstyle=\color{black}\bfseries,%
168   keywordstyle=\color{darkgreen}\bfseries,%
169   commentstyle=\color{teal},%
170   stringstyle=\color{red},
171   showstringspaces=false,%
172   tabsize=4%
175 \begin{frame}
176   % width of a slide is 128 mm
177   \begin{textblock*}{116mm}(6mm,6mm)
178     \begin{tikzpicture}[x=1mm,y=1mm]
179       \filldraw[fill=white,rounded corners=2mm,very thick]
180         (0,0) rectangle (116,84);
181     \end{tikzpicture}
182   \end{textblock*}
183   \begin{textblock*}{\textwidth}(10mm,16mm)
184     \titlepage
185   \end{textblock*}
186 \end{frame}
188 \begin{frameframe}{Statistiken: Wer seid ihr?}
189   \begin{itemize}
190     \item<+-> Wer bezeichnet sich als Programmierer?
191     \item<+-> Wer arbeitet an einem OpenSource-Projekt?
192     \begin{itemize}
193       \item<+-> … mit mehr als 1 Entwickler?
194       \item<+-> … mit mehr als 10 Entwicklern?
195       \item<+-> … mit mehr als 100 Entwicklern?
196       \item<+-> … mit mehr als 1000 Entwicklern?
197     \end{itemize}
198     \item<+-> Wer hat schon ein Versionsverwaltungssystem (VCS) verwendet?
199     \item<+-> Wer hat schon ein zentrales VCS (CVS, SVN, …) verwendet?
200     \item<+-> Wer hat schon ein dezentrales VCS (Git, bzr, Mercurial, …)
201       verwendet?
202     \item<+-> Wer hat schon mit Git gearbeitet?
203   \end{itemize}
204 \end{frameframe}
206 \section{Grundlagen: Was ist Versionskontrolle?}
207 \begin{frameframe}{Grundlagen: Was ist Versionskontrolle?}
208   \begin{itemize}
209     \item technisch gesehen: ein Haufen Dateien mit Meta-Informationen und
210       irgendwelchen Beziehungen untereinander \smiley{}
212     \vspace{5mm}
214     \uncover<2>{
215     \item Protokollieren von Änderungen an (Quell-)text
216     \item Archivierung mit "`Rücksetz-Operation"'
217     \item koordinierter Zugriff
218     \item parallele Entwicklungszweige (neue Features, alte Releases)
219     }
220   \end{itemize}
221 \end{frameframe}
223 \begin{frameframe}{Grundlagen: Typen von VCSen}
224   \begin{textblock*}{\textwidth}(10mm,30mm)
225     \begin{itemize}
226       \item lock/modify/write
227       \item copy/modify/merge
229       \vspace{5mm}
231       \uncover<2->{
232       \item \alert<2>{lokale Versionierung}
233       \item \alert<3>{zentrale Versionierung}
234       \item \alert<5>{dezentrale Versionierung}
235       }
236     \end{itemize}
237   \end{textblock*}
239   \only<4>{
240     \begin{textblock*}{\textwidth}(10mm,20mm)
241       \centering
242       \begin{tikzpicture}[x=1mm,y=1mm]
243         \filldraw[fill=white,color=white] (-52,-27) rectangle (52,27);
244         \draw (0,0) node[thin,rounded corners=2mm,draw]
245           (repo) { zentrales Repo };
246         \draw (-30, 10) node[rounded corners,fill=yellow,draw]
247           (c0) { Committer 0 };
248         \draw (0, 20) node[rounded corners,fill=yellow,draw]
249           (c1) { Committer 1 };
250         \draw (30, 10) node[rounded corners,fill=yellow,draw]
251           (c2) { Committer 2 };
252         \draw (30, -10) node[rounded corners,fill=yellow,draw]
253           (c3) { Committer 3 };
254         \draw (0, -20) node { \LARGE … };
255         \draw [->] (c0.south east) -- (repo.north west);
256         \draw [->] (c1.south) -- (repo.north);
257         \draw [->] (c2.south west) -- (repo.north east);
258         \draw [->] (c3.north west) -- (repo.south east);
259       \end{tikzpicture}
260     \end{textblock*}
261   }
262 \end{frameframe}
264 \section{Dezentrale Versionskontrolle}
265 \begin{frameframe}{Workflow in OpenSource Projekten}
266   \begin{textblock*}{\textwidth}(10mm,30mm)
267     \begin{itemize}
268       \item üblicherweise ein/wenige Hauptentwickler/Projektleiter
269       \item viele Mitwirkende (versch.\ Umfang/Arbeitsgebiet)
270       \item ggf.\ Subsystem-Verantwortliche;\newline
271         Entwickler mit mehreren Arbeitsrechnern
272       \item ein "`zentraler"'/"`offizielles"' Repository
273       \item temporäre und Feature-Branches
274     \end{itemize}
275   \end{textblock*}
277   \only<2>{
278     \begin{textblock*}{\textwidth}(10mm,20mm)
279       \centering
280       \begin{tikzpicture}[x=1mm,y=1mm]
281         \filldraw[fill=white,color=white] (-52,-27) rectangle (52,27);
282         \draw (0,0) node[thin,rounded corners=2mm,draw]
283           (r0) { Repo 0 };
284         \draw (-25, 10) node[rounded corners,fill=yellow,draw]
285           (r1) { Repo 1 };
286         \draw (0, 20) node[rounded corners,fill=yellow,draw]
287           (r2) { Repo 2 };
288         \draw (-30, 27) node[rounded corners,fill=yellow,draw]
289           (r3) { Repo 3 };
290         \draw (30, 10) node[rounded corners,fill=yellow,draw]
291           (r4) { Repo 4 };
292         \draw (30, -10) node[rounded corners,fill=yellow,draw]
293           (r5) { Repo 5 };
294         \draw (0, -20) node { \LARGE … };
295         \draw [<->] (r1.south east) -- (r0.west);
296         \draw [<->] (r2.south west) -- (r1.north east);
297         \draw [<->] (r3.south) -- (r1.north);
298         \draw [<->] (r3.east) -- (r2.north west);
299         \draw [<->] (r4.south west) -- (r0.north east);
300         \draw [<->] (r5.north west) -- (r0.south east);
301         \draw [<->] (r5.north) -- (r4.south);
302       \end{tikzpicture}
303     \end{textblock*}
304   }
305 \end{frameframe}
307 \begin{frameframe}{Grundlagen von dezentralen VCSen}
308   \begin{itemize}
309     \item "`Peer-to-Peer"' Ansatz
310     \item jede Arbeitskopie bringt ein komplettes Repository mit (Klon)
311     \item gearbeitet wird auf lokalem Repository\newline
312       $\Rightarrow$ kein Netzwerk-Zugriff nötig\newline
313       $\Rightarrow$ Operationen schnell\newline
314       $\Rightarrow$ Offline-Arbeit möglich
315     \item automatisches "`Backup"' durch Repository-Klons
316     \item Zusammenführen meist auf Basis eines "`Web-of-Trust"'
317   \end{itemize}
318 \end{frameframe}
320 \begin{frameframe}{Arbeitsweise}
321   {
322   \vspace*{-5mm}
323   \hspace*{10mm}
324   \begin{tikzpicture}[x=1mm,y=1mm]
325     \node[cylinder,draw,shape border rotate=90,black,%
326       minimum width=25mm, minimum height=10mm,%
327       cylinder uses custom fill,cylinder end fill=yellow!90,%
328       cylinder body fill=yellow!60] at (0,0) {};
329     \draw (25, 0) node[anchor=west] { Repository };
330     \node[cylinder,draw,shape border rotate=90,black,%
331       minimum width=25mm, minimum height=10mm,%
332       cylinder uses custom fill,cylinder end fill=orange!90,%
333       cylinder body fill=orange!60] at (0,20) {};
334     \draw (25, 20) node[anchor=west] { Arbeitskopie };
336     \uncover<2,7>{
337       \draw[thick,->] (12.5, 5) -- (12.5, 17);
338       \draw (15,11) node[anchor=west] { \ttfamily checkout };
339     }
341     \uncover<3,7>{
342       \draw[thick,->] (0,25) .. controls (7,35) and (-7,35) .. (0,25);
343       \draw (0, 37.5) node { \ttfamily modify };
344     }
346     \uncover<4,7>{
347       \draw[thick,->] (-12.5, 17) -- (-12.5, 5);
348       \draw (-10,11) node[anchor=west] { \ttfamily commit };
349     }
351     \only<5->{
352       \node[cylinder,draw,shape border rotate=90,black,%
353         minimum width=25mm, minimum height=10mm,%
354         cylinder uses custom fill,cylinder end fill=yellow!90,%
355         cylinder body fill=yellow!60] at (0,-20) {};
356       \draw (25, -20) node[anchor=west] { anderes Repository };
358       \uncover<6>{
359         \draw[thick,->] (12.5, -15) -- (12.5, -3);
360         \draw (15,-9) node[anchor=west] { \ttfamily fetch };
361       }
363       \uncover<8>{
364         \draw[thick,->] (-12.5, -3) -- (-12.5, -15);
365         \draw (-10,-9) node[anchor=west] { \ttfamily push };
366       }
367     }
368   \end{tikzpicture}
369   }
370 \end{frameframe}
372 % TODO - Datenhaltung in Git (-> Git for Computer Scientists)
374 \section{Arbeiten mit Git}
375 \begin{frameframe}{Git: Übersicht}
376   \begin{itemize}
377     \item \url{http://www.git.or.cz/}
378     \item VCS (Version Control System)
379     \item 2005 von Linus Torvalds initiiert\newline
380       (aktueller Maintainer: Junio C. Hamano)
381     \item dezentral
382     \item schnell und effizient
383     \item kryptographisch gesichert
384     \item "`Toolkit design"'
385     \item OpenSource (GPLv2)
386     \item weit verbreitet im Einsatz (z.B.\ Linux Kernel, Ruby on Rails, Perl,
387       WINE, X.org, GNOME, Qt, Debian, …)
388   \end{itemize}
389 \end{frameframe}
391 \begin{frameframe}{Arbeiten mit Git: Grundlagen}
392   \begin{itemize}
393     \item ca.\ 150 einzelne Befehle
394     \item "`Porcelains"' und "`Plumbing"'
395     \item Dokumentation als Manpages --- \texttt{git(7)}
396     \item \texttt{git help}, \texttt{git $<$command$>$ -h}
397     \item Benutzer Handbuch:
398       \url{http://www.kernel.org/pub/software/scm/git/docs/user-manual.html}
399     \item "`Git Community Book"': \url{http://book.git-scm.com/}
400     \item Buch "`Pro Git"': \url{http://progit.org/book/}
401   \end{itemize}
402 \end{frameframe}
404 \begin{frameframe}{Datenhaltung: Git Objektdatenbank}
405   \begin{itemize}
406     \item DAG (directed acyclic graph)
407     \item Objekte identifiziert durch SHA-1 Summe
408   \end{itemize}
410   \hspace*{15mm}
411   \begin{tikzpicture}[x=1mm,y=1mm]
412     \draw (0,0) node[thin,rounded corners=2mm,draw]
413       (blob) { blob };
415     \uncover<2->{
416       \draw (0, 20) node[thin,rounded corners=2mm,draw]
417         (tree) { tree };
418       \draw [->] (tree.south) -- (blob.north);
419       \draw (2,10) node[anchor=west] { \footnotesize name, mode };
420       \draw [->] (tree.north east) .. controls (10,25) and (10,15)
421         .. (tree.south east);
422       \draw (10, 20) node[anchor=west] { \footnotesize subdir };
423     }
425     \uncover<3->{
426       \draw (0,40) node[thin,rounded corners=2mm,draw]
427         (commit) { commit };
428       \draw [->] (commit.south) -- (tree.north);
429       \draw [->] (commit.north east) .. controls (15,45) and (15,35)
430         .. (commit.south east);
431       \draw (15,40) node[anchor=west] { \footnotesize parents };
432     }
434     \uncover<4->{
435       \draw (-20,40) node[thin,draw,fill=yellow]
436         (branch) { branch };
437       \draw [->] (branch.east) -- (commit.west);
438       \draw (-20,30) node[thin,draw,fill=yellow]
439         (head) { HEAD };
440       \draw[dashed,->] (head.north) -- (branch.south);
441     }
443     \uncover<5->{
444       \draw (-20,10) node[thin,draw,fill=orange]
445         (tag) { tag };
446       \draw [->] (tag.north east) -- (commit.south west);
447       \draw (-20, 3) node { \footnotesize name, message };
448     }
449   \end{tikzpicture}
450 \end{frameframe}
452 \begin{frameframe}{Git konfigurieren}
453   \begin{block}{Sich Git vorstellen}
454   \begin{itemize}
455     \item \texttt{git config --global user.name $<$Dein Name$>$}
456     \item \texttt{git config --global user.email $<$du@deine-domain.tld$>$}
457     \item $\rightarrow$ Benutzerinformationen für Commit-Metadaten
458   \end{itemize}
459   \end{block}
460 \end{frameframe}
462 \begin{frameframe}{Git konfigurieren}
463   \begin{block}{Bunt und in Farbe}
464   \begin{itemize}
465     \item \texttt{git config --global color.ui auto}
466     \item $\rightarrow$ farbige \texttt{branch}, \texttt{diff}, \texttt{grep},
467       \texttt{status} Ausgaben
468   \end{itemize}
469   \end{block}
471   \uncover<2>{
472   \begin{block}{Weitere nützliche Optionen}
473   \begin{itemize}
474     \item {\ttfamily git config --global merge.tool vimdiff}
475     \item {\ttfamily git config --global push.default = current}
476     \item {\ttfamily git config --global alias.wdiff 'diff --color-words'}
477     \item …
478   \end{itemize}
479   }
480   \end{block}
481 \end{frameframe}
483 \begin{frameframe}{Repositories erstellen}
484   \begin{block}{Neues, leeres Repository}
485     \ttfamily
486     \footnotesize
487     \$ mkdir project\newline
488     \$ cd project\newline
489     \$ git init\newline
490     Initialized empty Git\newline
491     repository in .../.git/
492   \end{block}
494   \vspace{5mm}
496   \uncover<2>{
497   \begin{block}{Bestehendes Repository "`klonen"'}
498     \ttfamily
499     \footnotesize
500     \$ git clone $<$rep$>$\newline
501     ...
502   \end{block}
503   }
504 \end{frameframe}
506 \begin{frameframe}{Änderungen vornehmen}
507   \begin{block}{Ändern}
508     {\ttfamily
509     \footnotesize
510     \$ vim foo bar\newline
511     \$ git add foo bar
512     }
514     \begin{itemize}
515       \item \texttt{add}, \texttt{rm}, \texttt{mv}
516     \end{itemize}
517   \end{block}
519   \uncover<2>{
520   \begin{block}{Geschichte fortführen/ändern}
521     {\ttfamily
522     \footnotesize
523     \$ git commit
524     }
526     \vspace{5mm}
528     {\ttfamily
529     \footnotesize
530     \$ git reset --hard HEAD\textasciicircum
531     }
533     \begin{itemize}
534       \item \texttt{reset}, \texttt{revert}, \texttt{checkout}
535     \end{itemize}
536   \end{block}
537   }
538 \end{frameframe}
540 \begin{frameframe}{Exkurs: Commit Meldungen schreiben}
541   \begin{itemize}
542     \item Einzeilige, kurze ($<$ 80, optimal $<$ 50 Zeichen)
543         Zusammenfassung
544     \item Leerzeile
545     \item Detaillierte Beschreibung/Erklärung
546     \item nicht vorgeschrieben, aber "`common practice"' und von vielen
547         Tools erwartet
548   \end{itemize}
549 \end{frameframe}
551 \begin{frameframe}{Exkurs: Commit Meldungen schreiben}
552     \footnotesize
553     \begin{verbatim}
554 git-remote: do not use user input in a printf format string
556 'git remote show' substituted the remote name into a string that
557 was later used as a printf format string. If a remote name contains
558 a printf format specifier like this:
560    $ git remote add foo%sbar .
562 then the command
564    $ git remote show foo%sbar
566 would print garbage (if you are lucky) or crash. This fixes it.
567     \end{verbatim}
568 \end{frameframe}
570 \begin{frameframe}{Aus der Geschichte lernen}
571   \begin{block}{Status der Arbeitskopie}
572     \ttfamily
573     \footnotesize
574     \$ git status\newline
575     \$ git diff
576   \end{block}
578   \uncover<2->{
579   \begin{block}{Historie betrachten}
580     \ttfamily
581     \footnotesize
582     \$ git log\newline
583     \$ tig
584   \end{block}
585   }
587   \uncover<3->{
588   \begin{block}{Objekte betrachten}
589     {\ttfamily
590     \footnotesize
591     \$ git show\newline
592     \$ git show HEAD:foo\hfill (siehe {\ttfamily gitrevisions(7)})
593     }
595     \begin{itemize}
596       \item Commits, Trees, Blobs, Tags
597     \end{itemize}
598   \end{block}
599   }
600 \end{frameframe}
602 \begin{frameframe}{Tags}
603   {\ttfamily
604   \footnotesize
605   \$ git tag -m ``$<$Beschreibung$>$'' $<$Name$>$ $<$Commit$>$\newline
606   \$ git tag -l
607   }
609   \vspace{5mm}
611   \begin{itemize}
612     \item "`Zeiger"' auf einen Commit\newline
613       optional mit Metadaten ("'annotated tag"')
614     \item Kennzeichnung von bestimmten Entwicklungsständen (insb.\ Releases)
615     \item "`annotated tag"': Autor, Datum, Beschreibung, optional GnuPG
616       Signatur
617   \end{itemize}
618 \end{frameframe}
620 \begin{frameframe}{Branching und Merging}
621   \begin{itemize}
622     \item Branch: "`automatischer"' Zeiger auf eine Reihe von Commits
623     \item \texttt{HEAD}: Zeiger auf den aktuellen Branch
624     \item \texttt{master}: "`Standard"'-Branch
625     \item Merge: Zusammenführen von zwei (oder mehr) Entwicklungssträngen
626   \end{itemize}
628   \begin{block}{Branch erzeugen}
629     \ttfamily
630     \footnotesize
631     \$ git checkout -b $<$Name$>$
633     \vspace{5mm}
635     \uncover<2>{
636     \$ git branch\newline
637     \hspace*{1em}master\newline
638     * $<$Name$>$
639     }
640   \end{block}
641 \end{frameframe}
643 \begin{frameframe}{Branching und Merging}
644   \begin{block}{Branches zusammenführen}
645     \ttfamily
646     \footnotesize
647     \$ git merge master\newline
648     \$ git rebase master \# nur in privaten Branches!
649   \end{block}
651   \uncover<2>{
652   \begin{block}{Konflikte auflösen}
653     \begin{itemize}
654       \item Konflikte entstehen, wenn die gleiche Stelle unterschiedlich
655         geändert wurde $\Rightarrow$ manuelles Eingreifen nötig
656       \item Commit-Erzeugung wird unterbrochen
657       \item Konfliktanzeiger in den betroffenen Dateien
658       \item manuelle Entscheidung, wie beide Änderungen zusammengeführt werden
659       \item {\ttfamily git mergetool}
660     \end{itemize}
661   \end{block}
662   }
663 \end{frameframe}
665 \begin{frameframe}{Arbeiten mit anderen Repositories}
666   \begin{block}{Repository klonen}
667     \ttfamily
668     \footnotesize
669     \$ git clone <rep>
670   \end{block}
672   \begin{block}{Austauschen von Änderungen}
673     {\ttfamily
674     \footnotesize
675     \$ git pull\newline
676     \$ git push
677     }
679     \vspace{5mm}
681     Alternativ:
682     \begin{itemize}
683       \item \texttt{git format-patch}, \texttt{git send-mail}
684     \end{itemize}
685   \end{block}
686 \end{frameframe}
688 \begin{frameframe}{Arbeiten mit anderen Repositories}
689   \begin{itemize}
690     \item "`remote"': Repository, dessen Änderungen verfolgt werden
691     \item "`remote branch"': Branch, welcher der Zustand in einem anderen
692       Repository wiederspiegelt
693     \item technisch: Branch in einem anderen Namensraum mit anderer Semantik
694   \end{itemize}
696   \vspace{5mm}
698   \begin{block}{Arbeiten mit "`remotes"'}
699     \ttfamily
700     \footnotesize
701     \$ git remote add $<$Name$>$ URL\newline
702     \$ git remote update $<$Name$>$
703     \$ git push $<$Name$>$ \# ggf. zusätzlich Branch angeben
704   \end{block}
705 \end{frameframe}
707 \begin{frameframe}{Repository URLs}
708   \begin{itemize}
709     \item lokal: \texttt{/path/to/repository/}
710     \item http: \texttt{http://domain.tld/repository.git}
711     \item git: \texttt{git://domain.tld/repository.git}
712     \item ssh: \texttt{domain.tld:path/to/repository/}
713   \end{itemize}
714 \end{frameframe}
716 \begin{frameframe}{Ein Beispiel …}
717   \begin{center}
718     \begin{tikzpicture}[x=1mm,y=1mm]
719       \node at (0,0) [circle,draw=red,fill=red!50,thick] (r) {};
720       \node at (5,0) [anchor=west] {Upstream Repo};
722       \uncover<3->{
723       \node at (-20,-30) [circle,draw=green,fill=green!50,thick] (i) {};
724       \node at (-25,-30) [anchor=east] {interner Klon};
725       }
726       \uncover<2->{
727       \draw [->] (r.south west) -- (i.north east);
728       \node at (-12,-15) [anchor=east] {\ttfamily clone};
729       }
731       \uncover<5->{
732       \node at (-25,-45) [circle,draw=black,fill=black!50,thick] (c1) {};
733       \node at (-20,-45) {…};
734       \node at (-15,-45) [circle,draw=black,fill=black!50,thick] (cn) {};
735       \node at (-20,-50) {interne "`Clients"'};
736       }
737       \uncover<4->{
738       \draw [->] (i.south) -- (c1.north);
739       \node at (-20,-40) {\tiny …};
740       \draw [->] (i.south) -- (cn.north);
741       }
743       \uncover<7->{
744       \node at (20,-30) [circle,draw=yellow,fill=yellow!50,thick] (qa) {};
745       \node at (25,-30) [anchor=west] {QA Repo};
746       }
747       \uncover<6->{
748       \draw [->] (i.east) -- (qa.west);
749       \node at (0,-32) [anchor=north] {\ttfamily clone};
750       }
752       \uncover<8->{
753       \draw [<->,dashed] (r.south east) -- (qa.north west);
754       \node at (12,-15) [anchor=west] {\ttfamily remote add up …};
755       }
757       \uncover<9>{
758       \node at (-5,-20)
759         [anchor=north west,draw=black,fill=white,thick,rounded corners,%
760           inner sep=3mm]
761         {\begin{minipage}{55mm}
762           \ttfamily
763           \$ git fetch up\\
764           \$ git checkout master\\
765           \$ git merge up/master\\
766           \$ git mergetool\\
767           \$ git push \# origin master
768         \end{minipage}
769         };
770       }
771     \end{tikzpicture}
772   \end{center}
773 \end{frameframe}
775 \begin{frameframe}{Frontends}
776   \begin{itemize}
777     \item \texttt{tig} (ncurses)
778     \item \texttt{gitk} (Tk, read-only)
779     \item \texttt{qgit} (Qt)
780     \item \texttt{magit} (emacs)
781     \item \texttt{egit} (Eclipse)
782   \end{itemize}
783 \end{frameframe}
785 \begin{frameframe}{Goodies}
786   \begin{itemize}
787     \item<+-> \texttt{git reflog}
788     \item<+-> \texttt{git rebase -i}
789     \item<+-> \texttt{git commit --amend}
790     \item<+-> \texttt{git add -p}
791     \item<+-> \texttt{git stash}
792     \item<+-> \texttt{git bisect}
793     \item<+-> \texttt{git cherry} / \texttt{git-wtf}
794     \item<+-> \texttt{git diff color-words}
795     \item<+-> \texttt{git svn}
796   \end{itemize}
797 \end{frameframe}
799 \begin{frameframe}{\insertshorttitle{}}
800   \begin{center}
801     Vielen Dank für die Aufmerksamkeit!
803     \vspace{10mm}
805     {\Large Gibt es Fragen?}
807     \vspace{10mm}
809     Kontakt:\\
810     Sebastian "`tokkee"' Harl\\
811     $<$tokkee@debian.org$>$
812   \end{center}
813 \end{frameframe}
815 \end{document}
817 % vim: set shiftwidth=2 softtabstop=2 tabstop=8 spelllang=de_de :