-
Notifications
You must be signed in to change notification settings - Fork 12
Commit Guidelines
Adapted from the Original Source: https://api.coala.io/en/latest/Developers/Writing_Good_Commits.html and https://wiki.gnome.org/Git/CommitMessages
Code is more often read than written!
To all the first timers to Open Source this guide might sound like an overkill, but a good descriptive commit message is a very essential part of having a maintainable "codebase".
We need good code and for achieving it, we ensure that every change to our code (i.e. the commits) is making it better.
A good commit is atomic. It should describe one change and not more.
Why? Because we may create more bugs if we had more changes per commit.
A commit message consists of 3 parts:
- shortlog
- commit body
- issue reference
Example:
.editorconfig: Add a new section Adds a new section {.py} to the .editorconfig file in the project. Closes https://github.com/wtfpython-web/wtfpython-web/issues/13
Example:
.editorconfig: Add a new section
-
Maximum of 50 characters.Keeping subject lines at this length ensures that they are readable, and explains the change in a concise way.
-
Should describe the change - the action being done in the commit.
-
Should not include WIP prefix.
-
Should have a tag and a short description separated by a colon (
:
)-
Tag
- The file or class or package being modified.
- Not mandatory.
-
Short Description
- Starts with a capital letter.
- Written in imperative present tense (i.e.
Add something
, notAdding something
orAdded something
). - No trailing period.
-
Tag
Example:
Adds a new section {.py} to the .editorconfig file in the project.
-
Maximum of 72 chars excluding newline for each line.The recommendation is to add a line break at 72 characters, so that Git has plenty of room to indent text while still keeping everything under 80 characters overall.
-
Not mandatory - but helps explain what you're doing.
-
Should describe the reasoning for your changes. This is especially important for complex changes that are not self explanatory. This is also the right place to write about related bugs.
-
First person should not be used here.
The bot will complain if the 50/72 rule is not followed.
Example:
Closes https://github.com/wtfpython-web/wtfpython-web/issues/13
- Should use the
Fixes
keyword if your commit fixes a bug, orCloses
if it adds a feature/enhancement. - In some situations, e.g. bugs overcome in documents, the difference
between
Fixes
andCloses
may be very small and subjective. If a specific issue may lead to an unintended behaviour from the user or from the program it should be considered a bug, and should be addresed withFixes
. If an issue is labelled withtype/bug
you should always useFixes
. For all other issues useCloses
. - Should use full URL to the issue.
- There should be a single space between the
Fixes
orCloses
and the URL.
Note
- The issue reference will automatically add the link of the commit in the issue.
- It will also automatically close the issue when the commit is accepted.
.. seealso:: https://wiki.gnome.org/Git/CommitMessages
If you have previously made a commit and update it on a later date, it is advisable to also update the commit message accordingly.
In order to do this one can use the amend function as is described here.
- An atomic commit is way easier to review. The reviewer thus will be able to review faster and find more bugs due to the lower complexity of the change.
- Atomic commits are like good objects in object oriented programming - you can split up a bigger thing into many small objects. Reducing complexity is the key to developing good software and finding its bug before they occur.
- Good commit messages make it easy to check at a glance what happened in a time range.
- It is way easier to revert single changes without side effects. Reverting multiple commits at a time is easy, reverting a part of a commit is not.
-
git blame
will be much more effective. It is the best documentation you can get. The older your code is, the more documentation it has. The better the commit messages are, the better is your hidden documentation. Your commit messages document the reason for every single change you did to any line. -
git bisect
will be much more effective. If you bisect through atomic commits to find the commit which caused a bug, you should be able to identify the real cause of the bug fastly. Good commit messages and atomicity of commits are key to that ability.