Git Commit Creation and Splitting Guidelines
Commit Message Format (Conventional Commits v1.0.0)
All commit messages follow the Conventional Commits format:
<type>[optional scope]: <description>
[optional body]
[optional footer(s)]
Quick Reference
| Type | When to use | SemVer | |------|-------------|--------| | feat | New feature or capability | MINOR | | fix | Bug fix | PATCH | | refactor | Code restructuring, no behavior change | - | | docs | Documentation only | - | | style | Formatting, whitespace, no logic change | - | | perf | Performance improvement | - | | test | Adding or correcting tests | - | | build | Build system or dependency changes | - | | ci | CI/CD configuration changes | - | | chore | Maintenance tasks (no src/test change) | - |
Key Rules
- Type: Lowercase noun from the table above
- Scope (optional): Module or component in parentheses —
fix(parser): - Description: Lowercase start, imperative mood ("add" not "added"), no trailing period
- Breaking change: Add
!before colon —feat!:orfeat(api)!:
Examples
feat: add user authentication via OAuth2
fix(parser): handle null input in token validation
refactor: extract validation logic into shared module
docs: update API endpoint documentation for v2
feat!: redesign configuration format
Multi-line example:
fix(auth): prevent session fixation on login
Regenerate session ID after successful authentication
to prevent session fixation attacks.
Closes #1234
See
references/conventional-commits.mdfor full spec details including type selection decision tree, body/footer rules, and BREAKING CHANGE syntax.
Workflow: Single Commit
For cases where the user wants to commit all current changes as a single commit:
- Run
git diff --statandgit diffto understand what changed - Determine the appropriate commit type from the Quick Reference table
- Identify scope if changes are concentrated in a specific module
- Draft a commit message following the Conventional Commits format above
- Present the proposed message to the user for confirmation
- Execute
git addandgit commitwith user-approved message
Workflow: Splitting Changes into Multiple Commits
Phase 1: Understanding Changes
- Goal: Identify and understand all changes to plan commits on a file-by-file basis.
- Tasks:
- Analyze the
git diffprovided by the user. - Integrate any additional context (issue tracker IDs, work descriptions, feature branch names).
- Identify work units strictly on a file basis — each file belongs to only one commit. Related files can be bundled into a single commit after discussion with the user, but there must be no overlap between commits.
- If the diff is large or file-based splitting is ambiguous, ask clear questions before proceeding. Example: "The changes in file A and file B appear to be closely related. Should we bundle these into one commit, or separate them?"
- Analyze the
Phase 2: Planning Commit Structure
- Goal: Propose a structured list of atomic commits, each with a clear Conventional Commits message.
- Tasks:
- For each proposed commit:
- List the specific files and changed hunks to include.
- Draft a commit message following the Conventional Commits format:
- Subject:
<type>[scope]: <description>— imperative mood, under 50 characters preferred - Body (optional, recommended for complex changes): Explain "what" and "why", not "how". Reference issue IDs where applicable.
- Subject:
- Present the complete plan as a numbered list for review.
- For each proposed commit:
Phase 3: Incorporating Feedback
- Goal: Collaboratively refine the commit plan.
- Tasks:
- Review user feedback on groupings and messages.
- Adjust as needed: regroup changes, modify messages, add or remove commits.
- Present the revised plan and repeat until the user explicitly confirms.
- Do not proceed with any
git commitoperations during this phase. Wait for explicit user instruction.
Phase 4: Commit Execution
- Goal: Execute commits sequentially according to the approved plan.
- Tasks:
- Only after the user explicitly commands to proceed:
- For each planned commit, one by one in agreed order:
- Announce the commit being created (e.g., "Creating commit:
refactor(db): simplify connection pooling"). - Stage files with
git add <file1> <file2>...and wait for user approval. - If the user wants to stage only specific hunks, guide them to use
git add -p <file>directly. - Execute
git commit -m "subject line" -m "body content..."with the planned message and wait for user approval. - After confirming success (e.g.,
git log -1), proceed to the next commit.
- Announce the commit being created (e.g., "Creating commit:
- For each planned commit, one by one in agreed order:
- If errors occur or the user wants changes midway, return to Phase 3.
- Only after the user explicitly commands to proceed:
General Principles
- User Control: The user is always in control. Suggest and guide, but the user makes decisions and approves critical commands.
- Clarity and Precision: All suggestions, file lists, and commands must be clear and accurate.
- Atomicity: Each commit represents a single logical unit of work.
- Context Awareness: If aware of project-specific commit message formats or conventions (e.g., from
CONTRIBUTING.mdor existing commit history), integrate this knowledge. - Confirmed Execution: Repository-changing operations (
git add,git commit) are executed only after proposing the command and receiving explicit user approval. - Hook Respect: Do not skip git hooks (
-n,--no-verify) unless the user explicitly requests it. If a pre-commit hook fails, diagnose the error, report it to the user, and suggest options: fix the issue or skip hooks if the user confirms.