Git Expert
Overview
Expert git workflow skill covering isolation (worktrees), commits, branching, and PR submission using GitHub CLI (gh).
Core principles:
- Isolation: Work in worktrees to avoid context pollution
- Atomic commits: Each commit represents one logical change
- Verification: Always verify before committing or pushing
- Clean history: Meaningful commits, clean rebases
Sub-Skills
This skill contains three sub-skills for different phases:
- Worktrees - Feature isolation and workspace setup
- Commits - Intelligent commit protocol
- Finishing - Branch completion and PR submission
1. Git Worktrees
When to Use
- Starting feature work that needs isolation
- Before executing implementation plans
- Working on multiple branches simultaneously
- Need clean baseline without affecting main workspace
Directory Selection Process
Follow this priority:
# 1. Check existing directories
ls -d .worktrees 2>/dev/null # Preferred (hidden)
ls -d worktrees 2>/dev/null # Alternative
# 2. Check CLAUDE.md for preference
grep -i "worktree.*director" CLAUDE.md 2>/dev/null
# 3. If neither exists, ask user
Safety Verification
MUST verify directory is ignored before creating worktree:
git check-ignore -q .worktrees 2>/dev/null
If NOT ignored:
- Add to .gitignore:
echo '.worktrees/' >> .gitignore - Commit the change
- Proceed with worktree creation
Creation Steps
# 1. Get project name
project=$(basename "$(git rev-parse --show-toplevel)")
# 2. Create worktree with new branch
git worktree add .worktrees/$BRANCH_NAME -b feature/$BRANCH_NAME
# 3. Move to worktree
cd .worktrees/$BRANCH_NAME
# 4. Auto-detect and run setup
if [ -f package.json ]; then npm install; fi
if [ -f Cargo.toml ]; then cargo build; fi
if [ -f requirements.txt ]; then pip install -r requirements.txt; fi
if [ -f go.mod ]; then go mod download; fi
# 5. Verify clean baseline
npm test # or project-appropriate test command
Worktree Commands
| Command | Purpose |
|---|---|
git worktree add <path> -b <branch> |
Create new worktree with branch |
git worktree list |
List all worktrees |
git worktree remove <path> |
Remove worktree |
git worktree prune |
Clean up stale references |
2. Git Commits
Core Rules
Never do without explicit permission:
- Push to remote
- Force push
- Run
git clean -fdx - Modify git config
- Amend pushed commits
Always do:
- Include meaningful commit messages
- Check status before operations
- Verify tests pass before committing
- Use HEREDOC for multi-line messages
Pre-Commit Protocol
# 1. Status check
git status
# 2. Pre-commit validation (if available)
npm run lint && npm run typecheck
# 3. Run tests
npm test
# 4. Review changes
git diff --cached
Commit Message Format
Format: {type}: {summary}
Types:
feat: New featurefix: Bug fixrefactor: Code restructuringdocs: Documentationstyle: Formattingtest: Testsbuild: Build systemchore: Maintenance
Examples:
git commit -m "feat: add user profile endpoint"
git commit -m "fix: resolve race condition in auth flow"
git commit -m "refactor: extract validation helpers"
Multi-Line Commit Messages
Use HEREDOC for complex messages:
git commit -m "$(cat <<'EOF'
feat: implement retry mechanism for API calls
- Add exponential backoff with jitter
- Configure max retries via environment variable
- Add comprehensive test coverage
Closes #123
EOF
)"
Staged vs Unstaged
# See what's staged
git diff --cached --name-only
# See what's unstaged
git diff --name-only
# Stage related files together
git add src/auth/* tests/auth/*
# Stage hunks interactively (if needed)
git add -p
Verification Before Commit
MANDATORY before every commit:
# 1. Run tests
npm test # Must pass
# 2. Run linter
npm run lint # Must be clean
# 3. Type check (if applicable)
npm run typecheck # Must pass
# 4. Review staged changes
git diff --cached
3. Finishing a Development Branch
When to Use
- Implementation complete
- All tests pass
- Ready to integrate work
The Process
Step 1: Verify Tests
npm test # Must pass before proceeding
If tests fail, stop. Fix before continuing.
Step 2: Determine Base Branch
git merge-base HEAD main 2>/dev/null || git merge-base HEAD master
Step 3: Present Options
Implementation complete. What would you like to do?
1. Merge back to <base-branch> locally
2. Push and create a Pull Request
3. Keep the branch as-is (I'll handle it later)
4. Discard this work
Which option?
Option 1: Merge Locally
git checkout main
git pull
git merge feature/my-feature
npm test # Verify after merge
git branch -d feature/my-feature
Then cleanup worktree.
Option 2: Create PR (Standard Git)
git push -u origin feature/my-feature
gh pr create --title "Add feature X" --body "$(cat <<'EOF'
## Summary
- Implemented X
- Added tests for Y
## Test Plan
- [ ] Unit tests pass
- [ ] Integration tests pass
EOF
)"
Option 3: Keep As-Is
Report status. Don't cleanup.
Option 4: Discard
Require confirmation:
This will permanently delete:
- Branch feature/my-feature
- All commits: abc123, def456
- Worktree at .worktrees/my-feature
Type 'discard' to confirm.
git checkout main
git branch -D feature/my-feature
git worktree remove .worktrees/my-feature
Branch Naming
| Type | Pattern | Example |
|---|---|---|
| Feature | feature/description |
feature/user-auth |
| Bug fix | fix/description |
fix/login-redirect |
| Refactor | refactor/description |
refactor/auth-module |
| Personal | dev/name/description |
dev/erik/auth-poc |
Protected Branches
main/master: Production (never direct push)develop/dev: Development/staging
Always create feature branches from the appropriate base.
Common Mistakes
Skipping verification
- Problem: Commit broken code
- Fix: Always run tests before commit
Force push without warning
- Problem: Overwrite others' work
- Fix: Never force push without explicit permission
Worktree not ignored
- Problem: Worktree contents tracked in git
- Fix: Always verify
.worktrees/is in .gitignore
Committing secrets
- Problem: Expose credentials
- Fix: Check for .env, credentials files before staging
Vague commit messages
- Problem: Unclear history
- Fix: Use type prefix, describe the "why"
Red Flags - STOP
Never:
- Push without explicit request
- Force push (especially to main/master)
- Commit without tests passing
- Delete branches without confirmation
- Proceed with failing tests
Always:
- Verify tests before commit
- Use meaningful commit messages
- Check what's staged before committing
- Get confirmation for destructive operations
Quick Reference
# Worktree setup
git worktree add .worktrees/feature -b feature/name
cd .worktrees/feature && npm install && npm test
# Commit workflow
git status
npm test && npm run lint
git add <files>
git commit -m "type: description"
# Standard PR
git push -u origin feature/name
gh pr create
# Cleanup
git worktree remove .worktrees/feature
git branch -d feature/name
Integration
On-demand loading: This is a Domain skill, loaded when git operations detected.
Pairs with:
- tdd - Tests pass before commits
- verification - Verify before PR submission
- subagent-driven-development - Feature branches for sub-agent work