Git Workflow
Git Workflow and Release Process
This document describes the branching strategy, development workflow, and release process for The Nom Database.
Branching Strategy
We follow Git Flow with some modifications for simplicity.
Main Branches
main
- Purpose: Production-ready code
- Protection: Protected, requires PR reviews
- Deployment: Automatically deploys to production
- Tags: All release tags are created from main
- Never commit directly to main
develop
- Purpose: Integration branch for features
- Protection: Protected, requires PR reviews
- Deployment: Automatically deploys to staging/development
- Merge from: Feature branches, bugfix branches
- Merge to: Main (via release PR)
Supporting Branches
Feature Branches
- Naming:
feature/descriptionorfeature/issue-number-description - Purpose: Develop new features
- Branch from:
develop - Merge to:
develop - Lifetime: Deleted after merge
Examples:
feature/add-user-profilesfeature/123-restaurant-searchfeature/oidc-authentication
Bugfix Branches
- Naming:
bugfix/descriptionorbugfix/issue-number-description - Purpose: Fix bugs in develop branch
- Branch from:
develop - Merge to:
develop - Lifetime: Deleted after merge
Examples:
bugfix/fix-rating-calculationbugfix/456-photo-upload-error
Hotfix Branches
- Naming:
hotfix/descriptionorhotfix/vX.Y.Z - Purpose: Critical fixes for production
- Branch from:
main - Merge to:
mainANDdevelop - Lifetime: Deleted after merge
Examples:
hotfix/security-patchhotfix/v1.0.1
Release Branches
- Naming:
release/vX.Y.Z - Purpose: Prepare for production release
- Branch from:
develop - Merge to:
mainANDdevelop - Lifetime: Deleted after merge
Examples:
release/v1.0.0release/v1.1.0
Workflow Examples
1. Developing a New Feature
# Update develop branch
git checkout develop
git pull origin develop
# Create feature branch
git checkout -b feature/add-user-profiles
# Make changes, commit regularly
git add .
git commit -m "feat: add user profile page"
git commit -m "feat: add profile edit functionality"
git commit -m "test: add profile page tests"
# Push to remote
git push origin feature/add-user-profiles
# Create Pull Request on GitHub
# After approval and CI passes, merge to develop
# Delete feature branch2. Fixing a Bug
# Update develop branch
git checkout develop
git pull origin develop
# Create bugfix branch
git checkout -b bugfix/fix-rating-calculation
# Fix the bug
git add .
git commit -m "fix: correct average rating calculation"
# Push and create PR
git push origin bugfix/fix-rating-calculation
# After merge, delete branch3. Creating a Release
# Update develop branch
git checkout develop
git pull origin develop
# Create release branch
git checkout -b release/v1.0.0
# Update version numbers
# Update CHANGELOG.md
# Final testing and bug fixes
git commit -am "chore: prepare v1.0.0 release"
# Push release branch
git push origin release/v1.0.0
# Create PR to main
# After approval, merge to main
git checkout main
git merge release/v1.0.0
# Tag the release
git tag -a v1.0.0 -m "Release version 1.0.0"
git push origin v1.0.0
# Merge back to develop
git checkout develop
git merge release/v1.0.0
git push origin develop
# Delete release branch
git branch -d release/v1.0.0
git push origin --delete release/v1.0.04. Emergency Hotfix
# Create hotfix from main
git checkout main
git pull origin main
git checkout -b hotfix/v1.0.1
# Fix the critical issue
git commit -am "fix: patch critical security vulnerability"
# Push hotfix branch
git push origin hotfix/v1.0.1
# Merge to main
git checkout main
git merge hotfix/v1.0.1
# Tag the hotfix
git tag -a v1.0.1 -m "Hotfix version 1.0.1"
git push origin v1.0.1
# Merge to develop
git checkout develop
git merge hotfix/v1.0.1
git push origin develop
# Delete hotfix branch
git branch -d hotfix/v1.0.1
git push origin --delete hotfix/v1.0.1Commit Message Convention
We follow Conventional Commits.
Format
<type>(<scope>): <subject>
<body>
<footer>Types
- feat: New feature
- fix: Bug fix
- docs: Documentation changes
- style: Code style changes (formatting, no logic change)
- refactor: Code refactoring
- perf: Performance improvements
- test: Adding or updating tests
- build: Build system or dependency changes
- ci: CI/CD changes
- chore: Other changes (e.g., releasing)
Examples
# Simple feature
git commit -m "feat: add restaurant photo gallery"
# Bug fix with scope
git commit -m "fix(api): correct rating calculation logic"
# Breaking change
git commit -m "feat!: migrate to OIDC authentication
BREAKING CHANGE: Google OAuth has been replaced with generic OIDC.
Update your configuration to use OIDC_* environment variables."
# With issue reference
git commit -m "fix: resolve photo upload timeout (#123)"
# Multiple changes
git commit -m "feat: add user profiles
- Add profile page
- Add profile edit form
- Add avatar upload
- Update API endpoints"Release Process
Versioning
We use Semantic Versioning: MAJOR.MINOR.PATCH
- MAJOR: Breaking changes (e.g., v1.0.0 → v2.0.0)
- MINOR: New features, backwards compatible (e.g., v1.0.0 → v1.1.0)
- PATCH: Bug fixes, backwards compatible (e.g., v1.0.0 → v1.0.1)
Pre-release Versions
- Alpha:
v1.0.0-alpha.1- Early testing - Beta:
v1.0.0-beta.1- Feature complete, testing - RC:
v1.0.0-rc.1- Release candidate
Release Checklist
Before Release
- All features merged to develop
- All tests passing
- Documentation updated
- CHANGELOG.md updated
- Version numbers updated
- Migration scripts tested
- Security scan passed
Creating Release
Create release branch
git checkout develop git pull origin develop git checkout -b release/vX.Y.ZPrepare release
# Update version in files # Update CHANGELOG.md # Final testing git commit -am "chore: prepare vX.Y.Z release"Create PR to main
- Review changes
- Run all tests
- Get approval
Merge and tag
git checkout main git merge release/vX.Y.Z git tag -a vX.Y.Z -m "Release version X.Y.Z" git push origin main git push origin vX.Y.ZGitHub Actions will automatically:
- Build Docker images
- Publish to GitHub Container Registry
- Create GitHub Release
- Generate changelog
- Build platform binaries
Merge back to develop
git checkout develop git merge release/vX.Y.Z git push origin developClean up
git branch -d release/vX.Y.Z git push origin --delete release/vX.Y.Z
After Release
- Verify Docker images published
- Test deployed containers
- Update documentation site
- Announce release
- Monitor for issues
Pull Request Guidelines
Creating a PR
Title: Use conventional commit format
feat: add user authenticationfix: resolve rating calculation bug
Description: Include
- What changed and why
- How to test
- Screenshots (if UI changes)
- Related issues
Labels: Add appropriate labels
feature,bugfix,hotfix,documentationbreaking-change,security
Reviewers: Request reviews from maintainers
PR Checklist
- Code follows project style guidelines
- Tests added/updated
- Documentation updated
- Commit messages follow convention
- No merge conflicts
- CI checks passing
- Self-reviewed code
Review Process
Automated checks (GitHub Actions)
- Build passes
- Tests pass
- Linting passes
- Security scan passes
Code review (at least 1 approval)
- Code quality
- Test coverage
- Documentation
- Security considerations
Merge
- Squash and merge (for feature branches)
- Merge commit (for release/hotfix to main)
Branch Protection Rules
Main Branch
- Require pull request reviews (1 approval minimum)
- Require status checks to pass
- Require branches to be up to date
- Do not allow force pushes
- Do not allow deletions
Develop Branch
- Require pull request reviews (1 approval minimum)
- Require status checks to pass
- Allow force pushes for maintainers only
- Do not allow deletions
Docker Image Tags
Docker images are automatically tagged based on git activity:
Automatic Tags
latest: Latest commit on main branchdevelop: Latest commit on develop branchvX.Y.Z: Exact version tag (e.g., v1.0.0)vX.Y: Latest patch version (e.g., v1.0)vX: Latest minor version (e.g., v1)main-abc123: Commit SHA from mainpr-123: Pull request number
Using Tags
# Production (use specific version)
docker pull ghcr.io/obermarclp/the-nom-database/backend:v1.0.0
# Latest stable
docker pull ghcr.io/obermarclp/the-nom-database/backend:latest
# Development
docker pull ghcr.io/obermarclp/the-nom-database/backend:develop
# Specific commit
docker pull ghcr.io/obermarclp/the-nom-database/backend:main-abc123Setting Up Branch Protection
On GitHub
Go to Settings → Branches
Add rule for
main:- Require pull request reviews (1)
- Require status checks:
test-backend,test-frontend,security-scan - Require branches to be up to date
- No force pushes
- No deletions
Add rule for
develop:- Require pull request reviews (1)
- Require status checks:
test-backend,test-frontend - Allow force pushes (maintainers only)
Best Practices
Do’s ✅
- Keep feature branches small and focused
- Write descriptive commit messages
- Update documentation with code changes
- Write tests for new features
- Rebase feature branches before merging
- Delete branches after merging
- Tag releases consistently
Don’ts ❌
- Never commit directly to main or develop
- Don’t force push to shared branches
- Don’t merge without PR review
- Don’t commit secrets or credentials
- Don’t skip CI checks
- Don’t create giant PRs (split them up)
- Don’t forget to update CHANGELOG
Troubleshooting
Accidentally Committed to Main
# Reset main to previous commit
git reset --hard HEAD~1
# Push force (if you have permission)
git push origin main --force
# Or create a revert commit
git revert HEAD
git push origin mainMerge Conflicts
# Update your branch
git checkout feature/my-feature
git fetch origin
git merge origin/develop
# Resolve conflicts in files
# Then commit
git add .
git commit -m "chore: resolve merge conflicts"Forgot to Branch from Develop
# Stash your changes
git stash
# Switch to develop and create branch
git checkout develop
git pull origin develop
git checkout -b feature/my-feature
# Apply stashed changes
git stash popResources
Questions?
If you have questions about the workflow, please:
- Check this documentation first
- Ask in GitHub Discussions
- Contact the maintainers