When "git reset" is invoked with a target that already matches HEAD, it currently writes a reflog entry even though no reference is updated.
Detect this no-op case and avoid updating ORIG_HEAD and HEAD, skipping the reflog entry entirely.
Add a regression test to ensure no reflog entry is written for a no-op reset.
Signed-off-by: Pushkar Singh <pushkarkumarsingh1970@gmail.com> --- builtin/reset.c | 4 ++++ t/t1410-reflog.sh | 15 +++++++++++++++ 2 files changed, 19 insertions(+)
Show changes to 2 files +19 −0
builtin/reset.c, t/t1410-reflog.sh
diff --git a/builtin/reset.c b/builtin/reset.c index ed35802af1..900c2f2fe8 100644 --- a/builtin/reset.c +++ b/builtin/reset.c @@ -309,6 +309,10 @@ static int reset_refs(const char *rev, const struct object_id *oid) old_orig = &oid_old_orig; if (!repo_get_oid(the_repository, "HEAD", &oid_orig)) { orig = &oid_orig; + if (oideq(orig, oid)) { + strbuf_release(&msg); + return 0; + } set_reflog_message(&msg, "updating ORIG_HEAD", NULL); refs_update_ref(get_main_ref_store(the_repository), msg.buf, "ORIG_HEAD", orig, old_orig, 0, diff --git a/t/t1410-reflog.sh b/t/t1410-reflog.sh index ce71f9a30a..54f8692c53 100755 --- a/t/t1410-reflog.sh +++ b/t/t1410-reflog.sh @@ -533,6 +533,21 @@ test_expect_success 'reflog for symref with unborn target can be listed' ' ) ' +test_expect_success 'reset does not write reflog entry on no-op' ' + git init no-op-reset && + ( + cd no-op-reset && + echo a >file && + git add file && + git commit -m initial && + + before=$(git reflog | wc -l) && + git reset HEAD && + after=$(git reflog | wc -l) && + test "$before" = "$after" + ) +' + test_expect_success 'reflog with invalid object ID can be listed' ' test_when_finished "rm -rf repo" && git init repo &&
-- 2.43.0