Code

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