github / github/gh-stack

link doesn't recognize a branch's existing merged/closed PR, tries to create a duplicate

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

描述

## Summary

`gh stack link` looks up an existing PR for each branch argument, but the lookup appears scoped to **open** PRs only. For a branch whose PR already merged or was closed (unmerged), `link` reports no PR found and attempts to **create a new one** — contradicting the documented additive-only design ("existing PRs are never removed").

## Repro

1. Build a stack `main <- a <- b <- c <- d <- e` via `gh stack link`.
2. Merge `a` and `b`. Close `c` without merging (its content landed elsewhere, or it was abandoned).
3. Later, run `gh stack link` again with the full historical branch list (e.g. to fix `d`'s base after `c` closed):
`gh stack link a b c d e --base main`

## Actual

```
Checking existing stacks...
Pushing N branches to origin...
Looking up PRs for 5 branches...
Found PR #.. for branch d
Found PR #.. for branch e
Creating 3 PRs...
✗ failed to create PR for branch a: creating PR: GraphQL: was submitted too quickly, Head sha can't be blank, Base sha can't be blank, No commits between main and a, Head ref must be a branch (createPullRequest)
```

Only the still-open branches (`d`, `e`) were recognized as "Found PR". The merged branch `a` (whose content is already in `main`, hence "No commits between main and a") and the closed branch `c` were both treated as PR-less and queued for creation.

In my case the create call failed immediately on the first attempt (an already-merged branch has no diff vs. its base, so `createPullRequest` rejects it), so no duplicate PR was actually created — I confirmed this via `gh pr list --head --state all` for each affected branch afterward. But this looks like it depends on the specific branch/repo state; a branch that still has *some* diff against the base (e.g. a closed-but-unmerged PR whose branch wasn't cleaned up) would likely succeed in creating a genuine duplicate PR.

## Expected

`link`'s PR lookup should match a branch's PR regardless of state (open, closed, or merged) before deciding whether to create a new one, consistent with the "existing PRs are never removed" behavior documented for this command.

## Environment

`gh-stack` version 0.0.8, installed via `gh extension install github/gh-stack`.

Related: #372 (same investigation session, different symptom of the same overall stack-mutation scenario — see also the atomicity issue I'm filing separately).

貢獻指南

開啟貢獻指南

研究方向

從 `gh stack link` 入口開始,追蹤在呼叫 `createPullRequest` 之前對現有 PR 的查找流程。使用已合併和已關閉的分支進行重現,然後與 `gh pr list --head --state all` 比較。完成標準是能夠辨識任何狀態的現有 PR,且不會嘗試重複建立。

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

評估

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

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

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