From: Ben Knoble Date: Mon, 08 Jun 2026 16:37:47 GMT Subject: Re: [PATCH RFC 1/2] builtin/history: abort reword on unchanged message Message-ID: <9A2F74F1-66D0-4015-B387-35B107ED6F7A@gmail.com> In-Reply-To: <20260607-ps-history-reword-v1-1-ba43a3cbb81b@gmail.com> I don’t have any strong opinions on the rest… > Le 7 juin 2026 à 16:08, Pablo Sabater a écrit : > > When using `git history reword` if the new message is the same as the > original it continues anyway creating a new commit with the same > message and updates its descendants, modifying the history after this > 'reworded' commit even though there was no actual change. > > `git commit --amend` and `git rebase -i` + reword share this behavior, > however `git history reword` is different: > 1. Works in-memory without touching the index or the worktree [1], so > there are no side effects like staged files that could justify > rewriting the history when the commit message is the same. > 2. `git history` by default updates all the branches [2] that contain the > original commit making it more costly than `git rebase -i` that only > updates the current branch. > > Add a check if the original commit message is the same as the new one > and abort if so. > > [1]: https://lore.kernel.org/git/20260113-b4-pks-history-builtin-v11-8-e74ebfa2652d@pks.im/ > [2]: https://git-scm.com/docs/git-history#_description > > Signed-off-by: Pablo Sabater > --- > builtin/history.c | 10 ++++++++++ > t/t3451-history-reword.sh | 20 ++++++++++++++++++++ > 2 files changed, 30 insertions(+) > > diff --git a/builtin/history.c b/builtin/history.c > index 0fc06fb204..51a22a9a1c 100644 > --- a/builtin/history.c > +++ b/builtin/history.c > @@ -135,6 +135,13 @@ static int commit_tree_ext(struct repository *repo, > original_body, action, &commit_message); > if (ret < 0) > goto out; > + > + if (!strcmp(original_body, commit_message.buf)) { > + fprintf(stderr, _("Message unchanged," > + " aborting reword.\n")); > + ret = 1; > + goto out; > + } > } else { > strbuf_addstr(&commit_message, original_body); > } > @@ -718,6 +725,9 @@ static int cmd_history_reword(int argc, > if (ret < 0) { > ret = error(_("failed writing reworded commit")); > goto out; > + } else if (ret == 1) { > + ret = 0; > + goto out; > } > > strbuf_addf(&reflog_msg, "reword: updating %s", argv[0]); > diff --git a/t/t3451-history-reword.sh b/t/t3451-history-reword.sh > index de7b357685..54ea8a7207 100755 > --- a/t/t3451-history-reword.sh > +++ b/t/t3451-history-reword.sh > @@ -396,4 +396,24 @@ test_expect_success 'retains changes in the worktree and index' ' > ) > ' > > +test_expect_success 'aborts if the commit message is the same' ' > + test_when_finished "rm -rf repo" && > + git init repo && > + ( > + cd repo && > + test_commit first && > + test_commit second && > + > + git rev-parse HEAD >oid-before && > + write_script fake-editor.sh <<-\EOF && > + true > + EOF > + test_set_editor "$(pwd)"/fake-editor.sh && > + git history reword HEAD 2>err && > + git rev-parse HEAD >oid-after && > + test_cmp oid-before oid-after && > + test_grep "Message unchanged" err > + ) …but I think this test case could do something like "GIT_EDITOR=true git history reword HEAD" and avoid the script? > +' > + > test_done > > -- > 2.54.0 Best, Ben