Skip to content

Instantly share code, notes, and snippets.

@lisawolderiksen
Last active November 11, 2024 09:31
Show Gist options
  • Save lisawolderiksen/a7b99d94c92c6671181611be1641c733 to your computer and use it in GitHub Desktop.
Save lisawolderiksen/a7b99d94c92c6671181611be1641c733 to your computer and use it in GitHub Desktop.
Use a Git commit message template to write better commit messages

Using Git Commit Message Templates to Write Better Commit Messages

The always enthusiastic and knowledgeable mr. @jasaltvik shared with our team an article on writing (good) Git commit messages: How to Write a Git Commit Message. This excellent article explains why good Git commit messages are important, and explains what constitutes a good commit message. I wholeheartedly agree with what @cbeams writes in his article. (Have you read it yet? If not, go read it now. I'll wait.) It's sensible stuff. So I decided to start following the seven rules he proposes.

...There's only one problem: My mind is already stuffed with things I should do and things to remember. The chance of me remembering every rule every time I commit something, are next to 0. So I made myself a Git commit message template. That way, I don't have to remember the rules, they are presented to me whenever I write a commit message. So now, when I do git commit, this is what I see in my editor:

# Title: Summary, imperative, start upper case, don't end with a period
# No more than 50 chars. #### 50 chars is here:  #

# Remember blank line between title and body.

# Body: Explain *what* and *why* (not *how*). Include task ID (Jira issue).
# Wrap at 72 chars. ################################## which is here:  #

# At the end: Include Co-authored-by for all contributors. 
# Include at least one empty line before it. Format: 
# Co-authored-by: name <[email protected]>
#
# How to Write a Git Commit Message:
# https://chris.beams.io/posts/git-commit/
#
# 1. Separate subject from body with a blank line
# 2. Limit the subject line to 50 characters
# 3. Capitalize the subject line
# 4. Do not end the subject line with a period
# 5. Use the imperative mood in the subject line
# 6. Wrap the body at 72 characters
# 7. Use the body to explain what and why vs. how

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# On branch master
# Your branch is up to date with 'origin/main'.
#
# Changes to be committed:
#       new file:   installation.md
#

What I see consists of two parts; first my own template, then Git's standard message asking me to "Please enter the commit message". No need to remember everything - or really much at all, except to not use git commit -m "Commit message", as this means I won't see the template I made.

NOTE: This kind of "template", strictly speaking consisting only of "commented out" stuff, depends on the commit.cleanup config being strip so the comments will be stripped out (ignored) in the commit message. strip is the default setting, so if you haven't changed it you should be good. (Thanks, @devdrops, for making me aware of this.)

Template File

Here is my template*, which i put in a file called .gitmessage in my home directory:

# Title: Summary, imperative, start upper case, don't end with a period
# No more than 50 chars. #### 50 chars is here:  #

# Remember blank line between title and body.

# Body: Explain *what* and *why* (not *how*). Include task ID (Jira issue).
# Wrap at 72 chars. ################################## which is here:  #


# At the end: Include Co-authored-by for all contributors. 
# Include at least one empty line before it. Format: 
# Co-authored-by: name <[email protected]>
#
# How to Write a Git Commit Message:
# https://chris.beams.io/posts/git-commit/
#
# 1. Separate subject from body with a blank line
# 2. Limit the subject line to 50 characters
# 3. Capitalize the subject line
# 4. Do not end the subject line with a period
# 5. Use the imperative mood in the subject line
# 6. Wrap the body at 72 characters
# 7. Use the body to explain what and why vs. how

Git Configuration

To tell Git to use the template file (globally, not just in the current repo), I used the following command:

git config --global commit.template ~/.gitmessage

And that's all there was to it. (Except I have my dotfiles in a repo, so I had to do some symlinking and update one of my config-scripts to be able to recreate this setup from scratch if I need to.)

Links and Documentation

The Git documentation contains a chapter on Customizing Git - Git Configuration which in turn contains a section on the commit.template configuration value.

Better Commit Messages with a .gitmessage Template has a different kind of template, which is an actual template: It contains text which will become a part of the commit message.

I also made a Gist on Adding co-authors to Git commits to share the credit for collaborative efforts.

Addendum

An easy way to get this config using a single command:

printf "# Title: Summary, imperative, start upper case, don't end with a period\n# No more than 50 chars. #### 50 chars is here: #\n\n# Remember blank line between title and body.\n\n# Body: Explain *what* and *why* (not *how*). Include task ID (Jira issue).\n# Wrap at 72 chars. ################################## which is here: #\n\n\n# At the end: Include Co-authored-by for all contributors. \n# Include at least one empty line before it. Format: \n# Co-authored-by: name <[email protected]>\n#\n# How to Write a Git Commit Message:\n# https://chris.beams.io/posts/git-commit/\n#\n# 1. Separate subject from body with a blank line\n# 2. Limit the subject line to 50 characters\n# 3. Capitalize the subject line\n# 4. Do not end the subject line with a period\n# 5. Use the imperative mood in the subject line\n# 6. Wrap the body at 72 characters\n# 7. Use the body to explain what and why vs. how\n" > ~/.gitmessage && git config --global commit.template ~/.gitmessage

Thanks a lot to @manav148, @rany2 and @drjasonharrison for the suggestions in the comments! The command I included above includes some updates I made to the template that were not there at the time of the comments; the line length indicators and the missing space in the first item of the numbered list.

Footnotes

*) It may be argued that this is, strictly speaking, not a template, as no part of it is actually used/included in the commit message. :)

@BenjaminEngeset
Copy link

@lisawolderiksen

Thank you for sharing! We are in a situation where commits and pull requests are spammed with lacking information. This is truly helpful!

@jpluimers
Copy link

Thanks for the great work, not just the template: also separating most of the documentation out to a markdown file so the actual template still is manageable in the editor.

A few ideas for improvement:

  • add an additional file .gitmessage containing the actual template
  • add additional files for common shells (sh on Linux/BSD/... and cmd or PowerShell on Windows) that generate the .gitmessage file (I can help with the Windows side)
  • add a few more fields in the template like (indirectly via @mihaigalos) https://www.conventionalcommits.org/ and what @joelparkerhenderson has in their template (for instance tracking, see, sponsored by)

@devdrops
Copy link

devdrops commented Nov 9, 2022

Thank you very much @lisawolderiksen! Just FYI, the original site reference for this template has changed to https://cbea.ms/git-commit/ (though the old link still redirects to it 😉)

Also: it's worth mentioning that, in order for this template to work as expected, the commit.cleanup config must be strip. Otherwise, the comments will not be ignored.

@lisawolderiksen
Copy link
Author

Thank you very much @lisawolderiksen! Just FYI, the original site reference for this template has changed to https://cbea.ms/git-commit/ (though the old link still redirects to it 😉)

Also: it's worth mentioning that, in order for this template to work as expected, the commit.cleanup config must be strip. Otherwise, the comments will not be ignored.

Thanks for the heads up, @devdrops ! Fixed the URLs now. :)

Regarding the commit.cleanup config: Ah. Did not know that! Since the default is strip, I'll hope that people who've changed it themselves will know this and make templates that fit their setup. 😇 But I'll include a sentence or two about it to be sure. :)

@joelparkerhenderson
Copy link

Thanks @devdrops. I didn't know that either. I've added a usage note about strip to my template at https://github.com/joelparkerhenderson/git-commit-template

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment