In einem fiktiven Projekt werden Daten erzeugt und ausgewertet. Das Projekt besteht aus folgenden drei Dateien:
generate_data.py
from math import sin, pi
from random import gauss
from numpy import linspace
def noisy_sine_wave(x, period, phase, noise=0.1):
return sin((x + phase) / period * 2 * pi) + gauss(mu=0, sigma=noise)
if __name__ == '__main__':
start = 0
stop = 10
num_points = 100
for x in linspace(start, stop, num_points):
y = noisy_sine_wave(x, period=4.0, phase=3.0)
print x, y
plot_data.plt
set terminal png
set output "sine_wave.png"
plot "sine_wave.dat" using 1:2
generate_and_plot.sh
python generate_data.py >sine_wave.dat
gnuplot plot_data.plt
Zum Ausprobieren: Speichert man die drei Dateien im gleichen Verzeichnis, werden durch Aufruf von
$ bash generate_and_plot.sh
die fiktiven Daten erzeugt und eine grafische Darstellung in die Datei sine_wave.png
geschrieben.
Die oben gezeigten Dateien waren die “alte Version” des Projekts.
Nach einiger Zeit wurde das fiktive Projekt weiterentwickelt und der Inhalt der Dateien ist jetzt dieser (“neue Version”):
generate_data.py
from math import sin, pi
from random import gauss, uniform
from numpy import linspace
def noisy_sine_wave(x, period, rel_phase, noise=0.1):
return sin((x / period + rel_phase) * 2 * pi) + gauss(mu=0, sigma=noise)
if __name__ == '__main__':
start = 0
stop = 10
num_points = 100
T = uniform(3.8, 4.2)
ph = uniform(0.7, 0.8)
slope = uniform(0.5, 0.6)
for x in linspace(start, stop, num_points):
y = noisy_sine_wave(x, period=T, rel_phase=ph)
print x, y + x * slope
plot_data.plt
set terminal png
set output "sine_wave.png"
set xlabel "X values"
set ylabel "Y values"
set grid
set key top left
measured_data = "sine_wave.dat"
# initial guess for the fit parameters
period = 4
phase = 3
f(x) = sin((x + phase) / period * 2 * pi) + a * x
fit f(x) measured_data using 1:2 via phase, period, a
plot measured_data using 1:2 lc "black" title "Measured data", \
f(x) lc "red" title "Best fit"
generate_and_plot.sh
python generate_data.py >sine_wave.dat
gnuplot plot_data.plt
Konfiguriere Git:
$ git config --global user.name <Vorname> <Nachname>
$ git config --global user.email <E-Mail-Adresse>
Diese beiden Angaben braucht Git, um einen Autor in die Commits einzutragen.
$ git config --global color.ui auto
Damit sieht die Ausgabe von Git übersichtlicher aus.
$ git config --global core.editor <Name des Editors>
Hiermit legt man fest, welcher Texteditor von Git gestartet wird, wenn eine Eingabe (z.B. Commitmessage) verlangt ist. Am einfachsten nimmt man gedit
oder nano
. Experten können natürlich auch vim
oder emacs
benutzen.
Die Einstellungen müssten in der Datei ~/.gitconfig
gespeichert sein. Prüfe es mit cat
o.ä. nach!
Das fiktive Projekt ist in einem Git-Repository unter der Adresse https://sus.ziti.uni-heidelberg.de/Lehre/WS1718_Tools/GIT/uebung.git
enthalten.
Klone das Repository und benutze gitk
, git log
und git show
, um es zu betrachten und die Entwicklungsgeschichte nachzuverfolgen.
Mache ein paar Änderungen an den Dateien des Projekts, oder lösche eine Datei.
Benutze git status
und git diff
, um zu überprüfen, ob die Dateien noch in ihrem ursprünglichen Zustand sind oder nicht.
Beobachte, wie die Ausgabe von git diff
sich verhält, je nach dem, welche Art von Änderung es gibt (fehlende Zeilen, neu hinzugekommene Zeilen, geänderte Wörter).
Benutze git checkout -p
oder git checkout -- <Dateiname>
um die ursprüngliche Version einer Datei wiederherzustellen, bzw. eine gelöschte Datei wiederherzustellen.
Erstelle neue Branches, die zu Beginn auf die neueste Version des Projekts verweisen.
Mache in jedem Branch ein oder mehrere neue Commits, in denen das Verhalten der fiktiven Skripte geändert ist. (Gib jeweils sinnvolle Commit-Messages an)
Beispiele für mögliche Änderungen:
Wechsle zwischen den Branches, um jeweils die ursprüngliche Version oder eine der neuen Versionen wiederherzustellen.
Versuche, mit git merge
mindestens zwei der neuen Varianten in die ursprüngliche Version zu übernehmen.
Beobachte, ob es einen “echten” Merge-Commit gibt (mit mehr als einem Vorgänger), oder nur einen “fast forward”. Versuche zu verstehen, warum.
Falls es einen Merge-Konflikt gibt, versuche zu verstehen, warum. Versuche, den Konflikt zu lösen.
Nachdem ein Merge erfolgreich war, lösche den Branch, in dem die neue Version entstanden ist.
Lösche einen Branch mit einem anderen “Experiment”, das nicht in die “Hauptversion” übernommen werden soll.