Git Commit
Break changes into logical, atomic commits using interactive staging.
Workflow
- Analyze all changes
- Identify logical units (one concern per commit)
- Stage relevant changes (whole files or hunks)
- Commit with a good message
- Repeat until all changes are committed
Analyzing Changes
git status # overview of changed files
git diff # unstaged changes
git diff --cached # staged changes
git diff HEAD # all changes (staged + unstaged)
Look for natural boundaries: different features, bug fixes, refactors, or config changes.
Identifying Logical Commits
Each commit should represent one logical change. Signs that changes belong in separate commits:
- Different purposes (bug fix vs feature vs refactor)
- Unrelated files or components
- Changes that could be reverted independently
- Separate items from a PR review or task list
Common groupings:
- Related files implementing a single feature
- A bug fix with its test
- Rename/move operations separate from behavior changes
- Config or dependency changes separate from code
Staging Strategies
Whole files
git add <file> # stage entire file
git add <dir>/ # stage all files in directory
git reset HEAD <file> # unstage file
Partial files (hunk staging)
Use git add -p to stage specific hunks within a file:
git add -p # interactively stage hunks from all files
git add -p <file> # interactively stage hunks from specific file
Hunk commands:
y- stage this hunkn- skip this hunks- split into smaller hunks (if hunk contains multiple changes)q- quit, keeping already-staged hunks?- show help
Verify staged changes
git diff --cached # review exactly what will be committed
Commit Messages
Use the commit-message skill for formatting. Key points:
- Conventional Commits format:
type(scope): description - Imperative mood ("Add feature" not "Added feature")
- Explain why in the body, not what (the diff shows what)
Repeat
After each commit:
git status # check remaining changes
git log --oneline -3 # verify commit was created
Continue staging and committing until all changes are organized into logical commits.