Fork me on GitHub

Web Development

Ein Lehrbuch für das Informatik oder Medien-Informatik Studium.

Mit git add bereiten wir einen Commit vor, mit git commit führen wir ihn durch - aber was ist ein Commit? Wofür verwendet man ihn?

Chaos

Am Anfang erlebt man Programmieren oft als chaotischen Vorgang

Illustration: chaotisch rumrennen

“Hilfe, mein Programm geht nicht, ich ändere mal was in Zeile 2 - nö ist nicht besser geworden - dann vielleicht Zeile 4 - hm, jetzt ist die Fehlermeldung anders - ist das gut oder ist das schlecht?…” u.s.w.

Stabilität

Commits helfen Stabilität in den Prozess zu bringen:

Illustration: gemütlich sitzen

Von Commit zu Commit arbeiten

  • Ich beginne mit einem (noch unfertigen, aber) funktionierenden Programm
  • ich mache eine kleine Änderung / Erweiterung, es klappt nicht sofort
  • ich behebe alle Fehler
  • und erreichen einen konsistenten, funktionierenden Zustand
  • Jetzt mache ich einen Commit.

Nun kann ich in Ruhe eine Pause machen, meine Arbeit unterbrechen, morgen erst weitermachen - ich hinterlasse einen guten Zustand.

Commit als abgeschlossener Arbeitsschritt

In einem Commit bündelt man also zusammen gehörende Arbeitsschritte, zum Beispiel:

  • Ein Bild zum Projekt hinzufügen
  • Den <img> Tag in die HTML-Datei einfügen

Oder

  • Ein Formular in die Webseite einbauen
  • Im Stylesheet Einträge für das Formular machen

Oder

  • Eine Bild-Datei aus dem Repository löschen
  • Den <img> Tag aus der HTML-Datei entfernen

Commit Message

Zu jedem Commit speichert man eine Zeile Beschreibung, die Commit-Message. Bei einem Projekt das schon länger läuft sieht das dann so aus:

$ git log --oneline
e5166ac added json parser to user stamps
009cd27 download as json is now possible in user stempelheft section
f98832a added export to json button in user stempelheft
81e98f8 refactor: move /talks  to /user/:user_id/talks
9772224 display link + location on front page
74258d9 fix migrations for new categories to work with postgres 9
3af38d1 replace font because umlauts missing. discern web+game in categories
39eee45 clean up event form and show-view for event
6a8fe6c add missing partial back in
645b566 impersonate in staging

Die git Messages erzählen die Geschichte des Projekts. Wenn ich nach zwei Wochen Urlaub zurück komme und wissen will was inzwischen im Projekt passiert ist, dann lese ich zuerst einmal die git Messages.

Konventionen für Commit Messages

In professionellen Software Projekten gibt es oft genaue Vorschriften wie Commit Messages formuliert sein müssen.

Für den Anfang reichen einige ganz simple Regeln:

  • Die Commit Message ist in englischer Sprache
  • Sie beschreibt die Änderung im Code kurz und prägnant

Am Anfang der Commit Message kann man den Typ der Änderung bekannt geben, mit folgenden Abkürzungen:

  • fix: ein Fehler wurde behoben, das Programm funktioniert jetzt wieder
  • feat: ein neues Feature wurde eingebaut, das Programm kann jetzt mehr als vorher
  • refactor: der Code wurde verbessert, das Programm tut das selbe wie zuvor

Beispiel: Einfügen

Ich bearbeite eine Webseite. Ich füge eine neue Bilddatei ein und verändere das Stylesheet:

$ git status
Auf Branch main
Änderungen, die nicht zum Commit vorgemerkt sind:
  (benutzen Sie "git add <Datei>...", um die Änderungen zum Commit vorzumerken)
  (benutzen Sie "git restore <Datei>...", um die Änderungen im Arbeitsverzeichnis zu verwerfen)
	geändert:       index.html
	geändert:       styles.css

Unversionierte Dateien:
  (benutzen Sie "git add <Datei>...", um die Änderungen zum Commit vorzumerken)
	barcamp_logo.svg

keine Änderungen zum Commit vorgemerkt (benutzen Sie "git add" und/oder "git commit -a")

Es gibt also eine neue Datei und zwei Veränderungen in meinem Projekt. Ich teste die Webeseite nochmal im Browser, um sicher zu stellen, dass das Projekt in einem guten Zustand ist und keine Errors enthält.

Diese drei Änderungen packe ich zusammen in einen Commit:

$ git status
Auf Branch main
Zum Commit vorgemerkte Änderungen:
  (benutzen Sie "git restore --staged <Datei>..." zum Entfernen aus der Staging-Area)
	neue Datei:     barcamp_logo.svg
	geändert:       index.html
	geändert:       styles.css

$ git commit -m 'add logo and some styling'
[main f8a9f82] add logo and some styling
 3 files changed, 5 insertions(+)
 create mode 100644 barcamp_logo.svg

Beispiel: Löschen

Ich will ein Bild aus der Webseite entfernen. Zuerst entferne ich den img Tag aus der HTML Datei, danach ist der Status so:

$ git add index.html
$ git status
Auf Branch main
Zum Commit vorgemerkte Änderungen:
  (benutzen Sie "git restore --staged ..." zum Entfernen aus der Staging-Area)
	geändert:       index.html

Dann lösche ich die Bilddatei selbst mit dem Befehl git rm - damit wird die Datei aus der Working copy gelöscht, und der lösch-Befehl gestaged. Danach ist der Status so:

$ git rm barcamp_logo_2019.svg
rm 'barcamp_logo_2019.svg'

$ git status
Auf Branch main
Zum Commit vorgemerkte Änderungen:
  (benutzen Sie "git restore --staged <Datei>..." zum Entfernen aus der Staging-Area)
	gelöscht:       barcamp_logo_2019.svg
	geändert:       index.html

Nun kann ich den Commit abschließen:

$ git commit -m "remove old logo"
[main 7de4c39] remove old logo
 2 files changed, 3 deletions(-)
 delete mode 100644 barcamp_logo_2019.svg

Ist die Datei damit auch auf dem Remote Repository gelöscht? Nein!

Damit das Remote Repository auch erfährt, dass die Datei gelöscht wurde muss ich erst Pushen:

$ git status
Auf Branch main
Ihr Branch ist 2 Commits vor 'origin/main'.
  (benutzen Sie "git push", um lokale Commits zu publizieren)

nichts zu committen, Arbeitsverzeichnis unverändert

$ git push origin main
Objekte aufzählen: 9, fertig.
Zähle Objekte: 100% (9/9), fertig.
Delta-Kompression verwendet bis zu 8 Threads.
Komprimiere Objekte: 100% (6/6), fertig.
Schreibe Objekte: 100% (7/7), 636 Bytes | 636.00 KiB/s, fertig.
Gesamt 7 (Delta 4), Wiederverwendet 0 (Delta 0), Pack wiederverwendet 0
To gitlab.mediacube.at:bjelline/barcamp.git
   cd1ee3c..7de4c39  main -> main

Siehe auch