Git Best Practices Skill
This skill provides comprehensive guidelines for proper git workflow management, with a focus on .gitignore setup and preventing accidental commits of unwanted files.
.gitignore Management
Critical: Always Check Before Initializing Package Managers
BEFORE initializing npm, pip, poetry, cargo, or any other package manager:
- Check if
.gitignoreexists: Usels -la .gitignoreor check via file system - If
.gitignoredoesn't exist: Create it with appropriate patterns for your project type - If
.gitignoreexists: Verify it includes the necessary patterns for your package manager - After creating/updating
.gitignore: Verify it's working withgit statusto ensure ignored files don't appear
Required Patterns by Project Type
Node.js / npm / yarn / pnpm
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
.pnpm-store/
Python / pip / poetry
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
env/
venv/
ENV/
env.bak/
venv.bak/
.venv
pip-log.txt
pip-delete-this-directory.txt
.pytest_cache/
.coverage
htmlcov/
*.egg-info/
dist/
build/
Rust / cargo
target/
Cargo.lock
Go
*.exe
*.exe~
*.dll
*.so
*.dylib
*.test
*.out
go.work
Java / Maven / Gradle
*.class
*.log
*.jar
*.war
*.ear
target/
build/
.gradle/
.idea/
*.iml
Universal Patterns (All Projects)
These should be included in every .gitignore:
# Environment files
.env
.env.local
.env.*.local
.env.development
.env.production
.env.test
*.env
# Build outputs
dist/
build/
.next/
out/
*.tsbuildinfo
# OS files
.DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db
Desktop.ini
# Logs
*.log
logs/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*
# Editor files (optional - include if not using shared IDE config)
.idea/
.vscode/
*.swp
*.swo
*~
.project
.classpath
.settings/
# Temporary files
*.tmp
*.temp
.cache/
Git Workflow Best Practices
Before Committing
Always check
git statusbefore committing to see what will be committed:git statusReview the output carefully:
- Ensure no sensitive files are staged (
.env, secrets, API keys) - Verify
node_modules/or other build artifacts aren't included - Check that only intended files are staged
- Ensure no sensitive files are staged (
If unwanted files appear:
- Check if
.gitignoreexists and has the correct patterns - Update
.gitignoreif needed - Remove files from staging:
git reset HEAD <file> - Verify with
git statusagain
- Check if
Commit Message Format
Use the existing project format:
feat: TASK-{id} - {description}
Examples:
feat: TASK-123 - Add user authenticationfeat: TASK-456 - Fix memory leak in data processor
Never Commit
- Sensitive files:
.env,.env.local, any file containing secrets, API keys, passwords - Build artifacts:
node_modules/,dist/,build/, compiled binaries - OS files:
.DS_Store,Thumbs.db - Large binary files: Unless using Git LFS (Large File Storage)
- IDE-specific files: Unless the project explicitly includes them in version control
Verifying .gitignore Effectiveness
After creating or updating .gitignore:
- Run
git statusto see what files git is tracking - If ignored files still appear, they may have been previously tracked:
# Remove from git cache (but keep local files) git rm --cached <file> # Or for directories: git rm -r --cached <directory> - Commit the removal:
git commit -m "chore: Remove tracked files that should be ignored" - Verify again with
git status
Project-Specific Considerations
When Initializing a New Project
- Create
.gitignorebefore runningnpm init,pip install, etc. - Include patterns for your package manager
- Initialize git:
git init(if not already initialized) - Verify
.gitignoreis working before proceeding
When Adding New Dependencies
- Check
git statusafter installing packages - Ensure new build artifacts are ignored
- If new file types appear, update
.gitignoreaccordingly
When Working with Multiple Languages
If a project uses multiple languages/frameworks, include patterns for all of them:
- Node.js + Python: Include both
node_modules/and__pycache__/ - React + Python backend: Include
.next/ordist/plus Python patterns
Quick Reference Checklist
Before committing:
-
.gitignoreexists and is appropriate for the project type - Ran
git statusand reviewed output - No sensitive files (
.env, secrets) are staged - No build artifacts (
node_modules/,dist/, etc.) are staged - Commit message follows format:
feat: TASK-{id} - {description} -
.gitignoreis working correctly (ignored files don't appear ingit status)
Common Mistakes to Avoid
Initializing package managers before creating
.gitignore- This can lead to
node_modules/or similar directories being tracked
- This can lead to
Assuming
.gitignoreworks retroactively- Files already tracked by git will continue to be tracked even if added to
.gitignore - Use
git rm --cachedto untrack them
- Files already tracked by git will continue to be tracked even if added to
Committing without checking
git status- Always verify what you're committing
Including sensitive data in commits
- Double-check for
.envfiles, API keys, passwords - If accidentally committed, use
git resetorgit commit --amend(if not pushed)
- Double-check for
Forgetting project-specific patterns
- Different projects need different
.gitignorepatterns - Tailor the
.gitignoreto the project's technology stack
- Different projects need different
Pre-Commit Checklist
Before committing, verify:
- TypeScript compilation passes (
npx tsc --noEmit) - No console errors in browser testing
- All success criteria verified
- Progress.txt updated
Pre-Commit Hooks
Consider adding pre-commit hooks for:
- TypeScript compilation check
- Linter checks
- Test execution
Document hook setup in project README if implemented.
Pre-Commit Validation
Run TypeScript compilation check before commit:
# Before committing, verify compilation
npx tsc --noEmit
# If errors exist, fix them before committing
Verify no console errors:
# Check for console errors in browser
agent-browser console | grep -i "error"
# Or check build output
npm run build 2>&1 | grep -i "error"
Check git status before staging:
# Always check what will be committed
git status
# Review changes
git diff
# Stage only relevant files
git add src/scenes/GameScene.ts
Review changes with git diff:
# Review all changes
git diff
# Review staged changes
git diff --staged
# Review specific file
git diff src/scenes/GameScene.ts
Commit Message Patterns
Format: "feat: TASK-ID - Description"
# Examples
git commit -m "feat: US-033 - Add wizard character sprite"
git commit -m "feat: US-034 - Implement timer countdown"
git commit -m "feat: US-035 - Add scene transition animations"
Include task ID for traceability:
# Always include task ID
git commit -m "feat: TASK-{id} - {description}"
# Examples
git commit -m "feat: US-036 - Fix maze generation error handling"
Use conventional commit types:
# Types: feat, fix, chore, docs, refactor, test
git commit -m "feat: US-037 - Add new feature"
git commit -m "fix: US-038 - Fix bug"
git commit -m "chore: US-039 - Update dependencies"
Keep messages descriptive but concise:
# ✅ GOOD: Descriptive but concise
git commit -m "feat: US-040 - Add coin collection sound effect"
# ❌ BAD: Too vague
git commit -m "feat: US-040 - Update code"
# ❌ BAD: Too verbose
git commit -m "feat: US-040 - Add coin collection sound effect that plays when player collects coin and updates score and triggers animation"
Workflow Patterns
Check git status before operations:
# Before any git operation, check status
git status
# See what files changed
git status --short
# See untracked files
git status --untracked-files=all
Stage only relevant files:
# Stage specific files
git add src/scenes/GameScene.ts
git add src/scenes/GameOverScene.ts
# Don't stage everything
# ❌ git add . # Only if you're sure
Commit after verification passes:
# 1. Make changes
# 2. Verify TypeScript compilation
npx tsc --noEmit
# 3. Verify browser testing
agent-browser open http://localhost:3000
# 4. Stage files
git add src/
# 5. Commit
git commit -m "feat: TASK-ID - Description"
Update progress.txt before commit:
# Update progress.txt with task completion
echo "## Task Complete" >> tasks/progress.txt
echo "- [x] All criteria met" >> tasks/progress.txt
# Then commit
git add tasks/progress.txt
git commit -m "feat: TASK-ID - Description"