Git Best Practices
Safety Rules
- Read-only by default: Prefer
git status,git diff,git log,git show,git blamebefore making changes - Push requires explicit request: Never push unless user asks
- Checkout allowed for: PR review, explicit user request
- Branch changes require consent: Ask before creating/switching branches
- History rewriting requires consent: Ask before
commit --amend, interactive rebase, or force push (especially if anything may be shared) - Destructive ops require explicit user consent:
- Allow previews like
git clean -n(no deletion); do not rungit clean -fdwithout consent - Do not discard worktree changes with
git reset --hardorgit restore .without consent - Do not delete branches/tags or force push without consent
- Allow previews like
Preferred Commands
- Prefer modern porcelain:
git switch(branches) andgit restore(undo) when appropriate git restore --staged <path>is usually safe; discarding worktree changes (e.g.,git restore .) requires explicit consent
Conventional Commits
Format: <type>[optional scope][optional !]: <description>
Subject Line
- Use imperative mood (“add”, “fix”, “remove”)
- Keep it short and specific; avoid trailing periods
Types
| Type | Use for |
|---|---|
feat | New features |
fix | Bug fixes |
docs | Documentation only |
style | Formatting, whitespace (no code change) |
refactor | Code change that neither fixes nor adds |
perf | Performance improvements |
test | Adding or correcting tests |
build | Build system or dependencies |
ci | CI configuration |
chore | Other changes (tooling, config) |
revert | Reverting a previous commit |
Scope
- Use the smallest sensible scope
- Omit scope if unclear or too broad
- Examples:
feat(auth):,fix(api):,docs(readme):
Breaking Changes
Mark with ! before the colon OR add a BREAKING CHANGE: footer:
feat(api)!: remove deprecated endpoints
BREAKING CHANGE: /v1/users endpoint removed, use /v2/users
Body and Footers
- Use body only when the subject line needs elaboration
- Footers follow git-trailer style:
Token: value - Common footers:
BREAKING CHANGE:,Fixes:,Refs:,Co-authored-by:
Examples
feat(auth): add OAuth2 login flow
fix: prevent race condition in queue processing
docs: update API authentication examples
refactor(db)!: migrate from MySQL to PostgreSQL
BREAKING CHANGE: database connection config format changed
Pre-Commit Checklist
- Review
git status - Review
git diffandgit diff --staged - Run the smallest relevant checks if known (or ask what to run)
- Scan for secrets (tokens, keys, credentials) and unintended debug logs
- Prefer small, logical commits; use
git add -pwhen changes are mixed - Propose a commit split and draft commit messages before staging/committing
Workflow
After reviewing changes, end with:
- Short summary of proposed commits
- Clear question for next steps (stage/commit/push)
If anything is ambiguous, ask short, direct questions with options.