Commit
als Präsentation ▻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
“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:
▻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
- Dateien Löschen - Kapitel im Pro Git Buch
- Conventional Commits