DEV Community

Cover image for How much effort do you put into commit messages?
Madza
Madza Subscriber

Posted on

How much effort do you put into commit messages?

Are you the 'lazy' type and often write them poorly and unorganized, with no proper explanation of the action and later have trouble navigating in the version tree?

Or do you always put in time and effort, trying to come up with meaningful, easy to understand git commit messages, and push them only when reaching reasonable milestones (finishing updates, adding features, changing the design, etc)?

Personally, I still have to learn to master this too, and, when it comes to the second case, some time ago I came across a nice comment by @devmount, so I decided to share and maybe some of you could find it useful:

Short and clear, thank you for this article!
I tend to use emojis for the type - it shows the type of the commit at first glance, e.g.:

βž• :heavy_plus_sign: when adding a file or implementing a feature
πŸ”¨ :hammer: when fixing a bug or issue
πŸ’š :green_heart: when improving code or comments
⚑ :zap: when improving performance
πŸ“œ :scroll: when updating docs or readme
πŸ”‘ :key: when dealing with security
πŸ” :repeat: when updating dependencies or data
βœ… :white_check_mark: when a new release was built
πŸ‘• :shirt: when refactoring or removing linter warnings
❌ :x: when removing code or files

... and looks awesome in the commit history:

How much effort do you put into commit messages and could you share your own techniques to stay organized in the version tree?

Top comments (26)

Collapse
 
pbnj profile image
Peter Benjamin (they/them) • Edited

I follow the Conventional Commit standard, because it allows me to automate Semantic Versioning in CI pipelines.

Examples:

  • Added a new CLI command? $ git commit -m "feat: add foo command" && git push then CI tests, builds, and increments MINOR version 1.0.9 -> 1.1.0, and publishes artifacts.

  • Fixed a race condition bug? $ git commit -m "fix: fix race condition" && git push then CI tests, builds, and increments PATCH version 1.1.0 -> 1.1.1, and publishes artifacts.

  • If a feature or bug fix is non-backward compatible, then add BREAKING CHANGE in git commit message, which will lead to incrementing the MAJOR version 1.1.1 -> 2.0.

If any change needs some context (eg why the change was made), I add it in the commit message body. More often, I reference the ticket or issue in bug tracker, like:

$ git commit -F- <<EOF
fix: fix race condition

Closes #123
EOF
Enter fullscreen mode Exit fullscreen mode
Collapse
 
tsadarsh profile image
Adarsh TS

This looks interesting. I should look this up soon. Maybe I can reach out to you, if I need some help.

Collapse
 
jack profile image
Jack Williams

I like this, I'm curious, do you use something automated to handle your semantic versioning like this?

Collapse
 
pbnj profile image
Peter Benjamin (they/them)

I use semantic-release for all my projects. I like it because it is language-agnostic.

  1. Add a .releaserc.json config file, which supports a large number of plugins.
  2. Run semantic-release CLI in CI.
Collapse
 
sagar profile image
Sagar • Edited

I'm using git alias for writing beautiful commit messages. Below, I pasted a few lines from the .gitconfig file.

# Git Commit, Add all and Push β€” in one step.
cap = "!f() { git commit -m \"$@\"; }; f"
# NEW.
new = "!f() { git cap \"πŸ“¦ NEW($1): $2\"; }; f"
# IMPROVE.
imp = "!f() { git cap \"πŸ‘Œ IMPROVE($1): $2\"; }; f"
# UPDATE.
up = "!f() { git cap \"✍🏻 UPDATE($1): $2\"; }; f"
# FIX.
fix = "!f() { git cap \"🐞 FIX($1): $2\"; }; f"
# RELEASE.
rlz = "!f() { git cap \"πŸš€ RELEASE($1): $2\"; }; f"
# DOC.
doc = "!f() { git cap \"πŸ“– DOC($1): $2\"; }; f"
# TEST.
tst = "!f() { git cap \"πŸ€– TEST($1): $2\"; }; f"
# BREAKING CHANGE.
brk = "!f() { git cap \"‼️ BREAKING CHANGES($1): $2\"; }; f"
# REMOVE
remove = "!f() { git cap \"πŸ—‘ REMOVE($1): $2\"; }; f"
# REFACTOR
ref = "!f() { git cap \"♻️ REFACTOR($1): $2\"; }; f"
# INITIAL COMMIT
int = "!f() { git cap \"πŸŽ‰ INITIAL COMMIT($1): $2\"; }; f"
Enter fullscreen mode Exit fullscreen mode

Here is an example of an improvement commit.

git imp "scope" "actual commit message"
Enter fullscreen mode Exit fullscreen mode
Collapse
 
madza profile image
Madza

This is awesome πŸ‘
Thanks for sharing πŸ™β€

Collapse
 
eelstork profile image
Tea

There are conventions; without going semantic versioning all the way:

  • 50 chars max is considered good practice (yes that is extremely terse and I treat it as an ideal vs hard constraint)
  • A good commit fixes/adds one thing (and a good message concisely spells this out) imho bothering to detail commits beyond the terse one liner often signals an issue with the commit itself (not always)

In a team environment:

  • Except under duress/time pressure will not skimp on the extra time needed to write a concise, informative commit message.
  • Will definitely review commits more carefully if a concise, informative message is not provided (and likely to ask for an updated diff)

Own work: will stop and ask myself what's going on when I err on the "improved a thing" side of things for any length of time as this could signal I'm losing focus or trying to muddle through/conflating separate issues.

Collapse
 
mat_kovac profile image
Matej Kovac

When working in a team, I always use ticket number and description of a change, where change is always localized, not pushing 50 file changes in a single commit.
This allows me to go back to the ticket when looking at the code to see what were the exact requirements

Don't you just love seeing "WIP" and then 10+ file changed?

On a personal project, I always use some meaningful message, it just helps when looking at git blame and timeframes

Collapse
 
yo profile image
Yoginth • Edited

Here are my examples!

$ git commit -am "Update icons in dark mode and Closes #256"
$ git commit -am "Add a new class to support mobile devices and Closes #259"
Enter fullscreen mode Exit fullscreen mode
Collapse
 
ravenblood7 profile image
Juan Jaques du Preez • Edited

Did you know a commit can be quite long actually? I usually have a short title like 'Ticket Number: short description' and then follow with details in a short paragraph.

It may be overkill but commits aren't for you. It's for the poor maintainer trying to add a new feature a year from now. It helps for them to know what the hell you were thinking when you made the change.

Collapse
 
gawonmi profile image
gawonmi

this

Collapse
 
heroincommunity profile image
German Chyzhov • Edited

We are using strict git conventions at our project.
It includes branch naming like [feature|bugfix]/XXX-YYY-3-words-description, where XXX is a short name of project in Jira and YYY is a number of ticket.

For git commits we are using rules:
1) Name like XXX-YYY Do something
2) Name should be up to 80 symbols, detailed description if needed comes as new lines
3) Name should have imperative voice like "Do...", "Make...", "Fix..." instead of "Did","Making", "Fixes"

PR's should have the same naming conventions as git commits.

Collapse
 
madza profile image
Madza

Talking about being organized πŸ’―πŸ‘

Collapse
 
michelledev3 profile image
michelledev

I think I will remember and bam, 10 commits later--no idea. I have been getting better with specifics, but sometimes I fall back into bad habits. Nice article Madza!

Collapse
 
patarapolw profile image
Pacharapol Withayasakpunt

git commit -m update

Seriously lazy sometimes.

Collapse
 
jessekphillips profile image
Jesse Phillips

Quite a bit. But it is less about the message and more about the commit itself. I have too much to say on the subject.

Collapse
 
madza profile image
Madza

Thank you for sharing πŸ™β€