From: Phillip Wood <phillip.wood123@gmail.com>
To: "D. Ben Knoble" <ben.knoble@gmail.com>,
Thomas Bachem <mail@thomasbachem.com>
Cc: phillip.wood@dunelm.org.uk, gitster@pobox.com,
git@vger.kernel.org, eli@barzilay.org, ps@pks.im
Subject: Re: [PATCH v3 0/5] stash: clean up index-mode test merge
Date: Tue, 29 Sep 2026 16:54:28 +0100 [thread overview]
Message-ID: <54957537-e40d-45b6-886c-5fc433f3d54e@gmail.com> (raw)
In-Reply-To: <CALnO6CC-eop86W3VREwGz0seG1pmtd0qS968TyP=mo_G+ZMrSA@mail.gmail.com>
Hi Ben
On 28/09/2026 16:36, D. Ben Knoble wrote:
> Let me see if I understand correctly…
>
> On Mon, Sep 28, 2026 at 10:50 AM Thomas Bachem <mail@thomasbachem.com> wrote:
>>
>> On Mon, Sep 28, 2026 at 3:45 PM Phillip Wood <phillip.wood123@gmail.com> wrote:
>>> Oh, when I was thinking about this over lunch I did wonder if that might
>>> be the culprit. Previously we didn't run "git maintenance --auto" after
>>> a rebase with the 'merge' backend but with that topic we do, and because
>>> we set GIT_COMMITTER_DATE to sometime in 2005, if 'git reflog expire'
>>> gets triggered it will expire the reflog entries that 'git pull
>>> --rebase' relies on. As you suggested in another mail, I assume this
>
>> "git pull --rebase" computes the fork point before it fetches, from
>> the reflog of refs/remotes/me/copy,
>
> This is described by the manual for git-rebase under --fork-point,
> which is on unless we have an <upstream> or --keep-base (modulo
> config). Put a pin in this.
>
>> and test 69 needs the entry that
>> test 68's fetch wrote there, copy-orig (f29aa66) to ae98574. With the
>> reflog empty, "merge-base --fork-point" falls back to the ref itself,
>> ae98574 is no ancestor of to-rebase, and pull hands the merge head to
>> rebase as the upstream. That is your "--onto ae98... ae98...", and the
>> four commits from copy-orig up come back, the first of them
>> conflicting with "conflict".
>>
>>> topic has changed something in one of the '--autostash' tests that come
>>> before the failing test triggers which the new behavior. What that
>>> something is I'm not sure; off the top of my head I'd expect the number
>>> of reflog entries in HEAD to be the same but maybe I'm missing
>>> something. Adding
>>
>> It is eight entries fewer, and they come from the failed merges, not
>> from the autostash tests. "git merge" restores a dirty tree with
>> "stash apply --index --quiet", and until Ben's series that spawned
>> "git reset --quiet --refresh", which writes "reset: moving to HEAD"
>> to the reflog. That happens eight times in t5520 before test 68.
>>
>> Auto maintenance expires reflogs once HEAD's reflog holds a hundred
>> entries that the policy would remove, the default of
>> maintenance.reflog-expire.auto, and after the first test_tick that is
>> every entry. Which run crosses the hundred depends on how many entries
>> and maintenance runs came before it. On 'seen' the expiry lands on
>> "git commit -m conflict" in test 68, before the fetch writes the entry.
>> Eight entries fewer move the crossing past that commit, and the
>> maintenance run my topic adds at the end of the rebase in test 68 is
>> the next one: after the fetch, before test 69 reads the reflog. Either
>> change alone leaves it somewhere harmless, and nothing else is going
>> on. The expiry is the usual 90 days applied to entries dated 2005, and
>> the only new thing is one more maintenance run per rebase, the same
>> one "git commit" and "git fetch" run.
>
> In short, expiry used to happen prior to .68, so the reflog entry
> created in that test which is used by "pull --rebase" in .69 is picked
> up. With fewer reflog entries, expiry happens later, and it just so
> happens to drop the important entry. Darn!
Yes, it is incredibly bad luck that the test broke, though I guess it is
also fortunate as it means we can fix the latent bug in the test.
>
> But here's what I can't figure out, returning to that pin from
> earlier: I was a bit surprised to see mention of rebase reading
> reflogs! When I remembered --fork-point, I was even more curious (but
> at least it's obvious that rebase will read the reflogs in some
> scenarios).
>
> What confuses me is that builtin/pull.c:run_rebase() sure looks like
> it provides an <upstream> to the command invocation, so shouldn't
> --fork-point and reflog use be disabled????
>
> I'll try tracing that test myself later, I suppose. It's nice to know
> we have a fix available (thanks for the patch), but it sure feels like
> a hack :) oh well?
It is a bit confusing that "git pull --rebase" does not use "git rebase
--fork-point", instead it calls "git merge-base --fork-point" (which is
where we read the reflog of the remote branch) itself and then passes
that as the upstream revision to "git rebase". I think this is because
fork-point handling was added to "git pull" before "--fork-point"
existed in "git rebase". "git rebase" only looks for a fork-point if its
upstream argument is a ref, so as "git pull" passes an object id, the
fork-point detection in rebase is bypassed.
Thanks
Phillip
next prev parent reply other threads:[~2026-09-29 15:54 UTC|newest]
Thread overview: 78+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-09-19 21:26 [PATCH 0/2] Hi all, D. Ben Knoble
2026-09-19 21:26 ` [PATCH 1/2] builtin/stash: remove unused header D. Ben Knoble
2026-09-21 15:10 ` Junio C Hamano
2026-09-19 21:26 ` [PATCH 2/2] builtin/stash: merge index in-core D. Ben Knoble
2026-09-21 13:17 ` Phillip Wood
2026-09-22 12:43 ` D. Ben Knoble
2026-09-22 12:51 ` D. Ben Knoble
2026-09-22 13:57 ` Phillip Wood
2026-09-22 20:34 ` D. Ben Knoble
2026-09-19 21:32 ` [PATCH 0/2] Hi all, D. Ben Knoble
2026-09-23 12:58 ` [PATCH v2 0/4] stash: clean up index-mode test merge D. Ben Knoble
2026-09-23 12:58 ` [PATCH v2 1/4] builtin/stash: remove unused header D. Ben Knoble
2026-09-23 12:58 ` [PATCH v2 2/4] stash: prepare merge options earlier D. Ben Knoble
2026-09-23 12:58 ` [PATCH v2 3/4] t: test failed "stash apply --index" D. Ben Knoble
2026-09-24 9:42 ` Phillip Wood
2026-09-25 13:36 ` D. Ben Knoble
2026-09-25 15:45 ` Phillip Wood
2026-09-26 9:53 ` Phillip Wood
2026-09-26 12:07 ` D. Ben Knoble
2026-09-23 12:58 ` [PATCH v2 4/4] builtin/stash: merge index in-core D. Ben Knoble
2026-09-24 9:42 ` Phillip Wood
2026-09-25 12:55 ` D. Ben Knoble
2026-09-25 15:58 ` Phillip Wood
2026-09-25 16:16 ` D. Ben Knoble
2026-09-24 21:59 ` Junio C Hamano
2026-09-25 4:12 ` Junio C Hamano
2026-09-25 13:00 ` D. Ben Knoble
2026-09-25 16:24 ` Junio C Hamano
2026-09-26 9:51 ` Phillip Wood
2026-09-26 12:04 ` D. Ben Knoble
2026-09-25 16:04 ` Phillip Wood
2026-09-25 16:17 ` D. Ben Knoble
2026-09-25 16:49 ` Junio C Hamano
2026-09-26 12:16 ` [PATCH v3 0/5] stash: clean up index-mode test merge D. Ben Knoble
2026-09-26 12:16 ` [PATCH v3 1/5] builtin/stash: remove unused header D. Ben Knoble
2026-09-26 12:16 ` [PATCH v3 2/5] stash: prepare merge options earlier D. Ben Knoble
2026-09-26 12:16 ` [PATCH v3 3/5] t3903: test stash --index merges D. Ben Knoble
2026-09-28 15:44 ` Phillip Wood
2026-09-28 15:55 ` D. Ben Knoble
2026-09-29 9:41 ` Phillip Wood
2026-09-26 12:16 ` [PATCH v3 4/5] t3903: test failed "stash apply --index" D. Ben Knoble
2026-09-26 12:16 ` [PATCH v3 5/5] builtin/stash: merge index in-core D. Ben Knoble
2026-09-27 18:59 ` Junio C Hamano
2026-09-28 12:02 ` D. Ben Knoble
2026-09-28 9:40 ` Junio C Hamano
2026-09-28 12:03 ` D. Ben Knoble
2026-09-28 15:32 ` Junio C Hamano
2026-09-26 12:20 ` [PATCH v3 0/5] stash: clean up index-mode test merge D. Ben Knoble
2026-09-27 19:21 ` Junio C Hamano
2026-09-28 9:50 ` Phillip Wood
2026-09-28 12:05 ` D. Ben Knoble
2026-09-28 12:33 ` D. Ben Knoble
2026-09-28 13:00 ` D. Ben Knoble
2026-09-28 13:45 ` Phillip Wood
2026-09-28 14:50 ` Thomas Bachem
2026-09-28 15:36 ` D. Ben Knoble
2026-09-29 11:38 ` D. Ben Knoble
2026-09-29 15:54 ` Phillip Wood [this message]
2026-09-28 15:40 ` Phillip Wood
2026-09-29 12:18 ` [PATCH v4 " D. Ben Knoble
2026-09-29 12:18 ` [PATCH v4 1/5] builtin/stash: remove unused header D. Ben Knoble
2026-09-29 12:18 ` [PATCH v4 2/5] stash: prepare merge options earlier D. Ben Knoble
2026-09-29 12:18 ` [PATCH v4 3/5] t3903: test failed "stash apply --index" D. Ben Knoble
2026-09-29 12:18 ` [PATCH v4 4/5] t5520: don't expire reflogs where it matters D. Ben Knoble
2026-09-29 15:46 ` Phillip Wood
2026-09-29 12:18 ` [PATCH v4 5/5] builtin/stash: merge index in-core D. Ben Knoble
2026-09-29 20:07 ` Junio C Hamano
2026-09-30 1:29 ` D. Ben Knoble
2026-09-29 15:48 ` [PATCH v4 0/5] stash: clean up index-mode test merge Phillip Wood
2026-09-29 17:31 ` Ben Knoble
2026-09-30 21:26 ` D. Ben Knoble
2026-09-30 21:24 ` [PATCH v5 0/4] " D. Ben Knoble
2026-09-30 21:24 ` [PATCH v5 1/4] builtin/stash: remove unused header D. Ben Knoble
2026-09-30 21:24 ` [PATCH v5 2/4] stash: prepare merge options earlier D. Ben Knoble
2026-09-30 21:24 ` [PATCH v5 3/4] t3903: test failed "stash apply --index" D. Ben Knoble
2026-09-30 21:24 ` [PATCH v5 4/4] builtin/stash: merge index in-core D. Ben Knoble
2026-10-01 15:52 ` [PATCH v5 0/4] stash: clean up index-mode test merge Phillip Wood
2026-10-01 17:47 ` Junio C Hamano
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=54957537-e40d-45b6-886c-5fc433f3d54e@gmail.com \
--to=phillip.wood123@gmail.com \
--cc=ben.knoble@gmail.com \
--cc=eli@barzilay.org \
--cc=git@vger.kernel.org \
--cc=gitster@pobox.com \
--cc=mail@thomasbachem.com \
--cc=phillip.wood@dunelm.org.uk \
--cc=ps@pks.im \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox