github / github/gh-stack

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

Đang mở
#225 3 bình luận 9 reaction 0 người được giao Xem trên GitHub
bug topic: cli - sync
Ngôn ngữ chính
Go
Star
1.5k
Fork
70
Merge trung bình
1 ngày 8 giờ
Pull request đã merge (30 ngày)
7

Mô tả

## 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.

Hướng dẫn đóng góp

Mở hướng dẫn đóng góp

Hướng nghiên cứu

Start by reproducing the squash-merge scenario with `sync`, then inspect how `sync`, `rebase`, and `init --adopt` handle merged PRs and the `.git/` gh-stack state file. Compare trunk handling with the existing in-stack branch recovery; done means a deleted trunk can be migrated to the merged PR's target and its layers cascade-rebased without manual state editing.

Do mô hình lập chỉ mục viết ra từ nội dung của issue.

Đánh giá

Công nghệ
git, github, go
Lĩnh vực
cli
Loại issue
Lỗi
Độ khó
4/5
Thời gian dự kiến
3-5 ngày
Mức độ hoạt động
Sôi nổi
Độ rõ ràng
Khá rõ ràng
Mức phù hợp với người mới
48/100

Nhận issue mới trong hộp thư của bạn

Bản tóm tắt ngắn những issue GitHub phù hợp với người mới.