-
Notifications
You must be signed in to change notification settings - Fork 2
Commit Guide
Example 1 of a good commit:
setup.py: Modify feature setup
This modification ensures that branch discovers the new feature setup correctly.
Closes https://github.com/[ISSUE-URL]
- setup.py: Modify feature setup: Describe the change in maximum of 50 characters.
- This modification.. ..correctly: Describe the reasoning of your changes in maximum of 72 characters per line.
- Closes https://github.com/[ISSUE-URL]: Mention the URL of the issue it closes or fixes.
Example 2 of a good commit:
configure.py: Fix docstring typo
This fixes the typo and changes it from wether --> whether.
Fixes https://github.com/[ISSUE-URL]
- configure.py: Fix docstring typo: Describe the change in maximum of 50 characters.
- This fixes.. ..whether.: Describe the reasoning of your changes in maximum of 72 characters per line.
- Closes https://github.com/[ISSUE-URL]: Mention the URL of the issue it closes or fixes.
We are looking heavily at the maintainability of the code.
Code is more often read than written!
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:
setup.py: Change point' entrypoint
This entrypoint ensures that branch discovers the point correctly.
It helps not writing more functions inside lib
for this.
Closes https://github.com/[ISSUE-URL]
Example:
setup.py: Modify feature setup
-
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, not Adding something or Added something).
- No trailing period.
- Tag
Example:
This modification ensures that branch discovers the new feature setup correctly.
-
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:
Fixes https://github.com/[ISSUE-URL]
- Should use the Fixes keyword if your commit fixes a bug, or Closes if it adds a feature/enhancement.
- In some situations, e.g. bugs overcome in documents, the difference between Fixes and Closes 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 with Fixes. If an issue is labelled with type/bug you should always use Fixes. For all other issues use Closes.
- Should use full URL to the issue.
- There should be a single space between the Fixes or Closes and the URL.
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.
See also https://wiki.gnome.org/Git/CommitMessages
Example 1 (fixed bug):
setup: Install .precommit via package_data
When installing the .precommit to distutils.sysconfig.get_python_lib, we ignore that this is not the installation directory in every case. Thus it is easier, more reliable and platform independent to let distutils install it by itself.
Fixes https://github.com/[ISSUE-URL]
Example 2 (implemented feature):
Linter: Output command on debug
This massively helps debugging linters.
Closes https://github.com/[ISSUE-URL]
Example 3 (fixed typo):
ConsoleInteraction.print_result: Fix docstring typo
wether --> whether.
Closes https://github.com/[ISSUE-URL]
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.