Skip to content

Stack trunk is not migrated when the trunk branch's PR is squash-merged and the branch deleted #225

Description

@myot233

Scenario

A stack whose trunk is itself a feature branch with its own PR to main (a common "stack on top of an in-review PR" setup):

main
 └── feat/base        → PR #1 (base: main)        ← stack trunk, created with --base feat/base
  └── feat/layer-2    → PR #2 (base: feat/base)
   └── feat/layer-3   → PR #3 (base: feat/layer-2)

PR #1 is then squash-merged into main on GitHub and feat/base is deleted. GitHub automatically retargets PR #2's base to main.

Observed

The stack's local metadata keeps trunk: { branch: "feat/base", head: <old sha> } forever:

  • gh stack view --json still reports the deleted branch as trunk.
  • sync cannot fast-forward the trunk (its remote ref no longer exists), and nothing offers to migrate the stack onto main.
  • Because the trunk commits were squashed, the layers also need a rebase --onto to shed the now-duplicated trunk commits — the merged-PR recovery that works so nicely for stack members doesn't cover the trunk.

Expected

When the trunk's remote branch is gone and a merged PR from that branch into X exists, sync (or a dedicated command) should offer to migrate the stack trunk to X and cascade-rebase, mirroring the existing squash-merge recovery for in-stack branches. Even just a gh stack init --retrunk <branch> escape hatch would help — today init --adopt refuses branches that already have PRs, so there is no supported path.

Workaround that worked

  1. git branch -f feat/base origin/main (keep the local trunk name, point it at main)
  2. gh stack rebase (cascades cleanly; git skips the squashed patches)
  3. Hand-edit the gh-stack JSON state file in .git/ to set trunk: { branch: "main", head: <origin/main sha> }

After step 3, sync works normally again. Editing an internal state file obviously isn't a supported interface, hence this issue.

Version: gh-stack v0.0.8, gh 2.x, repo uses squash-merge as the default merge method.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Fields

    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions