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[]
102 {
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}
134 }
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%
147 }
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 :