Git Stacked PRs
Expert guidance for creating and managing stacked (dependent) pull requests.
Current Git Context
- •Current git status: !
git status - •Staged changes: !
git diff --staged - •Unstaged changes: !
git diff - •Current branch: !
git branch --show-current - •Recent commits on current branch: !
git log --oneline -10 - •Branch tree: !
git log --oneline --graph --all -20
What Are Stacked PRs?
Stacked PRs (also called dependent PRs or stacked diffs) is a workflow where you create multiple pull requests that build on top of each other. Each PR in the stack depends on the changes from the previous PR.
Traditional workflow:
main → feature-branch (large PR, 2000+ lines)
Stacked workflow:
main → feature-part-1 → feature-part-2 → feature-part-3
(small PR) (small PR) (small PR)
200 lines 200 lines 200 lines
Benefits
- •Faster reviews - Small PRs (< 400 lines) are easier and quicker to review
- •Parallel work - Continue building while earlier PRs are in review
- •Easier debugging - Smaller changes make issues easier to isolate
- •Better collaboration - Team can review and merge incrementally
- •Clearer history - Each PR represents a logical unit of work
When to Use Stacked PRs
✅ Good use cases:
- •Large features that can be broken into logical increments
- •Features with clear dependency chains
- •Projects with active code reviews
- •Teams practicing continuous integration
❌ Avoid when:
- •Feature is already small (< 400 lines)
- •Changes are tightly coupled and can't be separated
- •Working alone without code review
- •Deadlines are extremely tight
Quick Start Workflows
Create Stacked PRs from Scratch
See workflows/create-stacked-prs.md for step-by-step instructions on organizing unstaged changes into a reviewable stack.
Quick overview:
- •Plan your stack structure
- •Create base branch from main
- •Stage and commit related changes
- •Create PR targeting main
- •Create next branch from base
- •Repeat for each layer
- •Update PR targets to form stack
Update Stack After Merge
See workflows/update-stack-after-merge.md for instructions on rebasing and updating PR targets after merging base PRs.
Quick overview:
- •Checkout the branch above merged PR
- •Rebase onto new base (usually main)
- •Force push with lease
- •Update PR target if needed
- •Repeat for each remaining branch in stack
Recover from Rebase Mistakes
See workflows/recover-from-rebase.md for instructions on using reflog to recover from rebase errors.
Quick overview:
- •Find previous HEAD with
git reflog - •Reset to previous state
- •Retry rebase with correct base
Best Practices
Planning Your Stack
Plan before you start:
- •Identify logical boundaries in your feature
- •Ensure each layer can work independently
- •Keep each PR < 400 lines
- •Define clear dependencies
Example stack plan:
feat/auth/base - Core auth models and utilities feat/auth/middleware - Auth middleware (depends on base) feat/auth/endpoints - API endpoints (depends on middleware) feat/auth/ui - Frontend UI (depends on endpoints)
Branch Naming
Use consistent naming that shows hierarchy:
feat/<stack-name>/<component> fix/<stack-name>/<component> refactor/<stack-name>/<component>
Examples:
- •
feat/auth/base - •
feat/auth/middleware - •
feat/payments/stripe-integration - •
feat/payments/payment-ui
Testing Requirements
Each PR in the stack must:
- •Have its own tests
- •Pass all existing tests
- •Be independently testable
- •Not break functionality
Example test strategy:
PR 1 (base): Tests for models and utilities PR 2 (middleware): Tests for middleware + integration tests PR 3 (endpoints): Tests for endpoints + E2E tests PR 4 (ui): UI tests + full E2E flow tests
PR Descriptions
Use clear PR descriptions that document dependencies:
## Summary Adds JWT authentication middleware for protecting routes. ## Stack Information - **Stack:** User Authentication - **Position:** 2/4 (depends on #123, required by #125) - **Base PR:** #123 (Core auth models) - **Depends on:** #123 ## Changes - Authentication middleware - Token validation logic - Protected route decorators ## Testing - Unit tests for middleware - Integration tests with routes - All tests pass ## Review Notes This PR can be reviewed independently, but depends on #123 being merged first.
See templates/pr-description.md for a reusable template.
Automated Operations
The git-stacked-prs skill includes scripts to automate common workflows:
Rebase Entire Stack
Automatically rebase all branches in a stack with safety features:
${CLAUDE_PLUGIN_ROOT}/skills/git-stacked-prs/scripts/stack-rebase.sh main feat/auth-base feat/auth-middleware feat/auth-api
Features:
- •Creates automatic backups before rebasing
- •Updates base branch from remote
- •Rebases each branch sequentially
- •Runs tests after each rebase
- •Uses
--force-with-leasefor safety - •Supports
--dry-runfor preview
View Stack Status
Display visual tree of stack structure with PR status:
${CLAUDE_PLUGIN_ROOT}/skills/git-stacked-prs/scripts/stack-status.sh --pr-status
Options:
- •
--detail- Show commit summaries - •
--pr-status- Include GitHub PR status (requiresghCLI) - •
--json- JSON output for parsing
Update PR Targets After Merge
Batch update PR base branches after merging a base PR:
${CLAUDE_PLUGIN_ROOT}/skills/git-stacked-prs/scripts/update-pr-targets.sh feat/auth-base main
Features:
- •Auto-detects dependent PRs
- •Rebases branches onto new target
- •Updates PR targets via
ghCLI - •Handles conflicts gracefully
- •Supports
--no-rebaseto only update targets
Backup and Restore Stack
Create backups before risky operations:
# Create backups
${CLAUDE_PLUGIN_ROOT}/skills/git-stacked-prs/scripts/stack-backup.sh create feat/auth-base feat/auth-middleware
# List backups
${CLAUDE_PLUGIN_ROOT}/skills/git-stacked-prs/scripts/stack-backup.sh list
# Restore from backup
${CLAUDE_PLUGIN_ROOT}/skills/git-stacked-prs/scripts/stack-backup.sh restore feat/auth-base
# Clean old backups
${CLAUDE_PLUGIN_ROOT}/skills/git-stacked-prs/scripts/stack-backup.sh clean --older-than 30
Common Operations
View Stack Structure
# Visual branch tree
git log --oneline --graph --all -20
# See what branches exist
git branch -a
# Compare branches
git log main..feat/auth/base --oneline
git log feat/auth/base..feat/auth/middleware --oneline
# Or use the automated script
${CLAUDE_PLUGIN_ROOT}/skills/git-stacked-prs/scripts/stack-status.sh
Rebase a Stack
Use the automated script for safe, sequential rebasing:
${CLAUDE_PLUGIN_ROOT}/skills/git-stacked-prs/scripts/stack-rebase.sh main feat/auth/base feat/auth/middleware feat/auth/api
Or manually rebase each branch:
# Update base branch git checkout feat/auth/base git rebase main git push --force-with-lease # Update next branch git checkout feat/auth/middleware git rebase feat/auth/base git push --force-with-lease # Repeat for each branch
Handle Merge Conflicts During Rebase
# During rebase, conflicts occur git status # Identify conflicted files # Edit files to resolve conflicts # Remove conflict markers: <<<<<<<, =======, >>>>>>> git add <resolved-files> # Stage resolved files git rebase --continue # Continue rebase # If things go wrong git rebase --abort # Abort and start over git reflog # Find previous HEAD to recover
Change PR Targets
After merging a base PR, update the next PR's target:
- •Go to GitHub PR page
- •Click "Edit" next to the base branch
- •Change target from merged branch to new base (usually main)
- •GitHub will update the diff automatically
Troubleshooting
Stack Got Out of Sync
Symptoms: Commits appearing in wrong PRs, conflicts everywhere
Solution:
- •List all branches in stack
- •Rebase each branch in order from bottom to top
- •Force push each branch after rebase
- •Verify PR diffs on GitHub
Lost Commits During Rebase
Solution: Use reflog to recover (see workflows/recover-from-rebase.md)
git reflog # Find lost commit git cherry-pick <commit> # Apply lost commit
Merge Conflicts in Multiple Layers
Solution: Resolve conflicts layer by layer, starting from base:
- •Rebase and fix conflicts in base branch
- •Rebase and fix conflicts in next branch (may be fewer conflicts now)
- •Continue up the stack
PR Shows Too Many Commits
Symptom: PR includes commits from base branch that are already merged
Solution: Update PR target to point to main instead of the merged branch:
- •Edit PR base branch on GitHub
- •Change from merged branch to main
- •Diff will update automatically
Tools and Automation
Git Aliases
Add to ~/.gitconfig:
[alias]
stack-status = log --oneline --graph --all -20
stack-rebase = "!f() { git rebase $1 && git push --force-with-lease; }; f"
GitHub CLI
# View PR status gh pr status # View specific PR gh pr view 123 # Check PR checks/tests gh pr checks 123
References
- •Complete guide - Comprehensive stacked PR workflow documentation
- •Create workflow - Step-by-step stack creation
- •Update workflow - Update stack after merges
- •Recovery workflow - Recover from rebase mistakes
- •PR template - Stacked PR description template
Related Skills
- •For commit message guidelines, see
@git-commits - •For rebase and conflict resolution details, see
@git-advanced
Key Takeaways
- •Plan your stack before starting - identify logical boundaries
- •Keep PRs small (< 400 lines) for faster reviews
- •Test each layer independently
- •Document dependencies in PR descriptions
- •Rebase frequently to avoid conflicts
- •Use --force-with-lease instead of --force for safety
- •Update PR targets after merging base PRs