0 |
\documentclass[aspectratio=1610]{beamer} |
1 |
\usetheme{metropolis} |
2 |
\usepackage[utf8]{inputenc} |
3 |
\usepackage{booktabs} |
4 |
\usepackage{lmodern} |
5 |
\usepackage{FiraSans} |
6 |
\usepackage{minted} |
7 |
%\usepackage{pgfpages} |
8 |
%\pgfpagesuselayout{4 on 1}[a4paper,border shrink=1cm,landscape] |
9 |
\title{Was ist eigentlich Darcs?} |
10 |
\date{06.07.2023} |
11 |
\author{Jens Grassel} |
12 |
\institute{Wegtam GmbH} |
13 |
\begin{document} |
14 |
\maketitle |
15 |
|
16 |
\section{Versionsverwaltung} |
17 |
\begin{frame}[fragile]{Früher so...} |
18 |
Wir ändern etwas und tun vorher etwas in der Art: |
19 |
\begin{minted}{bash} |
20 |
% cp quelltext.c quelltext.c.bak |
21 |
\end{minted} |
22 |
Dann ändern wir nochmal was: |
23 |
\begin{minted}{bash} |
24 |
% cp quelltext.c quelltext.c.bak2 |
25 |
\end{minted} |
26 |
Und so weiter\ldots |
27 |
\end{frame} |
28 |
|
29 |
\begin{frame}{Versionsverwaltungssoftware} |
30 |
Software nimmt uns das mittlerweile ab und es gab eine \textit{Evolution} von lokaler über zentraler zu verteilter Versionsverwaltung. |
31 |
\begin{alertblock}{Aber welche nehmen wir?} |
32 |
\begin{itemize} |
33 |
\item CVS (zentral) - Bitte nicht! |
34 |
\item SVN (zentral) - Bitte auch nicht! |
35 |
\item Git (verteilt) |
36 |
\item Mercurial (verteilt) |
37 |
\item Darcs (verteilt) |
38 |
\item Pijul (verteilt) |
39 |
\item Fossil (verteilt \textit{und} Tickets etc.pp. mit drin) |
40 |
\item Das kann den ganzen Tag so weitergehen. ;-) |
41 |
\end{itemize} |
42 |
\end{alertblock} |
43 |
\end{frame} |
44 |
|
45 |
\section{Aber Git hat doch gewonnen!?!} |
46 |
\begin{frame}{Ja, kann man so sagen.} |
47 |
Die Vorteile von Git: |
48 |
\begin{itemize} |
49 |
\item es ist sehr schnell |
50 |
\end{itemize} |
51 |
\end{frame} |
52 |
|
53 |
\begin{frame}{Grundlegende Abläuft mit Git} |
54 |
Ihr kennt das sicherlich: |
55 |
\begin{itemize} |
56 |
\item \mintinline{bash}{edit $FILE} |
57 |
\item \mintinline{bash}{git add $FILE} |
58 |
\item \mintinline{bash}{git commit} |
59 |
\item \mintinline{bash}{git push} |
60 |
\item Argh, Fehlermeldung! |
61 |
\item \mintinline{bash}{git fetch} |
62 |
\item \mintinline{bash}{git rebase} |
63 |
\item \mintinline{bash}{git push} |
64 |
\end{itemize} |
65 |
Und über \mintinline{bash}{git checkout / branch / switch} reden wir noch gar nicht. |
66 |
\end{frame} |
67 |
|
68 |
\begin{frame}{Auch immer beliebt...} |
69 |
\begin{itemize} |
70 |
\item \mintinline{bash}{git rebase / git merge} |
71 |
\item stundenlanges Beheben von Mergekonflikten |
72 |
\end{itemize} |
73 |
Um fair zu sein: Das passiert eigentlich nur, wenn mehrere Leute an einem Repository arbeiten. |
74 |
\begin{alertblock}{Aber ist das nicht der Sinn von Versionsverwaltung?} |
75 |
\end{alertblock} |
76 |
\end{frame} |
77 |
|
78 |
\section{Was macht Darcs anders?} |
79 |
\begin{frame}{Grundlegende Abläufe mit Darcs} |
80 |
Recht ähnlich, aber weniger: |
81 |
\begin{itemize} |
82 |
\item \mintinline{bash}{edit $FILE} |
83 |
\item \mintinline{bash}{darcs record} |
84 |
\item \mintinline{bash}{darcs push} |
85 |
\item \mintinline{bash}{darcs pull} |
86 |
\end{itemize} |
87 |
Warum? $\rightarrow$ Es gibt keine \textit{Staging Area}! |
88 |
\end{frame} |
89 |
|
90 |
\begin{frame}[fragile]{Interaktion mit dem Menschen!} |
91 |
Alle Kommandos von Darcs sind per se interaktiv! |
92 |
\begin{minted}[fontsize=\small]{diff} |
93 |
% darcs record |
94 |
addfile ./README.md |
95 |
Shall I record this change? (1/2) [ynW...], or ? for more options: y |
96 |
hunk ./README.md 1 |
97 |
+# Was ist eigentlich Darcs? |
98 |
+ |
99 |
+Es wird das Metropolis-Theme genutzt. |
100 |
+ |
101 |
+Die Folien können mittels `pdflatex -shell-escape slides.tex` erzeugt werden. |
102 |
+ |
103 |
Shall I record this change? (2/2) [ynW...], or ? for more options: y |
104 |
Do you want to Record these changes? [Yglqk...], or ? for more options: y |
105 |
Finished recording patch 'README' |
106 |
\end{minted} |
107 |
\end{frame} |
108 |
|
109 |
\begin{frame}{Sehr viel genauere Erfassung von Änderungen!} |
110 |
\begin{itemize} |
111 |
\item Patches meist zeilengenau erfaßbar |
112 |
\item damit [fast] keine Notwendigkeit für Branches mehr |
113 |
\item detaillierte Änderungserfassung beim Commit (record) |
114 |
\item Patches für einen Tag (Release) einzeln auswählbar |
115 |
\item Abhängigkeiten zwischen Patches veränderbar |
116 |
\end{itemize} |
117 |
\end{frame} |
118 |
|
119 |
\begin{frame}{Die Lösung aller Probleme?} |
120 |
Nein, auch Darcs hat Schwächen: |
121 |
\begin{enumerate} |
122 |
\item Konflikte bzw. deren Lösung landen nicht im Repository |
123 |
\begin{itemize} |
124 |
\item Patch kommt rein $\rightarrow$ Konflikte |
125 |
\item lokal behoben |
126 |
\item aber kann nicht per Push gesendet werden, da nicht snapshot-basiert |
127 |
\end{itemize} |
128 |
\item darcs clone bei großen Repos nicht so schnell wie andere DVCS |
129 |
\item häufig lokaler Index "kaputt" |
130 |
\begin{itemize} |
131 |
\item leicht zu beheben: \mintinline{bash}{darcs check / repair} |
132 |
\end{itemize} |
133 |
\item darcs send schwieriger aufzusetzen als git send-email |
134 |
\item das sog. "exponential merge problem" |
135 |
\begin{itemize} |
136 |
\item tritt eigentlich seit Version 2 nicht mehr auf |
137 |
\end{itemize} |
138 |
\end{enumerate} |
139 |
Außerdem gibt es kein "force push", aber ist das wirklich ein Nachteil? |
140 |
\end{frame} |
141 |
|
142 |
\begin{frame}{Patch vs. Snapshot} |
143 |
"patch based" |
144 |
\begin{itemize} |
145 |
\item nur einzelne Patches und deren Abhängigkeiten gespeichert |
146 |
\item Reihenfolge egal, wenn gleiches Ergebnis |
147 |
\item langsamer, da ggf. viele Berechnungen ($Zustand = \sum P$) |
148 |
\end{itemize} |
149 |
"snapshot based" |
150 |
\begin{itemize} |
151 |
\item immer der gesamte Zustand aller Dateien im Repository gespeichert |
152 |
\item schnell, da immer "alles da" |
153 |
\item größerer Platzbedarf ($Platz = Anzahl_{Commits} * \sum Platz_{Datei}$) |
154 |
\begin{itemize} |
155 |
\item durch interne Komprimierung reduziert |
156 |
\end{itemize} |
157 |
\item häufiger Konflikte bei unterschiedlichem \textit{HEAD} |
158 |
\end{itemize} |
159 |
\end{frame} |
160 |
|
161 |
\section{Was sind die Unterschiede im Alltag?} |
162 |
|
163 |
\begin{frame}{Flexibleres Arbeiten mit Darcs} |
164 |
\begin{enumerate} |
165 |
\item Commit von "Hunks" statt ganzen Dateien $\rightarrow$ kleinere Patches |
166 |
\item weniger (keine) Gedanken um Merge-Konflikte |
167 |
\begin{itemize} |
168 |
\item a.k.a. "Bin ich auf dem aktuellen HEAD?" |
169 |
\end{itemize} |
170 |
\item "spontane" Zweige ("spontaneous branches") |
171 |
\begin{itemize} |
172 |
\item a.k.a. selektives Auswählen der Änderungen für einen Patch |
173 |
\end{itemize} |
174 |
\item flexibleres Tagging |
175 |
\begin{itemize} |
176 |
\item manuelle Auswahl der Patches, die zu einem Tag gehören sollen |
177 |
\end{itemize} |
178 |
\end{enumerate} |
179 |
\end{frame} |
180 |
|
181 |
\begin{frame}{kleinere Patches} |
182 |
Die Auswahl von einzelnen Änderungen (Hunks) erleichtert es: |
183 |
\begin{itemize} |
184 |
\item gezielt Änderungen in einem Commit zusammenzufassen |
185 |
\item bzw. Änderungen auszulassen |
186 |
\end{itemize} |
187 |
\end{frame} |
188 |
|
189 |
\begin{frame}{weniger (keine) Gedanken um Merge-Konflikte} |
190 |
Es gibt auch noch Merge-Konflikte, aber eher selten, da: |
191 |
\begin{itemize} |
192 |
\item kleinere (bessere?) Patches |
193 |
\item nicht ganz so wichtig auf dem gleichen Stand zu sein |
194 |
\end{itemize} |
195 |
Letztlich: Dadurch, daß Konflikte bzw. deren Lösungen halt nicht im Repo |
196 |
auftauchen, wird man da sehr viel sensibler für. ;-) |
197 |
\end{frame} |
198 |
|
199 |
\begin{frame}{"spontane" Zweige ("spontaneous branches")} |
200 |
Die gezielte Auswahl von Änderungen macht es möglich, daß an mehreren |
201 |
Dingen zeitgleich gearbeitet werden kann. |
202 |
\begin{itemize} |
203 |
\item hat natürlich Grenzen |
204 |
\end{itemize} |
205 |
\end{frame} |
206 |
|
207 |
\begin{frame}{flexibleres Tagging} |
208 |
\mintinline{bash}{darcs tag} |
209 |
\begin{itemize} |
210 |
\item per Vorgabe alle Patches seit dem letzten Tag |
211 |
\item aber auch gezielte Auswahl möglich |
212 |
\item ermöglicht einfachen Release auch wenn schon andere Patches mit drin sind |
213 |
\end{itemize} |
214 |
\end{frame} |
215 |
|
216 |
\begin{frame}{Weniger "Gedanken um das VCS-Tooling"} |
217 |
\begin{itemize} |
218 |
\item intuitivere Bedienung |
219 |
\item kein rebase mehr, da quasi "frei Haus" mit darcs |
220 |
\item kein internalisiertes Umschiffen von Git-Tücken mehr |
221 |
\item Erkenntnis, das "web based pull requests" womöglich ein Fehler sind |
222 |
\begin{itemize} |
223 |
\item Review primär per E-Mail (machen auch viele große Git-Projekte) |
224 |
\end{itemize} |
225 |
\item selbst knifflige Sachen immer leicht lösbar (unrecord, revert) |
226 |
\end{itemize} |
227 |
\end{frame} |
228 |
|
229 |
\begin{frame}{Aber \textit{alle} nehmen Git!} |
230 |
Dann machen wir Git etwas "darcsiger" |
231 |
\begin{enumerate} |
232 |
\item Anpassung des Diff-Algorithmus |
233 |
\begin{itemize} |
234 |
\item \mintinline{bash}{git config --global diff.algorithm histogram} |
235 |
\item sogar besser als \textit{patience} von Darcs |
236 |
\item gibt bessere Diffs/Patches |
237 |
\end{itemize} |
238 |
\item Nutzen von \mintinline{bash}{git commit -p} |
239 |
\begin{itemize} |
240 |
\item ermöglicht wie darcs einzelne Hunks auszuwählen, die ins Commit sollen |
241 |
\end{itemize} |
242 |
\end{enumerate} |
243 |
\end{frame} |
244 |
|
245 |
\begin{frame}{Fazit} |
246 |
\begin{itemize} |
247 |
\item macht \textit{mehr Spaß} / funktioniert für mich intuitiver |
248 |
\item ist kein Allheilmittel |
249 |
\item E-Mail als Medium für Patches wiederentdeckt |
250 |
\item der Kopf ist freier als mit Git |
251 |
\end{itemize} |
252 |
\center{\Large{Probiert es einfach mal aus, es lohnt sich!}}\\ |
253 |
\end{frame} |
254 |
|
255 |
\begin{frame}[standout]{} |
256 |
\Huge{Vielen Dank!}\\ |
257 |
\small{http://darcs.net - Darcs Homepage}\\ |
258 |
\small{https://darcsbook.acmelabs.space/ - The Darcs Book} |
259 |
\end{frame} |
260 |
\end{document} |