[PATCH 0/2] rebase: handle --update-refs branch symrefs
- From
Son Luong Ngoc via GitGitGadget <gitgitgadget@gmail.com>
- Date
- May 28, 2026, 05:41 UTC
- Message-ID
- <pull.2126.git.1779946921.gitgitgadget@gmail.com>
git rebase --update-refs can fail after the normal rebase path has successfully updated the current branch when another local branch is a symbolic ref to it.
One practical way to arrive at that setup is a default branch rename from master to main. While the migration is in progress, a user may keep refs/heads/main as a symbolic ref to refs/heads/master so that both names continue to work locally.
If pull.rebase is enabled, a plain git pull can then finish the rebase of master and still fail while trying to update the main alias. The reported failure looked like this, with line breaks adjusted for the cover letter:
Successfully rebased and updated refs/heads/master.
error: update_ref failed for ref 'refs/heads/main':
cannot lock ref 'refs/heads/main':
is at fc2c7bd5f17abec7861ef759edcd33a1e16662a1
but expected 531cabdfb49098d6ffa502ed4bf91d1b35edfcfa
Updated the following refs with --update-refs:
Failed to update the following refs with --update-refs:
refs/heads/mainThe sequencer builds its update-ref todo commands from local branch decorations. It excludes the current branch by comparing the literal decoration name with the resolved HEAD ref, so refs/heads/main is not recognized as the current branch alias. The final update then dereferences the alias back to master, but master has already moved, so the old-OID check fails.
This series keeps that failure mode explicit by adding a known-breakage test first, so that the behavioral expectation is clear before the fix. The fix then resolves local branch symref decorations before queuing update-ref commands, skips aliases of the current branch, and skips duplicate referents. That keeps the existing old-OID protection on the single real branch update. It also avoids teaching the final ref update step to treat this race-looking mismatch as success.
Patch overview:
* Patch 1 records the branch-symref failure in t3404. * Patch 2 flips the test and canonicalizes sequencer behavior.
Son Luong Ngoc (2): t3404: add failing branch symref test rebase: skip branch symref aliases
sequencer.c | 63 +++++++++++++++++++++++++++++------ t/t3404-rebase-interactive.sh | 25 ++++++++++++++ 2 files changed, 77 insertions(+), 11 deletions(-)
base-commit: c69baaf57ba26cf117c2b6793802877f19738b0d Published-As: https://github.com/gitgitgadget/git/releases/tag/pr-2126%2Fsluongng%2Fsl%2Frebase-update-refs-symrefs-v1 Fetch-It-Via: git fetch https://github.com/gitgitgadget/git pr-2126/sluongng/sl/rebase-update-refs-symrefs-v1 Pull-Request: https://github.com/gitgitgadget/git/pull/2126
-- gitgitgadget