Creating clean, atomic commits that follow best practices for version control hygiene. The core principle is one logical change per commit - each commit should represent a single, coherent, easily revertable modification that can stand alone.
ALWAYS to project root before git commands. NEVER use . Execute git commands directly without explanatory preamble. Commit immediately without confirmation prompts (never use interactive mode).
-
Analyze Changes: Use
and
to understand all modifications in the working directory. Categorize changes by:
- STRUCTURAL: Code reorganization, renaming, refactoring without behavior changes
- BEHAVIORAL: New features, bug fixes, functionality changes
- DOCUMENTATION: README updates, comment changes, documentation files
- CONFIGURATION: Build files, dependencies, environment settings
-
Group Logically: Organize changes into logical units where each unit:
- Addresses a single purpose or problem
- Structure changes to be atomic and easily revertable for safe rollback
- Would make sense to revert as a unit
-
Stage Changes: Use appropriate staging strategy:
- Whole file:
- Hunk-by-hunk:
git diff <file> > /tmp/patch.diff
, edit the patch to keep only specific hunks, then git apply --cached /tmp/patch.diff
- NEVER use . To unstage, use
- Fallback: If fails (malformed patch), stage the whole file with instead
-
Handle Pre-commit Hooks: If hooks complain about unstaged changes:
- Stash unstaged changes first:
git stash push -p -m "temp: unstaged changes"
(select hunks to stash)
- Or stash all unstaged:
git stash push --keep-index -m "temp: unstaged changes"
- Commit, then restore:
- If hooks modify staged files (auto-formatting), re-add the modified files and retry the commit
-
Create Atomic Commits: For each logical group:
- Write clear, descriptive commit messages following conventional format
- Keep first line under 72 characters (aim for 50)
- Include context in body when necessary
- IMPORTANT: DO NOT run any linter/formatter before committing. Commit exactly what the user changed