Skip to content
Development
Skill

/stack-rebase

Cascades a rebase through an entire PR stack after a base PR merges or upstream changes. Use when a stack needs to incorporate new base branch commits.

From plugin
claude-night-market
343200 skills60 agents162 commands1 MCP

Claude Code

$ npx -y skills add athola/claude-night-market --skill stack-rebase --agent claude-code

SKILL.md

stack-rebase.SKILL.md
name: stack-rebase
description: Cascades a rebase through an entire PR stack after a base PR merges or upstream changes. Use when a stack needs to incorporate new base branch commits.
alwaysApply: false
category: workflow-automation
tags:
- git
- stacked-diffs
- rebase
- pr
- cascade
tools: []
complexity: medium
estimated_tokens: 900
dependencies:
- sanctum:stack-create
- sanctum:stack-push
- sanctum:git-workspace-review

Stack Rebase

Cascade a rebase through an entire PR stack after a base PR merges or the upstream base branch changes.

When To Use

Run `stack-rebase` in any of these situations:

  • The first PR in the stack merged into `master`; the

second PR now needs to target `master` directly

  • `master` has moved forward and stack branches need to

incorporate the new commits

  • A mid-stack PR was revised and descendants need to

pick up the change

When NOT To Use

  • The stack has never been published (use `sanctum:stack-push`)
  • The stack does not exist yet (use `sanctum:stack-create`)

Prerequisites

  • All slice branches exist locally (`git branch --list`)
  • Remote is up to date (`git fetch origin`)
  • Working tree is clean (`git status`)
  • Git 2.38+ for `--update-refs`

Required Progress Tracking

Create progress items before starting:

1. `stack-rebase:fetch-complete` 2. `stack-rebase:trigger-identified` 3. `stack-rebase:rebase-complete` 4. `stack-rebase:conflicts-resolved` 5. `stack-rebase:force-pushed` 6. `stack-rebase:prs-updated`

Step 1: Fetch Remote State (`fetch-complete`)

git fetch origin

If the merged PR's branch still exists on remote, note that GitHub retains the branch after merge. The merged branch itself is no longer a valid stack base.

Step 2: Identify the Trigger (`trigger-identified`)

Determine what changed:

**Case A, Base PR merged into master:** The slice that was the old "root" is now in `master`. All remaining slices need to rebase onto `master`.

# Confirm the merged branch is now in master
git branch -r --merged origin/master | grep "${MERGED_BRANCH}"

**Case B, Master moved forward:** Slices are behind `master` but the stack topology is unchanged. Rebase the root slice onto `master`; `--update-refs` carries all descendants.

**Case C, Mid-stack revision:** A slice was amended. All descendant slices need to rebase onto it.

Step 3: Run the Cascading Rebase (`rebase-complete`)

Case A and B: Rebase root slice onto master

STACK=stack/my-feature
BASE=master

# Check out the root slice
ROOT_SLICE=$(git branch --list "${STACK}/*" \
  | sed 's/^[* ]*//' | sort | head -1)

git checkout "${ROOT_SLICE}"

# Rebase with --update-refs rewrites all stack branches
git rebase --update-refs origin/${BASE}

`--update-refs` scans the reflog and updates every local branch ref that points to a commit being rebased. All slice branches in the stack are rewritten in one pass.

Case C: Rebase from a mid-stack slice

# Check out the first slice BELOW the amended one
CHILD_SLICE=stack/my-feature/add-api  # example

git checkout "${CHILD_SLICE}"
git rebase --update-refs stack/my-feature/add-schema

jj Accelerator (if available)

# jj rebases all descendants automatically on any change
# To rebase the whole stack onto master:
jj rebase -d master \
  -r "ancestors(${STACK}/add-ui) & !ancestors(master)"

Step 4: Resolve Conflicts (`conflicts-resolved`)

If the rebase pauses with conflicts:

# See which file conflicts
git status

# After resolving each file:
git add <resolved-file>
git rebase --continue

Repeat until the rebase completes. If a conflict is too complex, abort and investigate:

git rebase --abort

Then examine the diff between the conflicting commits before retrying.

Step 5: Force-Push Updated Branches (`force-pushed`)

After a successful rebase, push all slice branches. Use `--force-with-lease` to guard against remote changes made since the last fetch:

for branch in $(git branch --list "${STACK}/*" \
    | sed 's/^[* ]*//' | sort); do
  git push --force-with-lease origin "${branch}"
  echo "force-pushed: ${branch}"
done

Never use `--force` (drops the remote-change guard).

jj Accelerator (if available)

jj git push --all --allow-new

Step 6: Update PR Bases (`prs-updated`)

**Case A only**: After the root slice merged and you rebased remaining slices onto `master`, the next PR in the stack now targets the wrong base. Update its base via the GitHub CLI:

NEXT_PR=456   # PR number of the new stack root

gh pr edit "${NEXT_PR}" --base master

For PRs further down the stack, their bases remain the previous slice branch, which `--update-refs` already rewrote; no base edit is needed for them.

Verify the full stack is consistent:

for branch in $(git branch --list "${STACK}/*" \
    | sed 's/^[* ]*//' | sort); do
  pr_num=$(gh pr list --head "${branch}" \
    --json number,baseRefName \
    --jq '.[0] | "#\(.number) base=\(.baseRefName)"')
  echo "${branch}: ${pr_num}"
done

Conflict Prevention Tips

  • Keep slices small: the smaller each PR, the less surface

area for conflicts during rebase

  • Rebase frequently: rebasing onto a freshly merged master

once a day is cheaper than resolving a week of drift

  • Avoid amending commits that are already under review;

prefer a fixup commit and squash at merge time

Notes

  • `git rebase --update-refs` requires Git 2.38+; confirm

with `git version` before running

  • If `--update-refs` is unavailable, manually check out

and rebase each slice branch in order from root to tip

  • After force-pushing, GitHub automatically marks PR

reviews as stale; remind reviewers to re-approve

  • The `stack-push` skill documents how to re-post the

stack summary comment after a rebase changes PR SHAs

Exit Criteria

  • [ ] All 6 progress items (`stack-rebase:fetch-complete` through

`stack-rebase:prs-updated`) are created before the rebase st

Read more
@athola
Ships withclaude-night-market

A plugin marketplace for Claude Code. Install only the plugins you need to run git workflows, code review, spec-driven development, and autonomous agents from inside your Claude Code session.

343200 skills60 agents1 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
343
Star history of athola/claude-night-market on GitHub, a chart by star-history.com

Other skills on claude-night-market.

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills10d309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc12d293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react1d252k
@facebook@facebookInstall Skill

Questions about stack-rebase.

Which coding agents can use stack-rebase?
stack-rebase installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.