602 lines
12 KiB
Markdown
602 lines
12 KiB
Markdown
---
|
|
name: git-workflow-standards
|
|
description: Automatically applies when working with git. Ensures conventional commits, branch naming, PR templates, release workflow, and version control best practices.
|
|
category: velocity
|
|
---
|
|
|
|
# Git Workflow Standards
|
|
|
|
When working with git, follow these patterns for consistent, professional version control.
|
|
|
|
**Trigger Keywords**: git, commit, branch, pull request, PR, merge, release, version control, conventional commits, semantic versioning
|
|
|
|
**Agent Integration**: Used by `backend-architect`, `devops-engineer`, `release-manager`
|
|
|
|
## ✅ Correct Pattern: Conventional Commits
|
|
|
|
```bash
|
|
# Format: <type>(<scope>): <description>
|
|
#
|
|
# Types:
|
|
# - feat: New feature
|
|
# - fix: Bug fix
|
|
# - docs: Documentation only
|
|
# - style: Code style (formatting, semicolons)
|
|
# - refactor: Code restructuring
|
|
# - perf: Performance improvement
|
|
# - test: Adding tests
|
|
# - build: Build system changes
|
|
# - ci: CI configuration changes
|
|
# - chore: Other changes (dependencies, etc.)
|
|
|
|
# Examples:
|
|
|
|
# Feature commits
|
|
feat(auth): add JWT authentication
|
|
feat(api): add user profile endpoint
|
|
feat: implement password reset flow
|
|
|
|
# Bug fix commits
|
|
fix(database): resolve connection pool leak
|
|
fix(api): correct status code for validation errors
|
|
fix: handle null values in user input
|
|
|
|
# Documentation commits
|
|
docs(readme): update installation instructions
|
|
docs: add API documentation
|
|
docs(contributing): add code review guidelines
|
|
|
|
# Performance commits
|
|
perf(query): optimize user search query
|
|
perf: reduce memory usage in data processing
|
|
|
|
# Refactoring commits
|
|
refactor(models): simplify user model structure
|
|
refactor: extract common validation logic
|
|
|
|
# Breaking changes (add !)
|
|
feat(api)!: change response format to JSON:API spec
|
|
fix(auth)!: remove deprecated login endpoint
|
|
|
|
# With body and footer
|
|
feat(payments): add Stripe integration
|
|
|
|
Implement Stripe payment processing with webhooks
|
|
for subscription management.
|
|
|
|
BREAKING CHANGE: Payment API now requires Stripe account
|
|
Closes #123
|
|
```
|
|
|
|
## Branch Naming Convention
|
|
|
|
```bash
|
|
# Format: <type>/<short-description>
|
|
#
|
|
# Types:
|
|
# - feature/ - New features
|
|
# - bugfix/ - Bug fixes
|
|
# - hotfix/ - Urgent production fixes
|
|
# - release/ - Release branches
|
|
# - docs/ - Documentation changes
|
|
|
|
# Examples:
|
|
|
|
# Feature branches
|
|
git checkout -b feature/user-authentication
|
|
git checkout -b feature/add-search-endpoint
|
|
git checkout -b feature/implement-caching
|
|
|
|
# Bug fix branches
|
|
git checkout -b bugfix/fix-login-redirect
|
|
git checkout -b bugfix/resolve-memory-leak
|
|
git checkout -b bugfix/correct-email-validation
|
|
|
|
# Hotfix branches (for production)
|
|
git checkout -b hotfix/critical-security-patch
|
|
git checkout -b hotfix/fix-payment-processing
|
|
|
|
# Release branches
|
|
git checkout -b release/v1.2.0
|
|
git checkout -b release/v2.0.0-beta.1
|
|
|
|
# Documentation branches
|
|
git checkout -b docs/update-api-reference
|
|
git checkout -b docs/add-deployment-guide
|
|
|
|
# Include issue number when applicable
|
|
git checkout -b feature/123-user-profile
|
|
git checkout -b bugfix/456-fix-crash
|
|
```
|
|
|
|
## Pull Request Template
|
|
|
|
```markdown
|
|
# .github/pull_request_template.md
|
|
|
|
## Description
|
|
|
|
Brief description of what this PR does.
|
|
|
|
Fixes #(issue)
|
|
|
|
## Type of Change
|
|
|
|
- [ ] Bug fix (non-breaking change which fixes an issue)
|
|
- [ ] New feature (non-breaking change which adds functionality)
|
|
- [ ] Breaking change (fix or feature that would cause existing functionality to not work as expected)
|
|
- [ ] Documentation update
|
|
- [ ] Performance improvement
|
|
- [ ] Code refactoring
|
|
|
|
## Changes Made
|
|
|
|
- Change 1: Description
|
|
- Change 2: Description
|
|
- Change 3: Description
|
|
|
|
## Testing
|
|
|
|
### Test Plan
|
|
|
|
Describe how you tested these changes:
|
|
|
|
1. Step 1
|
|
2. Step 2
|
|
3. Step 3
|
|
|
|
### Test Results
|
|
|
|
- [ ] All existing tests pass
|
|
- [ ] New tests added and passing
|
|
- [ ] Manual testing completed
|
|
|
|
## Checklist
|
|
|
|
- [ ] My code follows the project's style guidelines
|
|
- [ ] I have performed a self-review of my code
|
|
- [ ] I have commented my code, particularly in hard-to-understand areas
|
|
- [ ] I have made corresponding changes to the documentation
|
|
- [ ] My changes generate no new warnings
|
|
- [ ] I have added tests that prove my fix is effective or that my feature works
|
|
- [ ] New and existing unit tests pass locally with my changes
|
|
- [ ] Any dependent changes have been merged and published
|
|
|
|
## Screenshots (if applicable)
|
|
|
|
Add screenshots here if UI changes were made.
|
|
|
|
## Additional Notes
|
|
|
|
Any additional information that reviewers should know.
|
|
|
|
## Breaking Changes
|
|
|
|
If this PR introduces breaking changes, describe them here and update CHANGELOG.md.
|
|
```
|
|
|
|
## Commit Message Template
|
|
|
|
```bash
|
|
# .gitmessage
|
|
|
|
# <type>(<scope>): <subject>
|
|
#
|
|
# <body>
|
|
#
|
|
# <footer>
|
|
|
|
# Types:
|
|
# - feat: New feature
|
|
# - fix: Bug fix
|
|
# - docs: Documentation
|
|
# - style: Formatting
|
|
# - refactor: Code restructuring
|
|
# - perf: Performance
|
|
# - test: Tests
|
|
# - build: Build system
|
|
# - ci: CI changes
|
|
# - chore: Other changes
|
|
#
|
|
# Scope: Component affected (api, database, auth, etc.)
|
|
#
|
|
# Subject: Imperative, present tense, no period
|
|
#
|
|
# Body: Explain what and why, not how
|
|
#
|
|
# Footer: Issue references, breaking changes
|
|
|
|
# Configure Git to use this template:
|
|
# git config commit.template .gitmessage
|
|
```
|
|
|
|
## Release Workflow
|
|
|
|
```bash
|
|
# Semantic Versioning: MAJOR.MINOR.PATCH
|
|
# - MAJOR: Breaking changes
|
|
# - MINOR: New features (backwards compatible)
|
|
# - PATCH: Bug fixes (backwards compatible)
|
|
|
|
# 1. Create release branch
|
|
git checkout -b release/v1.2.0
|
|
|
|
# 2. Update version numbers
|
|
# - pyproject.toml
|
|
# - __version__ in code
|
|
# - CHANGELOG.md
|
|
|
|
# 3. Update CHANGELOG.md
|
|
cat >> CHANGELOG.md << EOF
|
|
## [1.2.0] - 2025-01-15
|
|
|
|
### Added
|
|
- New feature 1
|
|
- New feature 2
|
|
|
|
### Changed
|
|
- Modified behavior 1
|
|
|
|
### Fixed
|
|
- Bug fix 1
|
|
- Bug fix 2
|
|
|
|
### Security
|
|
- Security fix 1
|
|
EOF
|
|
|
|
# 4. Commit version bump
|
|
git add .
|
|
git commit -m "chore(release): bump version to 1.2.0"
|
|
|
|
# 5. Merge to main
|
|
git checkout main
|
|
git merge release/v1.2.0
|
|
|
|
# 6. Create and push tag
|
|
git tag -a v1.2.0 -m "Release version 1.2.0"
|
|
git push origin v1.2.0
|
|
|
|
# 7. Delete release branch
|
|
git branch -d release/v1.2.0
|
|
git push origin --delete release/v1.2.0
|
|
```
|
|
|
|
## GitHub Actions for Release
|
|
|
|
```yaml
|
|
# .github/workflows/release.yml
|
|
name: Release
|
|
|
|
on:
|
|
push:
|
|
tags:
|
|
- 'v*'
|
|
|
|
jobs:
|
|
release:
|
|
runs-on: ubuntu-latest
|
|
|
|
steps:
|
|
- uses: actions/checkout@v4
|
|
|
|
- name: Set up Python
|
|
uses: actions/setup-python@v4
|
|
with:
|
|
python-version: '3.11'
|
|
|
|
- name: Install dependencies
|
|
run: |
|
|
pip install build twine
|
|
|
|
- name: Build package
|
|
run: python -m build
|
|
|
|
- name: Publish to PyPI
|
|
env:
|
|
TWINE_USERNAME: __token__
|
|
TWINE_PASSWORD: ${{ secrets.PYPI_TOKEN }}
|
|
run: twine upload dist/*
|
|
|
|
- name: Create GitHub Release
|
|
uses: actions/create-release@v1
|
|
env:
|
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
with:
|
|
tag_name: ${{ github.ref }}
|
|
release_name: Release ${{ github.ref }}
|
|
body: |
|
|
See [CHANGELOG.md](https://github.com/${{ github.repository }}/blob/main/CHANGELOG.md) for details.
|
|
draft: false
|
|
prerelease: false
|
|
```
|
|
|
|
## CHANGELOG Format
|
|
|
|
```markdown
|
|
# Changelog
|
|
|
|
All notable changes to this project will be documented in this file.
|
|
|
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
|
|
|
## [Unreleased]
|
|
|
|
### Added
|
|
- Features added but not yet released
|
|
|
|
### Changed
|
|
- Changes in existing functionality
|
|
|
|
### Deprecated
|
|
- Soon-to-be removed features
|
|
|
|
### Removed
|
|
- Removed features
|
|
|
|
### Fixed
|
|
- Bug fixes
|
|
|
|
### Security
|
|
- Vulnerability fixes
|
|
|
|
## [1.2.0] - 2025-01-15
|
|
|
|
### Added
|
|
- JWT authentication for API endpoints
|
|
- User profile endpoint with avatar support
|
|
- Rate limiting middleware
|
|
|
|
### Changed
|
|
- Updated Pydantic to v2.5.0
|
|
- Improved error messages in validation
|
|
|
|
### Fixed
|
|
- Fixed memory leak in database connection pool
|
|
- Corrected timezone handling in timestamps
|
|
|
|
### Security
|
|
- Updated dependencies to fix CVE-2024-1234
|
|
|
|
## [1.1.0] - 2025-01-01
|
|
|
|
### Added
|
|
- Initial API implementation
|
|
- Database migrations with Alembic
|
|
- User authentication
|
|
|
|
[Unreleased]: https://github.com/user/repo/compare/v1.2.0...HEAD
|
|
[1.2.0]: https://github.com/user/repo/compare/v1.1.0...v1.2.0
|
|
[1.1.0]: https://github.com/user/repo/releases/tag/v1.1.0
|
|
```
|
|
|
|
## Git Hooks
|
|
|
|
```bash
|
|
# .git/hooks/pre-commit
|
|
#!/bin/bash
|
|
# Pre-commit hook to run linting and tests
|
|
|
|
echo "Running pre-commit checks..."
|
|
|
|
# Run linting
|
|
echo "Running ruff..."
|
|
ruff check .
|
|
if [ $? -ne 0 ]; then
|
|
echo "Ruff checks failed. Please fix linting errors."
|
|
exit 1
|
|
fi
|
|
|
|
# Run formatter
|
|
echo "Running black..."
|
|
black --check .
|
|
if [ $? -ne 0 ]; then
|
|
echo "Code formatting issues found. Run: black ."
|
|
exit 1
|
|
fi
|
|
|
|
# Run type checking
|
|
echo "Running mypy..."
|
|
mypy .
|
|
if [ $? -ne 0 ]; then
|
|
echo "Type checking failed. Please fix type errors."
|
|
exit 1
|
|
fi
|
|
|
|
# Run tests
|
|
echo "Running tests..."
|
|
pytest tests/ -v
|
|
if [ $? -ne 0 ]; then
|
|
echo "Tests failed. Please fix failing tests."
|
|
exit 1
|
|
fi
|
|
|
|
echo "All pre-commit checks passed!"
|
|
exit 0
|
|
|
|
# Make executable:
|
|
# chmod +x .git/hooks/pre-commit
|
|
```
|
|
|
|
## Pre-commit Configuration
|
|
|
|
```yaml
|
|
# .pre-commit-config.yaml
|
|
repos:
|
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
rev: v4.5.0
|
|
hooks:
|
|
- id: trailing-whitespace
|
|
- id: end-of-file-fixer
|
|
- id: check-yaml
|
|
- id: check-added-large-files
|
|
- id: check-merge-conflict
|
|
|
|
- repo: https://github.com/psf/black
|
|
rev: 24.1.0
|
|
hooks:
|
|
- id: black
|
|
language_version: python3.11
|
|
|
|
- repo: https://github.com/astral-sh/ruff-pre-commit
|
|
rev: v0.1.0
|
|
hooks:
|
|
- id: ruff
|
|
args: [--fix, --exit-non-zero-on-fix]
|
|
|
|
- repo: https://github.com/pre-commit/mirrors-mypy
|
|
rev: v1.8.0
|
|
hooks:
|
|
- id: mypy
|
|
additional_dependencies: [types-all]
|
|
|
|
# Install: pre-commit install
|
|
# Run manually: pre-commit run --all-files
|
|
```
|
|
|
|
## GitIgnore Template
|
|
|
|
```gitignore
|
|
# .gitignore for Python projects
|
|
|
|
# Python
|
|
__pycache__/
|
|
*.py[cod]
|
|
*$py.class
|
|
*.so
|
|
.Python
|
|
build/
|
|
develop-eggs/
|
|
dist/
|
|
downloads/
|
|
eggs/
|
|
.eggs/
|
|
lib/
|
|
lib64/
|
|
parts/
|
|
sdist/
|
|
var/
|
|
wheels/
|
|
*.egg-info/
|
|
.installed.cfg
|
|
*.egg
|
|
|
|
# Virtual environments
|
|
venv/
|
|
env/
|
|
ENV/
|
|
.venv
|
|
|
|
# IDE
|
|
.vscode/
|
|
.idea/
|
|
*.swp
|
|
*.swo
|
|
*~
|
|
|
|
# Testing
|
|
.pytest_cache/
|
|
.coverage
|
|
htmlcov/
|
|
.tox/
|
|
|
|
# Environment
|
|
.env
|
|
.env.local
|
|
.env.*.local
|
|
|
|
# Logs
|
|
*.log
|
|
|
|
# Database
|
|
*.db
|
|
*.sqlite3
|
|
|
|
# OS
|
|
.DS_Store
|
|
Thumbs.db
|
|
|
|
# Project specific
|
|
/data/
|
|
/tmp/
|
|
```
|
|
|
|
## ❌ Anti-Patterns
|
|
|
|
```bash
|
|
# ❌ Vague commit messages
|
|
git commit -m "fix stuff"
|
|
git commit -m "update code"
|
|
git commit -m "changes"
|
|
|
|
# ✅ Better: Descriptive commits
|
|
git commit -m "fix(auth): resolve JWT token expiration issue"
|
|
git commit -m "feat(api): add pagination to user list endpoint"
|
|
|
|
|
|
# ❌ Committing to main directly
|
|
git checkout main
|
|
git commit -m "quick fix" # Bad practice!
|
|
|
|
# ✅ Better: Use feature branch
|
|
git checkout -b bugfix/fix-issue
|
|
git commit -m "fix: resolve issue"
|
|
# Then create PR
|
|
|
|
|
|
# ❌ Large commits with mixed changes
|
|
git add .
|
|
git commit -m "add feature and fix bugs and update docs"
|
|
|
|
# ✅ Better: Separate commits
|
|
git add feature.py
|
|
git commit -m "feat: add new feature"
|
|
git add bugfix.py
|
|
git commit -m "fix: resolve bug"
|
|
git add docs/
|
|
git commit -m "docs: update documentation"
|
|
|
|
|
|
# ❌ No branch naming convention
|
|
git checkout -b my-changes
|
|
git checkout -b fix
|
|
git checkout -b update-stuff
|
|
|
|
# ✅ Better: Consistent naming
|
|
git checkout -b feature/add-authentication
|
|
git checkout -b bugfix/fix-validation-error
|
|
```
|
|
|
|
## Best Practices Checklist
|
|
|
|
- ✅ Use conventional commit format
|
|
- ✅ Follow branch naming convention
|
|
- ✅ Create descriptive PR descriptions
|
|
- ✅ Keep commits small and focused
|
|
- ✅ Write commits in imperative mood
|
|
- ✅ Reference issues in commits
|
|
- ✅ Use semantic versioning
|
|
- ✅ Maintain CHANGELOG.md
|
|
- ✅ Set up pre-commit hooks
|
|
- ✅ Review your own code before requesting review
|
|
- ✅ Keep PR size manageable (<400 lines)
|
|
- ✅ Squash/rebase before merging
|
|
|
|
## Auto-Apply
|
|
|
|
When working with git:
|
|
1. Use conventional commit format: `type(scope): description`
|
|
2. Create branch with type prefix: `feature/`, `bugfix/`
|
|
3. Write descriptive PR descriptions with checklist
|
|
4. Update CHANGELOG.md for releases
|
|
5. Tag releases with semantic versions
|
|
6. Set up pre-commit hooks
|
|
7. Keep commits focused and atomic
|
|
|
|
## Related Skills
|
|
|
|
- `code-review-framework` - For PR reviews
|
|
- `python-packaging` - For releases
|
|
- `dependency-management` - For version management
|