Git Workflow
Effective version control is not just about tracking changes -- it is about enabling teams to collaborate predictably, release confidently, and maintain a history that tells a coherent story. The right workflow depends on team size, release cadence, and how much process the project can absorb without slowing down.
Choosing a Branching Strategy
No single branching model fits every team. The right choice depends on how often you release, how large your team is, and how much ceremony you can tolerate.
Strategy Comparison
Strategy Release Cadence Team Size Complexity Best For
Trunk-Based Continuous (multiple per day) Any (works best with strong CI) Low SaaS, cloud-native, teams with mature CI/CD
GitHub Flow On-demand (per merged PR) Small to medium Low Web apps, startups, teams wanting simplicity
Git Flow Scheduled / versioned releases Medium to large High Packaged software, mobile apps, multiple supported versions
GitLab Flow Environment-promoted Medium to large Medium Teams needing environment-specific branches (staging, production)
Decision Guide
-
Do you deploy continuously? -- Use trunk-based development. Short-lived branches (hours, not days), feature flags for incomplete work, and strong CI are prerequisites.
-
Do you deploy on merge but want review gates? -- Use GitHub Flow. One long-lived branch (main), feature branches, pull requests as the merge gate.
-
Do you ship versioned releases on a schedule? -- Use Git Flow. Separate develop and main branches, release branches for stabilization, hotfix branches for emergency patches.
-
Do you promote through environments? -- Use GitLab Flow. Environment branches (staging, production) sit downstream of main, and merges flow in one direction.
See Branching Strategies Reference for detailed mechanics, feature flag integration, and migration paths between strategies.
Commit Message Conventions
Good commit messages serve three audiences: reviewers reading the PR, developers reading git log next month, and automation tools generating changelogs and version bumps.
The Conventional Commits Format
<type>(<scope>): <description>
[optional body]
[optional footer(s)]
Common Commit Types
Type Purpose Version Impact
feat
New feature visible to users Minor bump
fix
Bug fix Patch bump
refactor
Code restructuring with no behavior change None
perf
Performance improvement Patch bump
test
Adding or updating tests None
docs
Documentation only None
chore
Tooling, dependencies, build config None
ci
CI/CD pipeline changes None
build
Build system or dependency changes None
Breaking Changes
Append ! after the type or add a BREAKING CHANGE: footer to signal incompatible changes. Either notation triggers a major version bump when used with automated release tooling.
feat(api)!: remove deprecated /v1/users endpoint
BREAKING CHANGE: The /v1/users endpoint has been removed. Use /v2/users instead.
Semantic Versioning Alignment
Commit Contains Version Bump Example
fix:
Patch (1.0.0 -> 1.0.1) Bug corrections
feat:
Minor (1.0.0 -> 1.1.0) New capabilities
BREAKING CHANGE or !
Major (1.0.0 -> 2.0.0) Incompatible changes
See Commit Conventions Reference for scope naming patterns, multi-line body guidelines, changelog automation setup, and git hook validation.
Pull Request Workflow
Pull requests are the primary collaboration point in most git workflows. Their quality directly affects review speed, defect discovery, and team velocity.
PR Size Guidelines
PR Size (lines changed) Review Quality Recommended
< 50 Excellent -- reviewer catches most issues Ideal for stacked PRs
50-200 Good -- manageable cognitive load Sweet spot for most changes
200-400 Acceptable -- requires focused review time Upper bound for single reviews
400+ Poor -- reviewer fatigue, defects slip through Split into smaller PRs
Core PR Practices
-
One concern per PR -- A PR should do one thing: add a feature, fix a bug, refactor a module. Mixing concerns makes review harder and reverts riskier.
-
Write a clear description -- State what changed, why it changed, and how to verify it. Link to the relevant ticket or issue.
-
Keep the diff reviewable -- Move large mechanical changes (renames, formatting) into separate PRs from logic changes.
-
Respond to feedback promptly -- Stale PRs accumulate merge conflicts and block dependent work.
Merge Strategies
Strategy History Shape Best For
Merge commit Preserves branch topology, creates merge node Open-source projects, audit trails
Squash and merge Collapses branch into single commit on main Feature branches with messy intermediate commits
Rebase and merge Linear history, no merge commits Teams wanting clean, linear logs
See PR Patterns Reference for description templates, CODEOWNERS configuration, branch protection rules, stacked PR workflows, and review assignment strategies.
Release Management
Release management bridges development and deployment. The approach depends on whether releases are continuous, scheduled, or versioned.
Release Models
Model How It Works When to Use
Continuous release Every merged PR deploys automatically SaaS with strong CI/CD and monitoring
Scheduled release Changes accumulate, release on a cadence (weekly, biweekly) Teams needing coordination windows
Versioned release Explicit version tags, release branches for stabilization Libraries, APIs, packaged software
Git Tags for Releases
Tags mark specific commits as release points. Use annotated tags for releases because they store author, date, and message metadata.
Create an annotated release tag
git tag -a v1.2.0 -m "Release 1.2.0: Add user dashboard and fix auth timeout"
Push tags to remote
git push origin v1.2.0
List existing tags matching a pattern
git tag -l "v1.*"
Automated Release Pipeline
When conventional commits are combined with release automation tooling, the pipeline can:
-
Analyze commits since the last tag to determine the next version
-
Generate or update the changelog from commit messages
-
Create the git tag
-
Build and publish artifacts
-
Create a release entry on the hosting platform (GitHub/GitLab)
This eliminates manual version decisions and ensures the changelog stays synchronized with actual changes.
Hotfix Workflow
When a critical bug is found in production:
-
Branch from the release tag (not from the development branch)
-
Apply the minimal fix
-
Tag the new patch release
-
Merge the fix forward into the main development line to prevent regression
Branch from the release tag
git checkout -b hotfix/fix-auth-crash v1.2.0
After fixing and committing
git tag -a v1.2.1 -m "Hotfix: prevent auth crash on expired tokens" git push origin v1.2.1
Merge fix back to main
git checkout main git merge hotfix/fix-auth-crash
Quick Reference: Common Workflow Problems
Problem Likely Cause Resolution
Frequent merge conflicts Long-lived branches, infrequent integration Merge main into feature branches daily, or switch to trunk-based
Broken main branch No CI on PRs, insufficient test coverage Require passing CI before merge, add branch protection
Unclear release contents No commit conventions, manual changelogs Adopt conventional commits, automate changelog generation
Slow PR reviews PRs too large, no clear ownership Set size guidelines, configure CODEOWNERS, use stacked PRs
Accidental commits to main No branch protection Enable branch protection rules, require PR reviews
Reference Files
Reference Contents
Branching Strategies Trunk-based, GitHub Flow, Git Flow, GitLab Flow -- mechanics, feature flags, comparison matrix
Commit Conventions Conventional commits format, scope patterns, semantic versioning, changelog automation, git hooks
PR Patterns Size guidelines, description templates, CODEOWNERS, merge strategies, branch protection, stacked PRs
Integration with Other Skills
Situation Recommended Skill
Setting up CI/CD pipelines for branch protection Install knowledge-virtuoso from krzysztofsurdy/code-virtuoso for testing strategies
API versioning aligned with git release tags Install knowledge-virtuoso from krzysztofsurdy/code-virtuoso for API design principles
Coordinating releases across microservices Install knowledge-virtuoso from krzysztofsurdy/code-virtuoso for microservices patterns
Sprint-aligned release planning Install knowledge-virtuoso from krzysztofsurdy/code-virtuoso for scrum workflows