Skip to content

Instantly share code, notes, and snippets.

@qoomon
Last active December 6, 2025 12:31
Show Gist options
  • Select an option

  • Save qoomon/5dfcdf8eec66a051ecd85625518cfd13 to your computer and use it in GitHub Desktop.

Select an option

Save qoomon/5dfcdf8eec66a051ecd85625518cfd13 to your computer and use it in GitHub Desktop.
Conventional Commits Cheatsheet

Conventional Commit Messages starline

See how a minor change to your commit message style can make a difference.

git commit -m"<type>(<optional scope>): <description>" \
  -m"<optional body>" \
  -m"<optional footer>"

Note

This cheatsheet is opinionated, however it does not violate the specification of conventional commits

Tip

Take a look at git-conventional-commits ; a CLI util to ensure these conventions, determine version and generate changelogs.

Commit Message Formats

General Commit

<type>(<optional scope>): <description>
empty line as separator
<optional body>
empty line as separator
<optional footer>

Initial Commit

chore: init

Merge Commit

Merge branch '<branch name>'

Follows default git merge message

Revert Commit

Revert "<reverted commit subject line>"

Follows default git revert message

Types

  • Changes relevant to the API or UI:
    • feat Commits that add, adjust or remove a new feature to the API or UI
    • fix Commits that fix an API or UI bug of a preceded feat commit
  • refactor Commits that rewrite or restructure code without altering API or UI behavior
    • perf Commits are special type of refactor commits that specifically improve performance
  • style Commits that address code style (e.g., white-space, formatting, missing semi-colons) and do not affect application behavior
  • test Commits that add missing tests or correct existing ones
  • docs Commits that exclusively affect documentation
  • build Commits that affect build-related components such as build tools, dependencies, project version, CI/CD pipelines, ...
  • ops Commits that affect operational components like infrastructure, deployment, backup, recovery procedures, ...
  • chore Commits that represent tasks like initial commit, modifying .gitignore, ...

Scopes

The scope provides additional contextual information.

  • The scope is an optional part
  • Allowed scopes vary and are typically defined by the specific project
  • Do not use issue identifiers as scopes

Breaking Changes Indicator

  • A commit that introduce breaking changes must be indicated by an ! before the : in the subject line e.g. feat(api)!: remove status endpoint
  • Breaking changes should be described in the commit footer section, if the commit description isn't sufficiently informative

Description

The description contains a concise description of the change.

  • The description is a mandatory part
  • Use the imperative, present tense: "change" not "changed" nor "changes"
    • Think of This commit will... or This commit should...
  • Do not capitalize the first letter
  • Do not end the description with a period (.)
  • I case of breaking changes also see breaking changes indicator

Body

The body should include the motivation for the change and contrast this with previous behavior.

  • The body is an optional part
  • Use the imperative, present tense: "change" not "changed" nor "changes"

Footer

The footer should contain issue references and informations about Breaking Changes

  • The footer is an optional part, except if the commit introduce breaking changes
  • Optionally reference issue identifiers (e.g., Closes #123, Fixes JIRA-456)
  • Breaking Changes must start with the word BREAKING CHANGE:
    • For a single line description just add a space after BREAKING CHANGE:
    • For a multi line description add two new lines after BREAKING CHANGE:

Versioning

  • If your next release contains commit with...
    • Breaking Changes incremented the major version
    • API relevant changes (feat or fix) incremented the minor version
  • Else increment the patch version

Examples

  • feat: add email notifications on new direct messages
    
  • feat(shopping cart): add the amazing button
    
  • feat!: remove ticket list endpoint
    
    refers to JIRA-1337
    
    BREAKING CHANGE: ticket endpoints no longer supports list all entities.
    
  • fix(shopping-cart): prevent order an empty shopping cart
    
  • fix(api): fix wrong calculation of request body checksum
    
  • fix: add missing parameter to service call
    
    The error occurred due to <reasons>.
    
  • perf: decrease memory footprint for determine unique visitors by using HyperLogLog
    
  • build: update dependencies
    
  • build(release): bump version to 1.0.0
    
  • refactor: implement fibonacci number calculation as recursion
    
  • style: remove empty line
    

Git Hook Scripts to ensure commit message header format

Click to expand

commit-msg Hook (local)

pre-receive Hook (server side)

  • create following file in your repository folder .git/hooks/pre-receive
    #!/usr/bin/env bash
    
    # Pre-receive hook that will block commits with messages that do not follow regex rule
    
    commit_msg_type_regex='feat|fix|refactor|style|test|docs|build'
    commit_msg_scope_regex='.{1,20}'
    commit_msg_description_regex='.{1,100}'
    commit_msg_regex="^(${commit_msg_type_regex})(\(${commit_msg_scope_regex}\))?: (${commit_msg_description_regex})\$"
    merge_msg_regex="^Merge branch '.+'\$"
    
    zero_commit="0000000000000000000000000000000000000000"
    
    # Do not traverse over commits that are already in the repository
    excludeExisting="--not --all"
    
    error=""
    while read oldrev newrev refname; do
      # branch or tag get deleted
      if [ "$newrev" = "$zero_commit" ]; then
        continue
      fi
    
      # Check for new branch or tag
      if [ "$oldrev" = "$zero_commit" ]; then
        rev_span=`git rev-list $newrev $excludeExisting`
      else
        rev_span=`git rev-list $oldrev..$newrev $excludeExisting`
      fi
    
      for commit in $rev_span; do
        commit_msg_header=$(git show -s --format=%s $commit)
        if ! [[ "$commit_msg_header" =~ (${commit_msg_regex})|(${merge_msg_regex}) ]]; then
          echo "$commit" >&2
          echo "ERROR: Invalid commit message format" >&2
          echo "$commit_msg_header" >&2
          error="true"
        fi
      done
    done
    
    if [ -n "$error" ]; then
      exit 1
    fi
  • ⚠ make .git/hooks/pre-receive executable (unix: chmod +x '.git/hooks/pre-receive')

References


@qoomon
Copy link
Author

qoomon commented Aug 24, 2025

To be honest I don't have hard feelings for that. Feel free to use capitals just ensure everyone uses the same style per repository.

@GabenGar
Copy link

The part after the dot goes into the body, therefore there is no need for dot in the description.

@qoomon
Copy link
Author

qoomon commented Aug 25, 2025

@GabenGar you are right that would have be the better answer 😅

@titoinemb
Copy link

Thanks !

@qoomon
Copy link
Author

qoomon commented Nov 30, 2025

@pycaw
Copy link

pycaw commented Nov 30, 2025

"chore" is such a bad term. How could the first the commit be considered "chore"? And why would chore be a good fallback? While chore could be used that are actual chore tasks, I think "misc" is much better for many of these. And if there is nothing specified it could automatically go under misc with changelog manager tools. So git -m init should suffice as the first commit's message.

@JohnnyWalkerDigital
Copy link

misc is meaningless though. I think the description of chore is part of the problem... but I also think getting granular is problematic, too.

The important thing to remember is that feat, refactor and fix should account for 95+% of your commits, with test being the next most popular. The other things are outliers... and do we need to go into much more detail? I guess it's project dependent, but build and ops are very similar, for example.

@pycaw
Copy link

pycaw commented Nov 30, 2025

I agree most should be feat/fix/refactor, but in light of this misc is not meaningless because it says it's not any of those (or the rest of the legal tags). And it says that it's not chore either, has higher importance. Omitting any tag and setting up your changelog tool to dump commits with no tags under misc can also be a thing.

@GabenGar
Copy link

Chore can be important though, like dependency updates without explicit purpose of fixing something or adding a feature.
By a complete coincidence I noticed that all the times I use chore it involves some sort of annoying and/or menial and/or transitive work.
Calling it a misc is a misnomer actually, since it implies the lack of relation when it's not the case.

@pycaw
Copy link

pycaw commented Nov 30, 2025

And do you find scope of chore easy to mark out? I found it impossible to distinguish between ops, chore and build.

@RobSmyth
Copy link

RobSmyth commented Dec 1, 2025

I do use chore and build. I would not like to see misc as an option on a project I was on as it would rapidly become the default for anybody who does not want to bother with the process (I have done this). I've never used "ops" but if the project had an clear separation of build and ops then I could see its use but would need to be convinced it added value.

I like the descriptions given here.

For example, provided that the commit does not change ANY product behaviour I use:

  • build
    • If adding a new build tool/service like Github, TeamCity kotlin, Grunt (never actually used Grunt).
    • If changing build to fail automatically and not publish a build, if any automated test fails on the build (although that should be the case anyway).
    • If automating a previously manual process like, radically, automating the versioning :-).
  • chore
    • If removing files that are no longer used like a readme file in a subfolder.
    • If not removing code files that are visible in an IDE as I would call that refactoring as it improves the readability of the code.

@pycaw: chore seems to me to be communicating intent like "just cleaning up (but not refactoring) ... nothing to see here". But I agree that chore is vague enough to be abused. Hmmm ... you make me think I ought to stop using it :-).

@GabenGar: I would not use chore for dependency updates as they can, even if not intended, change product behaviour. If updating for a security issue then it is a bug fix as I recon security is a feature, a fix # would allow the fix to be recorded for next release (SBOM). If updating to avoid a future build failure then using build would be more useful to reflect that intent.

In any case conventional commits are only really interested in feat, fix, and BREAKING CHANGE / ! commits anyway. It allows for use of other types but IMO any addtional types must service a purpose and not just a nice to have. I like to force a type on every commit so that feat and fix commits are not forgotten.

I think a long list of predfined types is useful to help others define there process but not as a predefined list in the tool as many are not relevant to a particular team's way of working. A team may want to enforce types that are used via a configurable white list. Or .. if the types are hard coded allow for users to define a type black list so that enforcement of useful types is enforced. Hey, maybe allow for a custom error reponse to include the team's policy along with why the rejected type is not used.

@qoomon
Copy link
Author

qoomon commented Dec 1, 2025

I agree chore is a complicated one. I just got used to it. Do you have a better wording in mind (incl. description) ?

@RobSmyth
Copy link

RobSmyth commented Dec 1, 2025

I agree chore is a complicated one. I just got used to it. Do you have a better wording in mind (incl. description) ?

I think a team should only use types that are of value to the team. feat, fix, and BREAKING CHANGE / ! are the only ones that impact version so maybe a team would choose no other types or just "no_ver_change" (if underscore is alowed).

I'm not sure I would say chore is "complicated". More like I'm reevaluating if it provides value for the work I'm doing. If you have a need for a type then that need (problem) gives you the description and that will lead to the name. The various published practices show solutions others have found useful for their problems so they good starting point but no match your processes.

e.g: I like "refactor" as I value understanding that the commiter did not intend to changes any product behaviour.

  • Useful on a PR as I can then look if the change can change behavior (_Well ... unless you get the "I fixed it by refactoring the code" LOL).
  • Useful when browsing history to, on first pass, skip over some commits as no change intended and also to understand huge code changes when looking at differences.

But a lot of developers do not do separate refactoring commits so for them dead useless.

Wild thoughts as examples of how a need may result in a type:

#1 - When I'm doing TDD coding each time a test passes I commit. Great as the build system will run all tests and let me know if there is a failure. When doing this I usually commit every 5 to 15 minutes so lots of commits (I may before a PR squash these commits). So maybe a type of "tdd", "incremental", or no type at all would be useful here as most commits add working code that is probably not used by anything other than the unit tests (maybe an odd component test) .... dunno.

#2 - On completing a functional change but leaving it hidden behind a switch for limited customer testing and later full release ... what would that be?

A type name here is a solution. Let problems lead to solutions. I have been looking for years for problems that could be solved by some great solutions I have. :-)

@pycaw
Copy link

pycaw commented Dec 1, 2025

I like "refactor" as I value understanding that the commiter did not intend to changes any product behaviour.

I only use refactor if the behavior of the application hasn't really changed. And in connection to this, I am an outlier in that I use behavior tag, sometimes with !, to not sell the modification as a "mere harmless refactor" but as what it is: a behavioral change -- not a fix, not a feature. It can often have meaning to the user as well, especially of course if it's breaking.

@RobSmyth
Copy link

RobSmyth commented Dec 2, 2025

... I am an outlier in that I use behavior tag, sometimes with !, to not sell the modification as a "mere harmless refactor" but as what it is: a behavioral change -- not a fix, not a feature. It can often have meaning to the user as well, especially of course if it's breaking.

"behavioral change" - Is the context here team behavior (as refactoring cannot, by definition, change code behaviour)? If so ... I like the sound of that. Nice.

I want to understand how your using "!" and your intent/context better ...

Q1: Isnt refactoring harmless by definition?

Q2: How are you using "!"? Conventional commits define ! after the type as indicating an incompatible API change and hence will bump the major version number? (https://www.conventionalcommits.org/en/v1.0.0/)?

Also, if the context is team behavioral change, would that only apply if:

  • Q3.1: Refactoring is abnormal for the team or the team?
  • Q3.2: Or the team is not skilled with refactoring patterns (hence risk)?

Sorry for all the question but I'm really interested.

@JohnnyWalkerDigital
Copy link

I am an outlier in that I use behavior tag, sometimes with !, to not sell the modification as a "mere harmless refactor" but as what it is: a behavioral change -- not a fix, not a feature.

A behaviour change would, by definition, surely be a new feature? Otherwise why make the change? Can you give an example?

@pycaw
Copy link

pycaw commented Dec 2, 2025

I am an outlier in that I use behavior tag, sometimes with !, to not sell the modification as a "mere harmless refactor" but as what it is: a behavioral change -- not a fix, not a feature.

A behaviour change would, by definition, surely be a new feature? Otherwise why make the change? Can you give an example?

I don't see it that way, many other repos I think don't either if you consider how they categorize changes by the new-changed-fixed methodology. But speaking for myself, a change is only considered a feature if it actually brings something new to the table; if it's a tweak, a removal or a replacement of an existing feature, of it's just too tiny, it doesn't.

Few examples from a changelog of a project of mine:

  • behavior(execute): disable logs with ... -- --help
  • behavior!: (CLI) config files now have .yaml extension instead of .yml
  • behavior!: no more -D/--auto-dir-name
  • behavior: slightly reworked config upgrade mechanics
  • behavior(rip): not compressing logs anymore

@RobSmyth
Copy link

RobSmyth commented Dec 3, 2025

Hi @pycaw,

You said:

many other repos I think don't either if you consider how they categorize changes by the new-changed-fixed methodology

Yea there are many many ways peeple like to stucture their commit messages. Not so many teams use the convention commit (CC) standard. Some versioning tool authors say their tool is a "opinionated" variation of the CC standard (and tell you how they vary from CC) and that is fine. If your doing a variation of CC, that is fine, but say so to avoid confusion and allow people to understand version numbers.

My comments here are about CC as this discussion's title is Conventional Commits Cheatsheet.

In a CC context, anything that changes the product's public behaviour is either a fix or a feature. Ask the question: Does an end user use it or needs to know about the change?

behavior seems vague in a CC context. I had thought you were talking about team behaviour, sorry.

To use the commit message examples you gave:

  • behavior(execute): disable logs with ... -- --help

If command line you describe is used by users then it is part of the product's public behaviour and the change is either a bug fix or a feature. If the command is line is not used or exposed (e.g: documented) to any users then it is not a feature or fix.

  • behavior!: (CLI) config files now have .yaml extension instead of .yml

If users use this config file then it is a breaking change (hence the "!"). If somebody complained that it ought to have been .yaml (maybe they asked for .yaml inthe first place) then this is a fix.

Note: About the use of the ! symbol here. CC says: "BREAKING CHANGE: a commit that has a footer BREAKING CHANGE:, or appends a ! after the type/scope, introduces a breaking API change (correlating with MAJOR in Semantic Versioning). A BREAKING CHANGE can be part of commits of any type.". So this behavior! flags to users a breaking change and the major version number will bump.

  • behavior!: no more -D/--auto-dir-name

Not sure about behavior as I do not have a definition and I do not know why the change is being made. Looks fine to me. Sounds like a feature has been dropped and users need to be notified of the breaking change.

  • behavior: slightly reworked config upgrade mechanics

I do not know what "mechanics" is so I cannot comment on this one.

  • behavior(rip): not compressing logs anymore

The question is why and if users need to know. If users were decompressing log files and this makes life easier then it is a feature "hey users you no longer need to decompress logs". If it was doen to improve performance then question is if anybody complained about the performance. A fix if the was a real problem or a new feature (better performance) if the user may notice.

@pycaw
Copy link

pycaw commented Dec 3, 2025

@RobSmyth

Hi @pycaw,

You said:

many other repos I think don't either if you consider how they categorize changes by the new-changed-fixed methodology

Yea there are many many ways peeple like to stucture their commit messages. Not so many teams use the convention commit (CC) standard. Some versioning tool authors say their tool is a "opinionated" variation of the CC standard (and tell you how they vary from CC) and that is fine. If your doing a variation of CC, that is fine, but say so to avoid confusion and allow people to understand version numbers.

My comments here are about CC as this discussion's title is Conventional Commits Cheatsheet.

In a CC context, anything that changes the product's public behaviour is either a fix or a feature. Ask the question: Does an end user use it or needs to know about the change?

behavior seems vague in a CC context. I had thought you were talking about team behaviour, sorry.

To use the commit message examples you gave:

* behavior(execute): disable logs with ... -- --help

If command line you describe is used by users then it is part of the product's public behaviour and the change is either a bug fix or a feature. If the command is line is not used or exposed (e.g: documented) to any users then it is not a feature or fix.

* behavior!: (CLI) config files now have .yaml extension instead of .yml

If users use this config file then it is a breaking change (hence the "!"). If somebody complained that it ought to have been .yaml (maybe they asked for .yaml inthe first place) then this is a fix.

Note: About the use of the ! symbol here. CC says: "BREAKING CHANGE: a commit that has a footer BREAKING CHANGE:, or appends a ! after the type/scope, introduces a breaking API change (correlating with MAJOR in Semantic Versioning). A BREAKING CHANGE can be part of commits of any type.". So this behavior! flags to users a breaking change and the major version number will bump.

* behavior!: no more -D/--auto-dir-name

Not sure about behavior as I do not have a definition and I do not know why the change is being made. Looks fine to me. Sounds like a feature has been dropped and users need to be notified of the breaking change.

* behavior: slightly reworked config upgrade mechanics

I do not know what "mechanics" is so I cannot comment on this one.

* behavior(rip): not compressing logs anymore

The question is why and if users need to know. If users were decompressing log files and this makes life easier then it is a feature "hey users you no longer need to decompress logs". If it was doen to improve performance then question is if anybody complained about the performance. A fix if the was a real problem or a new feature (better performance) if the user may notice.

It looks like to me your answer partly validated this technique, and partly brought in ambiguous criteria.

For example, the .yml vs .yaml change, maybe it was the janitor in the office dungeons that whispered to the dev that .yaml is the way to go. Let's assume this API has not been broadly exposed yet so making the change is relatively okay (still !). Why would one need to grind themselves over to coerce it into a feature or a fix when it is neither?

Regarding the log compression one, maybe for 1/3 of the users it is a feature because they don't have to decompress it themselves, for 1/3 it is a an "anti-feature" because they preferred as it was, and for 1/3 it is an unimportant behavioral change. Basing the change's categorization on why the modification was made isn't generally feasible with many projects, but even you can do so, miscommunication can occur due to feat/fix coercion which is uncalled for in the first place in my opinion.

@JohnnyWalkerDigital
Copy link

behavior(execute): disable logs with ... -- --help

I see what you mean, you're changing how the system operates, hence "behaviour". However I wonder if it would fit in chore?

behavior!: (CLI) config files now have .yaml extension instead of .yml

Remember that commit messages are supposed to be written in the imperative, present tense (which is the git standard). So this should be: "rename all .yml file extensions to .yaml". Again it seems like a chore?

behavior: slightly reworked config upgrade mechanics

This seems like the definition of a refactor, no?

behavior(rip): not compressing logs anymore

Disabling compression would be a feature change, IMO. It directly affects the users of the system: you're now serving the logs in an uncompressed format.

Just my perspective.

@pycaw
Copy link

pycaw commented Dec 3, 2025

behavior(execute): disable logs with ... -- --help

I see what you mean, you're changing how the system operates, hence "behaviour". However I wonder if it would fit in chore?

Users are interested in logs. If they had appeared when they shouldn't, and now they don't, they should also be notified. This one is borders the fix tag btw.

behavior!: (CLI) config files now have .yaml extension instead of .yml

Remember that commit messages are supposed to be written in the imperative, present tense (which is the git standard). So this should be: "rename all .yml file extensions to .yaml". Again it seems like a chore?

Users themselves manage such config files, it is a primary feature. You are right I suppose about imperative present tense , I have been unable to get myself to adopt it for a long time for reasons beyond me.

behavior: slightly reworked config upgrade mechanics

This seems like the definition of a refactor, no?

My usage of behavior sort of begins where refactor ends. These changes were very much visible from the outside as users deal with configs themselves. But, with the behavior tag under my tool belt, I go beyond and apply the behavior tag for changes that are well below what's visible from outside. This allows me to have a smaller scope for refactor so that they are applied to changes where not even the internal API of the particular module had changed. "refactor" is overused imo.

behavior(rip): not compressing logs anymore

Disabling compression would be a feature change, IMO. It directly affects the users of the system: you're now serving the logs in an uncompressed format.

I said what I said regarding this, could have been an "anti-feature" flag just as well as "feature". I'd rather not call such changes features. It comes across as misdirected, insincere, and reminds me of the tendency in management realm -- nowadays especially -- to prioritize sales over substance.

@RobSmyth
Copy link

RobSmyth commented Dec 3, 2025

Hi @JohnnyWalkerDigital,

behavior(execute): disable logs with ... -- --help

I see what you mean, you're changing how the system operates, hence "behaviour". However I wonder if it would fit in chore?

Do you think this change needs to be user documentation, release notes, or bump the version? I wonder if your using Semmantic Versioning as that would impact process here.

@dexoryn
Copy link

dexoryn commented Dec 4, 2025

Thanks, when the project structure completely changed and the version completely upgraded, what prefix we can use?

@raed-bash
Copy link

raed-bash commented Dec 4, 2025

what if we fix typing errors? what should we put before a commit message?

put refactor

@JohnnyWalkerDigital
Copy link

JohnnyWalkerDigital commented Dec 4, 2025

Attempt at a flow chart:

Did you fix a bug?

Yes: It's fix:

No: Did you change functionality or affect UI?

Yes: It's feat:

No: Did you add or change tests?

Yes: It's test:

No: Did you change code style or formatting?

Yes: It's style:

No: Did you make changes to documentation?

Yes: It's docs:

No: Did you change things related to build or deploy operations?

Yes: It's build:

No: Did you change something related to devops, infrastructure or backups?

Yes: It's ops:

No: Did you complete a maintenance task or other non-code task for the project (eg. modifying .gitignore or making initial commit)?

Yes: It's chore:

No: Did you rewrite or restructure code specifically for performance?

Yes: It's perf:

No: It's refactor:

@ttytm
Copy link

ttytm commented Dec 5, 2025

@JohnnyWalkerDigital

Attempt at a flow chart:

[...]

Did you fix a bug?

Yes: It's fix:

No: Did you change functionality or affect UI?

Yes: It's feat:

No: Did you add or change tests?

Yes: It's test:

No: Did you change code style or formatting?

Yes: It's style:

No: Did you make changes to documentation?

Yes: It's docs:

No: Did you change things related to build or deploy operations?

Yes: It's build:

No: Did you change something related to devops, infrastructure or backups?

Yes: It's ops:

No: Did you complete a maintenance task or other non-code task for the project (eg. modifying .gitignore or making initial commit)?

Yes: It's chore:

No: Did you rewrite or restructure code specifically for performance?

Yes: It's perf:

No: It's refactor:

I think using a flowchart makes the solution more complicated.
AFAIK GitHub renders mermaid diagrams, so it should become visible here:

flowchart TD
    A[Did you fix a bug?]
    A -- Yes --> B[It's fix]
    A -- No --> C[Did you change functionality or affect UI?]

    C -- Yes --> D[It's feat]
    C -- No --> E[Did you add or change tests?]

    E -- Yes --> F[It's test]
    E -- No --> G[Did you change code style or formatting?]

    G -- Yes --> H[It's style]
    G -- No --> I[Did you make changes to documentation?]

    I -- Yes --> J[It's docs]
    I -- No --> K[Did you change things related to build or deploy operations?]

    K -- Yes --> L[It's build]
    K -- No --> M[Did you change something related to devops, infrastructure or backups?]

    M -- Yes --> N[It's ops]
    M -- No --> O[Did you complete a maintenance task or other non-code task?]

    O -- Yes --> P[It's chore]
    O -- No --> Q[Did you rewrite or restructure code specifically for performance?]

    Q -- Yes --> R[It's perf]
    Q -- No --> S[It's refactor]
Loading

Since every decision is a simple yes/no that ends in exactly one category, a decision table (or ordered checklist) is likely a better fit.

Checklist attempt based on the order of the original answer

  1. If it fixes a bug → fix
  2. Else if it changes functionality or UI → feat
  3. Else if it adds or changes tests → test
  4. Else if it changes code style or formatting → style
  5. Else if it changes documentation → docs
  6. Else if it affects build or deploy → build
  7. Else if it affects devops, infrastructure, or backups → ops
  8. Else if it’s a maintenance or non-code task → chore
  9. Else if it improves performance → perf
  10. Else → refactor

Table attempt based on the order of the original answer

Question If Yes → Use Type
Fixes a bug? fix
Changes functionality or UI? feat
Adds or changes tests? test
Code style or formatting only? style
Documentation only? docs
Build or deploy related? build
DevOps / infra / backups? ops
Maintenance or non-code? chore
Performance-focused change? perf
Otherwise refactor

Table attempt with structural improvement

While the order in your answer is already a strong foundation. I think the priority order can be improved. Attempt below trying to match the current conventional Commit semantics:

Question If Yes → Type
Bug fix? fix
New or changed feature in API/UI? feat
Performance improvement? perf
Code restructuring without behavior change? refactor
Formatting only? style
Tests added/corrected? test
Documentation only? docs
Build tools, dependencies, versions? build
DevOps, infrastructure, or backups? ops
Anything else chore

Overall the intent here is minimizing mental load, improve long-term consistency, use chore as true fallback to preventing it's lazy overuse.

@AchiraNadeeshan
Copy link

correct typo "I case" to "In case" in commit message description rules.

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