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[]
128 {
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}
160 }
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%
173 }
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 \end{itemize}
782 \end{frameframe}
784 \begin{frameframe}{Goodies}
785 \begin{itemize}
786 \item<+-> \texttt{git reflog}
787 \item<+-> \texttt{git rebase -i}
788 \item<+-> \texttt{git commit --amend}
789 \item<+-> \texttt{git add -p}
790 \item<+-> \texttt{git stash}
791 \item<+-> \texttt{git bisect}
792 \item<+-> \texttt{git cherry} / \texttt{git-wtf}
793 \item<+-> \texttt{git diff color-words}
794 \item<+-> \texttt{git svn}
795 \end{itemize}
796 \end{frameframe}
798 \begin{frameframe}{\insertshorttitle{}}
799 \begin{center}
800 Vielen Dank für die Aufmerksamkeit!
802 \vspace{10mm}
804 {\Large Gibt es Fragen?}
806 \vspace{10mm}
808 Kontakt:\\
809 Sebastian "`tokkee"' Harl\\
810 $<$tokkee@debian.org$>$
811 \end{center}
812 \end{frameframe}
814 \end{document}
816 % vim: set shiftwidth=2 softtabstop=2 tabstop=8 spelllang=de_de :