From 2cc01c11ee5cef92e063052f0ca78ccc49b8a6f3 Mon Sep 17 00:00:00 2001 From: Jeremy Date: Tue, 31 Mar 2026 17:48:45 -0500 Subject: [PATCH] fix(merge): clean stale MERGE_HEAD before squash merge (#2912) A pre-existing MERGE_HEAD (from failed prior merge, libgit2 native path, or external tooling) blocks git merge --squash. Remove stale merge state files before starting the squash merge, not just after. --- src/resources/extensions/gsd/auto-worktree.ts | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/src/resources/extensions/gsd/auto-worktree.ts b/src/resources/extensions/gsd/auto-worktree.ts index 27a70af84..c6eca1004 100644 --- a/src/resources/extensions/gsd/auto-worktree.ts +++ b/src/resources/extensions/gsd/auto-worktree.ts @@ -1566,6 +1566,18 @@ export function mergeMilestoneToMain( // Non-fatal — proceed with merge; untracked files may block it } + // 7b. Clean up stale merge state files before starting the squash merge (#2912). + // A previous failed merge, libgit2 native path, or external tooling may leave + // MERGE_HEAD on disk. git refuses to start a new merge when MERGE_HEAD exists, + // causing `git merge --squash` to fail with "You have not concluded your merge". + try { + const gitDir_ = resolveGitDir(originalBasePath_); + for (const f of ["MERGE_HEAD", "MERGE_MSG", "SQUASH_MSG"]) { + const p = join(gitDir_, f); + if (existsSync(p)) unlinkSync(p); + } + } catch { /* best-effort — proceed and let the merge report the error if it fails */ } + // 8. Squash merge — auto-resolve .gsd/ state file conflicts (#530) const mergeResult = nativeMergeSquash(originalBasePath_, milestoneBranch);