Commit Messages
Inhaltsverzeichnis
- 1 Was sind gute Commit Messages?
- 1.1 Aufbau einer Commit Message
- 1.2 Tipps für Gute Commits
- 1.2.1 Ein Commit sollte nie die Buildfähigkeit brechen!
- 1.2.2 Du bist nichts besonderes!
- 1.2.3 Mache einfache Commits!
- 1.2.4 Sei spezifisch und genau! Hilf es einfach zu finden!
- 1.2.5 Erkläre nicht Deinen Code, erkläre warum Du es genau so implementiert hast!
- 1.2.6 Kommuniziere Auffälligkeiten und Besonderheiten!
- 1.2.7 Stelle keine anderen Mitglieder bloß!
- 2 Script zum Erstellen einer ChangeLog
- 3 Quellen
Was sind gute Commit Messages?
Commit Messages sollen anderen Beteiligten an einem Projekt mitteilen, was Du in Deinem Commit getan hast. Damit diese Info effizient und auch elektronisch verwertbar sind (z.B. zur Aufbereitung eines whats_changend.txt) gibt es ein paar Regeln die beachtet werden sollten.
Gute Commit Messages ersparen anderen Beteiligten eine aufwendige Suche und steigern die Effektivität. Gute Commit Messages sind ebenfalls der Baustein für ein treffsicheres Suchen zu späterer Zeit. Der Zeitaufwand für das Schreiben einer aussagekräftigen Message beläuft sich auf geschätzt höchstens 3-5min. Aber dadurch wird das spätere Suchen in der History oder im Sourcecode wesentlich effizienter und der Entwickler kann sich seiner eigentlichen Beschäftigung, dem Programmieren, widmen. Wenn Ihr bisher noch nicht so gearbeitet habt, lest folgende Hinweise und fragt Euch dann ob es nicht besser wäre so zu arbeiten.
Aufbau einer Commit Message
- Die erste Zeile eines Commits besteht immer aus einer kurzen Zusammenfassung Deines Commits. Diese sollte nicht mehr wie 50 Zeichen umfassen. Es ist gute Praxis die Funktion, die logische Einheit oder auch eine Bugnummer gefolgt von einem Doppelpunkt der kurzen Zusammenfassung voran zustellen.
- Hast Du nun noch mehr mitzuteilen, das wird fast immer der Fall sein, dann beachte folgendes.
- Die zweite Zeile bleibt prinzipiell leer!
- Ab der dritten Zeile beginnt Deine ausführlichere Darstellung Deines Commits. Aber auch hier sollte man sich daran halten das alle Zeilen nicht länger wie 72 Zeichen sein sollen. Für die Strukturierung Deiner Punkte kannst Du z.B. diverse Anführungspunkte benutzen wie z.B.
*, -, #
. Schreibe Deine Nachricht in der gegenwartsbezogenen Verlaufsform!
Ein Beispiel aus der Linuxkernelentwicklung. http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=ac04fee0b5c55bbac0858727a4154110b55d3f5a
loop: export module parameters Export 'max_loop' and 'max_part' parameters to sysfs so user can know that how many devices are allowed and how many partitions are supported. If 'max_loop' is 0, there is no restriction on the number of loop devices. User can create/use the devices as many as minor numbers available. If 'max_part' is 0, it means simply the device doesn't support partitioning. Also note that 'max_part' can be adjusted to power of 2 minus 1 form if needed. User should check this value after the module loading if he/she want to use that number correctly (i.e. fdisk, mknod, etc.).
Im Vi bzw. VIM lässt sich die maximale Textbreite mit
set textwidth=72
schnell und einfach auf 72 Zeichen setzen! Ein Eintrag dieser Anweisung in die ~/.vimrc
veranlasst Vi bzw. VIM bei jedem Start diese Textbreite zu benutzen. Siehe auch Beispiel einer .vimrc
Tipps für Gute Commits
Ein Commit sollte nie die Buildfähigkeit brechen!
Als eine goldene Regel für das Committen gilt, dass ein Commit niemals die Funktionalität des Projektes beeinträchtigen sollte. Dies bedeutet, dass jeder andere, der am Projekt mit arbeitet im Stande sein sollte, das Projekt auch mit Deinem Commit noch Bauen können muss. Prüfe Deine Arbeit bevor Du etwas committen willst!
Du bist nichts besonderes!
Jeder denkt, dass er gute Messages schreibt. In den meisten Fällen ist dies auch so. Aber jeder, auch Du, wird nachlässig nach einer gewissen Zeit! Wenn Du denkst, dass Du außergewöhnliche Commits schreibst dann schau kritisch über die letzten 100 Commits, wie viele von denen würdest Du wirklich "außergewöhnlich" bezeichnen? Nur aus Spaß, probiere es einmal.
Mache einfache Commits!
Dies kann man fast wörtlich nehmen, auch komplexen Sachen lassen sich in der Regel in Einzelcommits erledigen. Ein Commit soll nach Möglichkeit ein Problem lösen bzw. eine Neuigkeit einbinden etc. Ein Commit sollte eine logische Einheit bilden. Es kann sich später heraus stellen das genau dieser Commit revertet werden muss, dann soll dies auch mit dem reverten dieses einzelnen Commits möglich sein und nicht durch verschiedenste Commits verteilt sein! Dies kommt besonders zum tragen wenn man mit git bisect
automatisierte Fehlersuche betreibt. Und dies hilft auch beim Erstellen der Commit Messages.
Beachte dies wenn Du eine Commit Message erstellst! Es gibt auch das Gegenteil, eine zu lange Nachricht. Sollte Deine Commit Nachricht lang sein frage Dich ob Du Deinen Commit nicht weiter aufsplittest.
Sei spezifisch und genau! Hilf es einfach zu finden!
Folgende Message hat sicherlich jeder schon gesehen oder gar selber verfasst, die schlechteste aller möglichen Messages!
fixed some bugs
Wow, wer hätte das gedacht! Aber es gibt eigentlich niemanden der absichtlich Bugs einbaut! Natürlich wird Dein Commit dazu da sein, um vorhandene Fehler zu beseitigen.
Wenn Du eine größere Menge an Fehlern gefunden und beseitigt hast, dann schreibe dies auch bitte! Erkläre was Du wo warum gemacht hast. Auch Du könntest mal später nach etwas suchen was du nur noch inhaltlich weist, und genau dann ist eine Suche in den Commit Messages Dein Vorteil. Besser wäre eine Commit Message wie:
Fixed bad allocations in image processing routines
Was das Finden von Commits auch erheblich vereinfacht, sind gewisse thematische Markierungen, indem man den Commit entsprechend einleitet. Dies könnte z.B. der Name eines Moduls (Funktion), eines Branches, Maketarget, Scriptes o.ä. sein. Siehe auch obiges Beispiel aus der Linuxkernelentwicklung.
modulX: Fixed bad allocations in image processing routines
oder um es auf einen bestimmten Vorgang einzugrenzen:
modulX clean up: removed unused variables.
So wird man nach Jahren wieder erkennen, dass hier jemand am ModulXY aufgeräumt hat und kann die Änderung sofort zuordnen.
Sehr nützlich kann es sein, wenn man z.B. lokal viel in Branches arbeitet und hier naturgemäß kleinere Commits macht, diese mit dem Branchnamen markiert.
Branch_cleanups modulX: removed unused variables in ...
So fällt es leichter die Commits auch noch ohne großes drauf schauen, einem Branch zuzuordnen. Wenn der Branchname auch noch ein Thema darstellt, kann man sogar nach einem Merge in den Master-Branch Rückschlüsse auf die Herkunft ziehen, ohne die Historie genauer zu studieren.
Es wird so schnell klar, sich hierbei Gedanken um etwas Organisation zu machen. Das ist noch nicht mal viel Aufwand. Man ist zumindest sich selbst dankbar und froh darüber, ohne großen Aufwand, irgendwann mal einen Commit zu finden, der genau zu einem Problem oder Vorgang passt. Schaue Dir andere Commits an vergleiche diese mit Deinen.
Erkläre nicht Deinen Code, erkläre warum Du es genau so implementiert hast!
Deinen Code kann jeder sehen und lesen, deshalb ist es unnütz zu erklären was Du programmiert hast. Wenn Du überzeugst bist von Deinem Code, und das bist Du doch sicher, erkläre warum Du die Funktionalität genau so aufgebaut hast.
Kommuniziere Auffälligkeiten und Besonderheiten!
Du hast etwas schönes Neues für Dein Projekt, aber da es noch so neu ist und Du nicht alle Varianten prüfen konntest oder wolltest dann teile dies mit!
Adding a special GUI Option for the new entry XY
Dies beschreibt zwar Deine Arbeit, dies aber auch nur halb. Besser ist es zu mindestens noch mitzuteilen was funktioniert und wo es noch Probleme geben könnte.
Tested a seperate GUI entry, it works for the common way, but the function() for coloring may not working for the old models
Stelle keine anderen Mitglieder bloß!
Du hast Code gefunden der nur so vor Fehlern strotzte? Korrigiere ihn einfach. Du warst auch mal Anfänger!
Fixed up heavy wrong typo, created by Beginner
Diese Mitteilung ist nicht besonders hilfreich. Hilfestellungen und Diskussionen sollten in einer Mailingliste oder Forum stattfinden. Folgendes wäre besser.
Fixed wrong typo in function() that come with Revision XYZ
Script zum Erstellen einer ChangeLog
Wenn man die Punkte von oben beachtet kann man mit diesem kleinen Script relativ schnell eine ChanLog Datei erstellen. Das Script ist recht rudimentär und ist sicherlich ausbaufähig und z.B. nur den ChangeLog zwischen zwei Commits oder Tags zu produzieren.
#!/bin/sh
# changelog.sh
# Convert git log to GNU-style ChangeLog file.
# (C) Chris
if test -d ".git"; then
git log --date-order --date=short | \
sed -e '/^commit.*$/d' | \
awk '/^Author/ {sub(/\\$/,""); getline t; print $0 t; next}; 1' | \
sed -e 's/^Author: //g' | \
sed -e 's/>Date: \([0-9]*-[0-9]*-[0-9]*\)/>\t\1/g' | \
# sed -e ‘s/\(.*\)>Date: \([0-9]*-[0-9]*-[0-9]*\)/\2 \1>/g’ | \
sed -e 's/^\(.*\) \(\)\t\(.*\)/\3 \1 \2/g' > ChangeLog
exit 0
else
echo "No git repository present."
exit 1
fi
Das ergibt dann einen solchen Output:
8< --- Carsten Schoenert <c.schoenert_at_t-online_dot_de> 2011-07-10 openvpn: fixing wrong position of patch call in the target ups, a poor copy paste error :-( And one forgotten warning! You should't use your STB as a VPN Gateway from/to the Internet! Every process on the box is running the root previleges, so if someone has taken your box he will full access to your local lan! Stefan Seyfried <seife_at_tuxbox-git_dot_slipkontur_dot_de> 2011-07-09 improve nfsd init script to check exports syntax Stefan Seyfried <seife_at_tuxbox-git_dot_slipkontur_dot_de> 2011-07-09 glibc-pkg: add libnsl to package (needed by samba) Carsten Schoenert <c.schoenert_at_t-online_dot_de> 2011-07-10 openvpn: new target for *the* open source VPN software In the between times some people from the dark side there some quicker than I and make a usable make target for openvpn. I made some little modification for using it in my buildsystem. I added also the opkg build to the target. The opkg package may be usable, i did not tested it realy! The start/stop functionality is yet completely not implemented! So if you have some ideas for the correct implementation feel free to build it. So there is to copy the client.conf.example to /etc/openvpn, or even testing if there is some config, the loaded kernelmodul and so on. Remind: !!! You need the tun.ko kernelmodul to get proper working openvpn !!! Stefan Seyfried <seife_at_tuxbox-git_dot_slipkontur_dot_de> 2011-07-03 add debian-on-coolstream documentation --->8