git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[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/main

The 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
Next: Son Luong Ngoc via GitGitGadget
Message 1 of 25 in “rebase: handle --update-refs branch symrefs”
  1. 0/2 rebase: handle --update-refs branch symrefsSon Luong Ngoc via GitGitGadget, May 28, 2026
  2. 1/2 t3404: add failing branch symref testSon Luong Ngoc via GitGitGadget, May 28, 2026
  3. Phillip WoodJun 1, 2026
  4. 2/2 rebase: skip branch symref aliasesSon Luong Ngoc via GitGitGadget, May 28, 2026
  5. Kristoffer HaugsbakkMay 28, 2026
  6. Phillip WoodJun 1, 2026
  7. Junio C HamanoMay 28, 2026
  8. rebase: skip branch symref aliasesSon Luong Ngoc via GitGitGadget, Jun 3, 2026
  9. Phillip WoodJun 4, 2026
  10. Son Luong NgocJul 22, 2026
  11. 0/2 rebase: handle --update-refs branch symrefsSon Luong Ngoc via GitGitGadget, Jul 22, 2026
  12. 1/2 rebase: skip branch symref aliasesSon Luong Ngoc via GitGitGadget, Jul 22, 2026
  13. Phillip WoodJul 23, 2026
  14. Phillip WoodJul 24, 2026
  15. Erik Cervin-EdinJul 25, 2026
  16. Junio C HamanoJul 26, 2026
  17. Phillip WoodJul 28, 2026
  18. Junio C HamanoJul 28, 2026
  19. Phillip WoodJul 29, 2026
  20. Junio C HamanoJul 29, 2026
  21. Phillip WoodJul 30, 2026
  22. Junio C HamanoAug 6, 2026
  23. Phillip WoodAug 7, 2026
  24. 2/2 rebase: guard non-branch symref targetsSon Luong Ngoc via GitGitGadget, Jul 22, 2026
  25. Phillip WoodAug 7, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.