github / github/gh-stack

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

未關閉
#225 3 則留言 9 個 reaction 已指派 0 人 在 GitHub 檢視
bug topic: cli - sync
主要語言
Go
星號
1.5k
分支
70
平均合併
1 天 8 小時
30 天內合併 PR
7

描述

## 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: }` 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 ` 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: }`

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.

貢獻指南

開啟貢獻指南

研究方向

先使用 `sync` 重現 squash-merge 情境,接著檢查 `sync`、`rebase` 和 `init --adopt` 如何處理已合併的 PR,以及 `.git/` 中的 gh-stack 狀態檔。比較 trunk 的處理方式與現有的 stack 內分支復原;完成標準是:已刪除的 trunk 可以遷移到已合併 PR 的目標,且其各層可以在不手動編輯狀態的情況下級聯 rebase。

由索引模型根據 Issue 內容生成。

評估

技術堆疊
git, github, go
領域
cli
Issue 類型
缺陷
難度
4/5
預估耗時
3-5 天
活躍度
活躍
描述清晰度
基本清楚
新手友好度
48/100

把新 issue 寄到你的電子郵件信箱

精選適合新手參與的 GitHub issue 摘要。