Skip to content

Instantly share code, notes, and snippets.

@joshbuchea
Last active April 16, 2025 13:32
Show Gist options
  • Save joshbuchea/6f47e86d2510bce28f8e7f42ae84c716 to your computer and use it in GitHub Desktop.
Save joshbuchea/6f47e86d2510bce28f8e7f42ae84c716 to your computer and use it in GitHub Desktop.
Semantic Commit Messages

Semantic Commit Messages

See how a minor change to your commit message style can make you a better programmer.

Format: <type>(<scope>): <subject>

<scope> is optional

Example

feat: add hat wobble
^--^  ^------------^
|     |
|     +-> Summary in present tense.
|
+-------> Type: chore, docs, feat, fix, refactor, style, or test.

More Examples:

  • feat: (new feature for the user, not a new feature for build script)
  • fix: (bug fix for the user, not a fix to a build script)
  • docs: (changes to the documentation)
  • style: (formatting, missing semi colons, etc; no production code change)
  • refactor: (refactoring production code, eg. renaming a variable)
  • test: (adding missing tests, refactoring tests; no production code change)
  • chore: (updating grunt tasks etc; no production code change)

References:

@marijoo
Copy link

marijoo commented Apr 9, 2024

changing project structure, for example creating new src directory, and probably moving some filed into it, is in which type? docs, refactor, chore?

I'd go with refactor.

Depends. If it‘s a package and the changed project structure eventually impacts users, it could also be a breaking change which should be reflected in a version.

@famdude
Copy link

famdude commented Apr 11, 2024

changing project structure, for example creating new src directory, and probably moving some filed into it, is in which type? docs, refactor, chore?

I'd go with refactor.

Depends. If it‘s a package and the changed project structure eventually impacts users, it could also be a breaking change which should be reflected in a version.

No visible change for users is made

@LakshmanKishore
Copy link

Thanks!

@LucaMalisan
Copy link

LucaMalisan commented Apr 23, 2024

What'd you suggest to use if I remove a feature?
If it caused bugs, it would be bugfix I guess. But what if it was just unnecessary?

@uncenter
Copy link

What'd you suggest to use if I remove a feature? If it caused bugs, it would be bugfix I guess. But what if it was just unnecessary?

bugfix isn't a conventional commit type, it would be fix. That also could be considered something breaking, so you can use an exclamation mark to mark it as such: fix!: xyz and remove abc feature.

@XxA7med66xX
Copy link

I learned something useful today, thanks!

@dogukancaner
Copy link

useful

@ayanchavand
Copy link

very cool

@showierdata9978
Copy link

feat: Include Libraries?

But I'd also just include them in the same commit with
feat: Initial Commit

@SteveLauC
Copy link

Hi folks, what is recommended for benchmark-related changes?

@wohlford
Copy link

Hi folks, what is recommended for benchmark-related changes?

I would go with test.

@caglarorhan
Copy link

caglarorhan commented Nov 19, 2024

Hi folks, what is recommended for benchmark-related changes?

How about "benchg" - Combines "bench" and "chg" (shorthand for "change"), or "benchmod" - "bench" and "mod" (modification).

@SteveLauC
Copy link

Thanks both for the reply!

@sxkxixx
Copy link

sxkxixx commented Nov 20, 2024

Which type will be the best for deleting unused code? IMHO "refactor" is not correct type for this

@djereg
Copy link

djereg commented Nov 20, 2024

I use chore for deleting unsed code.

@tykeal
Copy link

tykeal commented Nov 20, 2024

refactor would be to move currently used code to an unused code path.
chore should be used related to code that is being cleaned out and has no active paths to it. We also use chore when bumping dependency versions without any other code changes needed.

@CLucasrodrigues22
Copy link

Which type can I use to commit a dependency update? I see the build(deps): type often, is it correct?

refactor

@cfgnunes
Copy link

cfgnunes commented Feb 10, 2025

I wanted to share my commit-msg Git hook script that enforces the Conventional Commits standard. This script ensures that all commit messages follow a consistent format, improving readability and maintainability of the project's commit history.

What it does:

  • Validates commit messages against the Conventional Commits format: <type>(<scope>): <subject>.
  • Provides detailed error messages if the commit message doesn't match the expected format.
  • Includes descriptions for each valid commit type to help users understand when to use them.

How to use it:

  1. Copy the script below into your repository's .git/hooks/commit-msg file.
  2. Make the script executable by running:
    chmod +x .git/hooks/commit-msg
  3. Start committing! The hook will automatically validate your commit messages.

Script:

#!/usr/bin/env bash

# Path to the commit message file (provided by Git).
COMMIT_MSG_FILE=$1

# Read the commit message from the file.
COMMIT_MSG=$(cat "$COMMIT_MSG_FILE")

CONVENTIONAL_COMMIT_REGEX='^(feat|fix|docs|style|refactor|test|chore|build|ci|perf|revert)(\([a-zA-Z0-9_.-]+\))?(!)?:\s.*$'

# Check if the commit message matches the regex
if ! [[ $COMMIT_MSG =~ $CONVENTIONAL_COMMIT_REGEX ]]; then
    echo "ERROR: Commit message does not follow Conventional Commits format."
    echo
    echo "The commit message should be structured as follows:"
    echo "<type>(<optional scope>): <description>"
    echo "[optional body]"
    echo "[optional footer(s)]"
    echo
    echo "Valid types are:"
    echo "  feat:     A new feature."
    echo "  fix:      A bug fix."
    echo "  docs:     Documentation changes."
    echo "  style:    Code style changes (formatting, missing semicolons, etc.)."
    echo "  refactor: Code refactoring (neither fixes a bug nor adds a feature)."
    echo "  test:     Adding or updating tests."
    echo "  chore:    Routine tasks like updating dependencies or build tools."
    echo "  build:    Changes affecting the build system or external dependencies."
    echo "  ci:       Changes to CI configuration files or scripts."
    echo "  perf:     Performance improvements."
    echo "  revert:   Reverting a previous commit."
    echo
    echo "Examples:"
    echo "  feat(auth): add login functionality"
    echo "  fix(api)!: resolve timeout issue"
    echo "  docs(readme): update installation instructions"
    echo
    exit 1
fi

exit 0

@nineneel
Copy link

Thanks for the script! @cfgnunes

@ibnTofajjal
Copy link

Thanks @cfgnunes

@nicholaswmin
Copy link

this is an unnecessarily complex "protocol", most of the keywords have no bearing on semver and are just noise.

@Alluseri
Copy link

Alluseri commented Apr 3, 2025

Thanks! Now I know who to blame for having to use this absolutely pointless and brain-damage-inducing spec.

@cfgnunes
Copy link

cfgnunes commented Apr 3, 2025

@nicholaswmin @Alluseri Conventional Commits do introduce some rules, which might add a bit of overhead.

However, in my humble opinion, they make commit history much more organized—especially in larger projects with multiple contributors. The structure improves readability, maintainability, and even enables automation (like changelog generation).

Since Conventional Commits is still in its early stages, it may evolve to become simpler and more intuitive over time. If people have concerns, they could contribute to the project to help shape its future—rather than just criticizing it. Of course, if it doesn’t suit their workflow, they’re free not to use it. 😉

@nicholaswmin
Copy link

nicholaswmin commented Apr 3, 2025

@cfgnunes I agree with most.

they could contribute to the project to help shape its future—rather than just criticizing it.

My contribution is my feedback - I don't have a moral obligation to fix everything I believe is broken.

The structure improves readability, maintainability, and even enables automation (like change log generation).

I very much agree with the philosophy of the project but i'm very against the idea of having so many keywords. I literally have to look up the appropriate keyword.
And this isn't some critical functionality, it's the just...changelog management.

There is no need to have so many keywords for the vast majority of projects.
There is an ongoing trend since the late 00's to cargo-cult secondary helper bolt-ons to projects, such as this this (then husky then this thin that) that do nothing other than scare juniors off from contributing and/or add unnecessary dependencies and mental noise. This has a name and it's a terrible engineering decision.

Is your project SemVered? Yes? Then you've added another process but it can be justified by the fact it now helps you automate SemVer compliance. Ok fair tradeoff.
Do you need that many keywords to figure that out automatically? No.
Please pay attention to your own contexts instead of jumping onto bandwagons. Process is bad. Don't introduce it unnecessarily or prematurely. If there is one adage that survives every bit of scrutiny without fail its KISS

That being said, I appreciate the reply man. And the authors of CC - the fact I disagree with a part of it doesn't mean anything nore than that.

@cfgnunes
Copy link

cfgnunes commented Apr 3, 2025

@nicholaswmin Great points!

I agree that simplicity is essential, and processes shouldn’t be added without a good reason. While Conventional Commits offers a broad set of keywords to provide flexibility, it's worth considering whether a smaller, more essential subset could cover most cases without unnecessary overhead.

That said, it's important to recognize that Semantic Commit, as it stands today, may not be useful for all types of projects. There’s no silver bullet in software engineering—it’s up to each team to evaluate what truly adds value to their workflow. Dismissing the project as "cargo cult programming" might be unfair; we risk misjudging its real purpose or, worse, falling into a Dunning-Kruger effect, where a lack of deeper understanding leads to oversimplified conclusions.

I believe discussions like these are valuable for refining tools, but at the same time, sometimes debates about tooling create more noise than the tools themselves—lots of talk, little action. Personally, I prefer to focus on building rather than overanalyzing.

Thanks for the exchange of ideas!

@nicholaswmin
Copy link

Ok to make this clear:

  • CC is good
  • The keywords must be drastically reduced

"Dismissing the project as cargo cult programming"

I'm not dismissing the project itself as cargo cult programming; that doesn't make sense.
I'm dismissing the overzealous adoption of unnecessary procecess/tools/conventions prematurely, for no concrete reason other than "I also do that"

@keithpjolley
Copy link

Curious what people do when more than one type of "thing" is done in a single commit. For instance, to polish up some python code before committing I ran RightTyper, Trunk format, and then added in some comments on the code.

"Learn to commit between each task" is good advice but sometimes that horse is already out of the barn.

@harizjet
Copy link

nice script @cfgnunes; but you can also use pre-commit hook to enforce it.

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