Target audience: Engineers transitioning from ALM tools (Jama,
Codebeamer, DOORS, Polarion) to code-based workflows with Git.
If you’re coming from traditional Application Lifecycle Management (ALM) tools,
the way reviews work in Git-based platforms like GitHub, GitLab, and Bitbucket
might feel surprisingly simple. That’s because it is.
ALM tools typically implement complex approval workflows with multiple stages,
role-based sign-offs, and elaborate configuration. Git platforms solved this
with a single, elegant concept: the Pull Request (or Merge Request).
Git-based platforms introduced a fundamentally simpler approach:
propose changes in a branch, review them together, merge when approved.
flowchart LR
A[Create Branch] --> B[Make Changes]
B --> C[Open Pull Request]
C --> D{Review}
D --> |Request Changes| B
D --> |Approve| E[Merge]
E --> F[Changes in Main]
The Pull Request Model
A Pull Request (GitHub, Bitbucket) or Merge Request (GitLab) bundles everything
needed for review into one place:
Feature
What It Does
Visual Diff
Shows exactly what changed, line by line, with syntax highlighting
Inline Comments
Comment directly on specific lines of code or content
Threaded Discussions
Each comment thread can be resolved independently
Review States
Three clear options: Approve, Request Changes, or Comment
Automatic Blocking
Merge is blocked until required approvals are received
CI Integration
Automated tests run on every change, results visible in PR
Key Principles
Propose, don’t commit directly - Changes live in a branch until reviewed
and approved. The main branch stays protected.
Context is everything - Reviewers see the exact changes alongside the
discussion. No need to switch between tools or screens.
Simple states - No complex state machines. A PR is either open (needs
work or review), approved (ready to merge), or merged (done).
History in Git - Every change, comment, and approval is part of the
permanent Git history, not locked in a proprietary database.
But what about requiring specific people to review specific content? Git
platforms solve this with CODEOWNERS - a simple file that defines who
must approve changes to particular paths.
How CODEOWNERS Works
You create a CODEOWNERS file defining ownership patterns
When a PR touches files matching a pattern, owners are automatically
requested as reviewers
Combined with branch protection rules, the PR cannot be merged until
the designated owners approve
Example CODEOWNERS File
# Safety requirements need safety team approval
/docs/requirements/safety/ @company/safety-team
# Architecture changes need architect sign-off
/docs/architecture/ @lead-architect
# All requirement changes need requirements manager review
/docs/requirements/ @requirements-manager
# Hardware specs need hardware team approval
/docs/specs/hardware/ @company/hw-engineers
The Enforcement Flow
sequenceDiagram
participant Dev as Developer
participant PR as Pull Request
participant CO as CODEOWNERS Check
participant Owner as Code Owner
participant Main as Main Branch
Dev->>PR: Opens PR touching /docs/requirements/safety/
PR->>CO: Checks CODEOWNERS file
CO->>Owner: Requests review from @safety-team
Note over PR: Merge blocked until approved
Owner->>PR: Reviews changes
Owner->>PR: Approves
Note over PR: CODEOWNERS requirement satisfied
Dev->>Main: Merges PR
Enabling CODEOWNERS Enforcement
To make CODEOWNERS reviews mandatory, combine with branch protection:
GitHub:
Go to Settings > Branches > Branch protection rules
Add rule for main
Enable Require pull request reviews before merging
Enable Require review from Code Owners
GitLab:
Go to Settings > Repository > Protected branches
Configure protection for main
Enable Code owner approval in merge request settings
See also
For detailed CODEOWNERS configuration and additional access management
strategies, see Access Management Strategies.