Merge branch 'ag/rebase-update-refs-limit-to-branches'

"git rebase --update-refs", when used with an rebase.instructionFormat
with "%d" (describe) in it, tried to update local branch HEAD by
mistake, which has been corrected.

* ag/rebase-update-refs-limit-to-branches:
  rebase: ignore non-branch update-refs
main
Junio C Hamano 2026-05-19 09:57:46 +09:00
commit 1cde0a68d8
2 changed files with 25 additions and 1 deletions

View File

@ -6460,8 +6460,14 @@ static int add_decorations_to_list(const struct commit *commit,
/*
* If the branch is the current HEAD, then it will be
* updated by the default rebase behavior.
* Exclude it from the list of refs to update,
* as well as any non-branch decorations.
* Non-branch decorations may be present if the pretty format
* includes "%d", which would have loaded all refs
* into the global decoration table.
*/
if (head_ref && !strcmp(head_ref, decoration->name)) {
if ((head_ref && !strcmp(head_ref, decoration->name)) ||
(decoration->type != DECORATION_REF_LOCAL)) {
decoration = decoration->next;
continue;
}

View File

@ -1960,6 +1960,24 @@ test_expect_success '--update-refs adds commands with --rebase-merges' '
)
'

test_expect_success '--update-refs ignores non-branch decorations' '
test_when_finished "git branch -D update-refs" &&
test_when_finished "git checkout primary" &&
git checkout -B update-refs no-conflict-branch &&
(
set_cat_todo_editor &&

# rebase.instructionFormat=%d loads normal log decorations before
# --update-refs adds its branch placeholders so we must ignore
# all non-local decorations.
test_must_fail git -c rebase.instructionFormat="%s%d" \
rebase -i --update-refs HEAD^ >todo
) &&
grep ^update-ref todo >actual &&
test_write_lines "update-ref refs/heads/no-conflict-branch" >expect &&
test_cmp expect actual
'

test_expect_success '--update-refs updates refs correctly' '
git checkout -B update-refs no-conflict-branch &&
git branch -f base HEAD~4 &&