git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v3 0/5] stash: clean up index-mode test merge

From
D. Ben Knoble <ben.knoble@gmail.com>
Date
Sep 28, 2026, 15:36 UTC
Message-ID
<CALnO6CC-eop86W3VREwGz0seG1pmtd0qS968TyP=mo_G+ZMrSA@mail.gmail.com>
In-Reply-To
<CAA0xjtpzaWH10pHOQ5j-5Hp1yHEKTDFbsicG6E4w=5nxb_irWw@mail.gmail.com>
Let me see if I understand correctly…
On Mon, Sep 28, 2026 at 10:50 AM Thomas Bachem <mail@thomasbachem.com> wrote:
Show 8 quoted lines
>
> 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.

Show 33 quoted lines
> 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!

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?

-- 
D. Ben Knoble
Previous: Thomas BachemNext: D. Ben Knoble
Message 56 of 78 in “Hi all,”
  1. 0/2 Hi all,D. Ben Knoble, Sep 19, 2026
  2. 1/2 builtin/stash: remove unused headerD. Ben Knoble, Sep 19, 2026
  3. Junio C HamanoSep 21, 2026
  4. 2/2 builtin/stash: merge index in-coreD. Ben Knoble, Sep 19, 2026
  5. Phillip WoodSep 21, 2026
  6. D. Ben KnobleSep 22, 2026
  7. D. Ben KnobleSep 22, 2026
  8. Phillip WoodSep 22, 2026
  9. D. Ben KnobleSep 22, 2026
  10. D. Ben KnobleSep 19, 2026
  11. 0/4 stash: clean up index-mode test mergeD. Ben Knoble, Sep 23, 2026
  12. 1/4 builtin/stash: remove unused headerD. Ben Knoble, Sep 23, 2026
  13. 2/4 stash: prepare merge options earlierD. Ben Knoble, Sep 23, 2026
  14. 3/4 t: test failed "stash apply --index"D. Ben Knoble, Sep 23, 2026
  15. Phillip WoodSep 24, 2026
  16. D. Ben KnobleSep 25, 2026
  17. Phillip WoodSep 25, 2026
  18. Phillip WoodSep 26, 2026
  19. D. Ben KnobleSep 26, 2026
  20. 4/4 builtin/stash: merge index in-coreD. Ben Knoble, Sep 23, 2026
  21. Phillip WoodSep 24, 2026
  22. D. Ben KnobleSep 25, 2026
  23. Phillip WoodSep 25, 2026
  24. D. Ben KnobleSep 25, 2026
  25. Junio C HamanoSep 24, 2026
  26. Junio C HamanoSep 25, 2026
  27. D. Ben KnobleSep 25, 2026
  28. Junio C HamanoSep 25, 2026
  29. Phillip WoodSep 26, 2026
  30. D. Ben KnobleSep 26, 2026
  31. Phillip WoodSep 25, 2026
  32. D. Ben KnobleSep 25, 2026
  33. Junio C HamanoSep 25, 2026
  34. 0/5 stash: clean up index-mode test mergeD. Ben Knoble, Sep 26, 2026
  35. 1/5 builtin/stash: remove unused headerD. Ben Knoble, Sep 26, 2026
  36. 2/5 stash: prepare merge options earlierD. Ben Knoble, Sep 26, 2026
  37. 3/5 t3903: test stash --index mergesD. Ben Knoble, Sep 26, 2026
  38. Phillip WoodSep 28, 2026
  39. D. Ben KnobleSep 28, 2026
  40. Phillip WoodSep 29, 2026
  41. 4/5 t3903: test failed "stash apply --index"D. Ben Knoble, Sep 26, 2026
  42. 5/5 builtin/stash: merge index in-coreD. Ben Knoble, Sep 26, 2026
  43. Junio C HamanoSep 27, 2026
  44. D. Ben KnobleSep 28, 2026
  45. Junio C HamanoSep 28, 2026
  46. D. Ben KnobleSep 28, 2026
  47. Junio C HamanoSep 28, 2026
  48. D. Ben KnobleSep 26, 2026
  49. Junio C HamanoSep 27, 2026
  50. Phillip WoodSep 28, 2026
  51. D. Ben KnobleSep 28, 2026
  52. D. Ben KnobleSep 28, 2026
  53. D. Ben KnobleSep 28, 2026
  54. Phillip WoodSep 28, 2026
  55. Thomas BachemSep 28, 2026
  56. D. Ben KnobleSep 28, 2026
  57. D. Ben KnobleSep 29, 2026
  58. Phillip WoodSep 29, 2026
  59. Phillip WoodSep 28, 2026
  60. 0/5 stash: clean up index-mode test mergeD. Ben Knoble, Sep 29, 2026
  61. 1/5 builtin/stash: remove unused headerD. Ben Knoble, Sep 29, 2026
  62. 2/5 stash: prepare merge options earlierD. Ben Knoble, Sep 29, 2026
  63. 3/5 t3903: test failed "stash apply --index"D. Ben Knoble, Sep 29, 2026
  64. 4/5 t5520: don't expire reflogs where it mattersD. Ben Knoble, Sep 29, 2026
  65. Phillip WoodSep 29, 2026
  66. 5/5 builtin/stash: merge index in-coreD. Ben Knoble, Sep 29, 2026
  67. Junio C HamanoSep 29, 2026
  68. D. Ben KnobleSep 30, 2026
  69. Phillip WoodSep 29, 2026
  70. Ben KnobleSep 29, 2026
  71. D. Ben KnobleSep 30, 2026
  72. 0/4 stash: clean up index-mode test mergeD. Ben Knoble, Sep 30, 2026
  73. 1/4 builtin/stash: remove unused headerD. Ben Knoble, Sep 30, 2026
  74. 3/4 t3903: test failed "stash apply --index"D. Ben Knoble, Sep 30, 2026
  75. 2/4 stash: prepare merge options earlierD. Ben Knoble, Sep 30, 2026
  76. 4/4 builtin/stash: merge index in-coreD. Ben Knoble, Sep 30, 2026
  77. Phillip WoodOct 1, 2026
  78. Junio C HamanoOct 1, 2026

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.