release-please-pr-workflow

v2026.09.24

Merging release-please release PRs — batch merge, conflict resolution by closing and recreating the PR. Use when release PRs pile up or a release PR conflicts.

GitHub
Install command
npx skhub add laurigates/release-please-pr-workflow
Markdown
SKILL.md

Release-Please PR Workflow

When to Use This Skill

Use this skill when...Use the alternative when...
Iteratively merging multiple release-please PRs in a monorepoUse release-please-configuration to fix the upstream config that produced them
Resolving conflicts between sibling release PRs by closure/recreationUse git-conflicts for ordinary feature-PR merge conflicts
Coordinating sequential merges when separate-pull-requests: trueUse git-fix-pr if individual release PRs have failing CI checks
Reducing the open release PR queue after a burst of releasable commitsUse release-please-protection to detect manual edits to changelog/version files

Expert knowledge for managing release-please PRs in monorepos, including batch merging, conflict handling, and iterative processing.

Core Workflow

Release-please creates separate PRs per component in monorepos (when separate-pull-requests: true). These PRs often need sequential merging due to shared manifest file updates.

Iterative Merge Process

  1. List pending PRs with status
  2. Merge clean PRs (MERGEABLE status)
  3. Handle conflicting PRs (close for recreation)
  4. Wait for recreation and repeat
  5. Verify completion when no PRs remain

Essential Commands

List Release PRs

# List all pending release PRs
gh pr list --label "autorelease: pending"

# With merge status details
gh pr list --label "autorelease: pending" --json number,title,mergeable,mergeStateStatus

# Check specific PR status
gh pr view <number> --json title,mergeable,mergeStateStatus

Check PR Mergeability

StatusMeaningAction
CLEAN / MERGEABLEReady to mergeMerge immediately
UNKNOWNGitHub computingWait 5-10 seconds, retry
DIRTY / CONFLICTINGHas conflictsClose and wait for recreation

Merge PRs

# Merge single PR (squash recommended for clean history)
gh pr merge <number> --squash

# Merge multiple clean PRs sequentially
gh pr merge 55 --squash && gh pr merge 56 --squash

# Check result
gh pr list --label "autorelease: pending"

Handle Conflicts

# Close conflicting PRs with explanation
gh pr close <number> --comment "Closing due to conflicts from merged PRs. Release-please will recreate."

# Trigger workflow (if workflow_dispatch enabled)
gh workflow run release-please.yml

# Otherwise, wait for push trigger or new commit

Conflict Resolution Strategy

Why Conflicts Occur

Release-please PRs modify .release-please-manifest.json which tracks all component versions. When one PR merges:

  • The manifest changes
  • Other PRs become out of date
  • GitHub marks them as conflicting

Resolution Flow

1. Identify conflicting PRs
   ↓
2. Close conflicting PRs with comment
   ↓
3. Wait for release-please to recreate PRs
   (triggered by next push or workflow run)
   ↓
4. New PRs appear with updated base
   ↓
5. Merge clean PRs, repeat if needed

Typical Iteration Pattern

# Round 1: Initial merge
gh pr list --label "autorelease: pending" --json number,mergeable,mergeStateStatus
# Merge CLEAN ones, note CONFLICTING ones

# Round 2: Close conflicts
gh pr close 45 --comment "Closing for recreation"
gh pr close 46 --comment "Closing for recreation"

# Wait for recreation (5-10 seconds typically)
sleep 5

# Round 3: Check new PRs
gh pr list --label "autorelease: pending" --json number,mergeable,mergeStateStatus
# New PR numbers will appear, merge them

# Repeat until no pending PRs

Complete Merge Workflow

Full Automation Script Pattern

# 1. Initial status check
gh pr list --label "autorelease: pending" --json number,title,mergeable,mergeStateStatus

# 2. Wait for GitHub to compute status if UNKNOWN
sleep 5
gh pr list --label "autorelease: pending" --json number,title,mergeable,mergeStateStatus

# 3. Merge clean PRs
for pr in $(gh pr list --label "autorelease: pending" --json number,mergeStateStatus \
  -q '.[] | select(.mergeStateStatus=="CLEAN") | .number'); do
  gh pr merge $pr --squash
done

# 4. Close conflicting PRs
for pr in $(gh pr list --label "autorelease: pending" --json number,mergeStateStatus \
  -q '.[] | select(.mergeStateStatus=="DIRTY") | .number'); do
  gh pr close $pr --comment "Closing for recreation after conflicts"
done

# 5. Wait and repeat until done
sleep 10
gh pr list --label "autorelease: pending"

Interactive Workflow

For complex situations, work iteratively:

# Check current state
gh pr list --label "autorelease: pending" --json number,title,mergeable,mergeStateStatus

# Merge one by one, checking status between
gh pr merge <number> --squash
gh pr list --label "autorelease: pending" --json number,mergeable,mergeStateStatus

# Handle UNKNOWN status by waiting
sleep 5
gh pr view <number> --json mergeable,mergeStateStatus

Status Interpretation

mergeStateStatus Values

ValueDescriptionAction
CLEANAll checks pass, no conflictsMerge immediately
UNKNOWNStatus being computedWait 5-10 seconds
DIRTYHas conflictsClose PR
BLOCKEDBranch protection blockingCheck required checks
BEHINDBranch is behind baseUpdate branch or close

mergeable Values

ValueDescription
MERGEABLECan be merged
CONFLICTINGHas merge conflicts
UNKNOWNBeing calculated

Post-Merge Verification

# Verify all PRs merged
gh pr list --label "autorelease: pending"
# Should return empty

# Check new releases/tags
git fetch --tags
git tag --list --sort=-creatordate | head -10

# Pull latest changes
git pull origin main

Common Issues

PRs Keep Recreating

Cause: Unreleased changes still exist for component Check: git log --oneline HEAD ^<component>-v<last-version> -- <component>/ Solution: Merge the PR or revert the changes

Auto-merge Not Working

Cause: Repository doesn't have branch protection enabled Error: Pull request Protected branch rules not configured for this branch Solution: Use gh pr merge --squash without --auto

Workflow Not Triggering

Cause: release-please.yml doesn't have workflow_dispatch Solution: Wait for next push to main, or make a commit to trigger

"Already Merged" Message

Cause: PR was merged but GitHub CLI cache is stale Action: This is normal, continue with next PR

Agentic Optimizations

ContextCommand
Quick statusgh pr list --label "autorelease: pending" --json number,mergeStateStatus
Batch mergegh pr merge N --squash && gh pr merge M --squash
Close with reasongh pr close N --comment "Conflicts"
Wait and checksleep 5 && gh pr list --label "autorelease: pending"

Quick Reference

Command Cheat Sheet

TaskCommand
List pending PRsgh pr list --label "autorelease: pending"
Check PR statusgh pr view N --json mergeable,mergeStateStatus
Merge PRgh pr merge N --squash
Close PRgh pr close N --comment "reason"
View recent tagsgit tag --sort=-creatordate | head -10
Check workflow runsgh run list --workflow=release-please.yml -L 5

Workflow Labels

LabelMeaning
autorelease: pendingPR waiting to be merged
autorelease: taggedPR merged and release tagged

Integration with Other Skills

  • release-please-configuration - Setting up monorepo config
  • release-please-protection - Preventing manual edits to managed files
  • git-commit-workflow - Creating conventional commits that trigger releases
Discovery
Tags

No tags published for this skill.

Version
Latest version metadata

Version

v2026.09.24

Published

Sep 24, 2026

Category

Uncategorized

License

MIT

Source path

git-plugin/skills/release-please-pr-workflow

Default branch

main

Latest commit

1668324

Tree SHA

b2d4cc3