Re: [PATCH v2 5/9] reset: introduce ability to skip reference updates
From: Phillip Wood <hidden>
Date: 2026-06-05 15:12:57
Hi Patrick On 03/06/2026 17:14, Patrick Steinhardt wrote:
In a subsequent commit we'll introduce a new caller to `reset_head()` that really only wants to update the index and working tree, without updating any references. Introduce a new flag that lets the caller perform this operation.
We already have a flag to update ORIG_HEAD so would it make more sense to have a flag to update HEAD, rather than adding a flag to disable the updates? It would mean updating the existing callers but I think it is a clearer api and it avoids the pitfall of RESET_HEAD_ORIG_HEAD | RESET_HEAD_SKIP_REF_UPDATES I wonder about the function name as well if we make updating HEAD optional then what does reset_head() mean? Maybe we should rename it something along the lines of reset_worktree() or update_working_copy()? I'm not really sure what a good name would be. Thanks Phillip
quoted hunk ↗ jump to hunk
Signed-off-by: Patrick Steinhardt <redacted> --- reset.c | 7 ++++++- reset.h | 3 +++ 2 files changed, 9 insertions(+), 1 deletion(-)diff --git a/reset.c b/reset.c index a8d7eea4d6..ed9df6ca5c 100644 --- a/reset.c +++ b/reset.c@@ -93,6 +93,7 @@ int reset_head(struct repository *r, const struct reset_head_opts *opts) unsigned refs_only = opts->flags & RESET_HEAD_REFS_ONLY; unsigned update_orig_head = opts->flags & RESET_HEAD_ORIG_HEAD; unsigned dry_run = opts->flags & RESET_HEAD_DRY_RUN; + unsigned skip_ref_updates = opts->flags & RESET_HEAD_SKIP_REF_UPDATES; struct object_id *head = NULL, head_oid; struct tree_desc desc[2] = { { NULL }, { NULL } }; struct lock_file lock = LOCK_INIT;@@ -112,6 +113,9 @@ int reset_head(struct repository *r, const struct reset_head_opts *opts) if (opts->branch_msg && !opts->branch) BUG("branch reflog message given without a branch"); + if (skip_ref_updates && (opts->branch || refs_only)) + BUG("asked to perform ref updates and skip them at the same time"); + if (!refs_only && !dry_run && repo_hold_locked_index(r, &lock, LOCK_REPORT_ON_ERROR) < 0) { ret = -1; goto leave_reset_head;@@ -196,7 +200,8 @@ int reset_head(struct repository *r, const struct reset_head_opts *opts) goto leave_reset_head; } - if (oid != &head_oid || update_orig_head || switch_to_branch) + if (!skip_ref_updates && + (oid != &head_oid || update_orig_head || switch_to_branch)) ret = update_refs(r, opts, oid, head); leave_reset_head:diff --git a/reset.h b/reset.h index 9f696382c1..cb0700ffa7 100644 --- a/reset.h +++ b/reset.h@@ -27,6 +27,9 @@ enum reset_head_flags { * any user-visible state. */ RESET_HEAD_DRY_RUN = (1 << 5), + + /* Skip updating any references, only update the worktree and index. */ + RESET_HEAD_SKIP_REF_UPDATES = (1 << 6), }; struct reset_head_opts {