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

Re: [PATCH v2 5/5] doc: git-rebase: update discussion of internals

From
Junio C Hamano <gitster@pobox.com>
Date
Aug 8, 2025, 21:54 UTC
Message-ID
<xmqqbjopfpiy.fsf@gitster.g>
In-Reply-To
<ad97cd9e6718be2540657c2c820f29b9efafa883.1754680525.git.gitgitgadget@gmail.com>
"Julia Evans via GitGitGadget" <gitgitgadget@gmail.com> writes:
> From: Julia Evans <julia@jvns.ca>
>
> - make it clearer that we're talking about three steps of a process

A good call. "First, then, then" does make it clear where each new step begins. "First, then, finally" would make it even more obvious which step concludes the sequence, though.

> - delete a duplicate explanation of how git rebase skips commits with
>   the same textual changes (it's explained in more detail a few lines
>   further down)
OK.
> - move the `ORIG_HEAD` note down so that it doesn't interrupt the
>   discussion of the mechanics.

I thought you moved the "finally we reapply" up, instead of moving the note down ;-) And when viewed that way, a more direct way to justify this change is that you made sure these three steps are kept together.

Again, good change.
Show 9 quoted lines
> -All changes made by commits in the current branch but that are not
> +Here is a more detailed description of what `git rebase <upstream>` does:
> +
> +First, all changes made by commits in the current branch but that are not
>  in `<upstream>` are saved to a temporary area.  This is the same set
>  of commits that would be shown by `git log <upstream>..HEAD`; or by
>  `git log 'fork_point'..HEAD`, if `--fork-point` is active (see the
>  description on `--fork-point` below); or by `git log HEAD`, if the
>  `--root` option is specified.

If we are ambitious, we may want to rewrite this first step to put almost no stress on "saving" and "temporary area". Especially when you rebase with merge backend, it would be morally a sequence of cherry-pick, without us having to save anything---we only need to figure out which commits to replay in what order.

    First, the command figures out changes from which commits to
    replay in what order.  The set of commits are those shown by
    `git log <base>..HEAD`, where <base> is the <upstream> if given,
    or computed fork-point if the `--fork-point` option is active,
    or all commits that lead to `HEAD` if `--root` is given.
Show 5 quoted lines
> -The current branch is reset to `<upstream>` or `<newbase>` if the
> +Then the current branch is reset to `<upstream>` or `<newbase>` if the
>  `--onto` option was supplied.  This has the exact same effect as
>  `git reset --hard <upstream>` (or `<newbase>`). `ORIG_HEAD` is set
>  to point at the tip of the branch before the reset.
"This has the exact same effect as" made my reading hiccup.
    Then `git reset --hard` rewinds the current branch to the commit
    given by `--onto`, if specified, or to `<upstream>`.

I am not sure if it is worth talking about ORIG_HEAD at this point, as that is part of what `git reset --hard` does with this step. Given especially that we have NOTE that says ORIG_HEAD cannot be relied upon once the replaying of commits begin, mentioning the value of ORIG_HEAD before the replaying begins does not seem to add much value to the explanation.

> +Then the commits that were previously saved into the temporary area are
> +reapplied to the current branch, one by one, in order.
Yup.  As I suggested, "Then" -> "Finally".

I do not know how much detail we want to give to readers, and I do to prefer to tell some white lie in end-user facing documentation if simplified description helps the initial understanding, so I am not yet decided if I recommend rewriting these "three step" explanation, but FYI, the modern rebase machinery works slightly differently:

    First the command figures out what to replay, on which commit,
    and in what order.
    Then the HEAD is detached ("git checkout --detach <onto>") to
    the commit the first change is replayed onto.
    Then the changes are replayed, one by one, in the order.
    Optionally a mergy history can be rebased while retaining
    the topology.
    Finally, the branch being rebased is made to point at the
    resulting HEAD (i.e. equivalent to "git checkout -B <branch>"
    to jump back from the detached HEAD state).

The difference between the simplified procedure and this "replaying is done while on detached HEAD" procedure gives us a somewhat big usability improvement, as a rebasing will be recorded in a single reflog event for the branch getting rebased, no matter how many commits are on the branch.

Previous: Julia Evans via GitGitGadgetNext: Julia Evans via GitGitGadget
Message 19 of 103 in “doc: git-rebase: clarify DESCRIPTION section”
  1. 0/5 doc: git-rebase: clarify DESCRIPTION sectionJulia Evans via GitGitGadget, Aug 8, 2025
  2. 1/5 doc: git-rebase: start with an exampleJulia Evans via GitGitGadget, Aug 8, 2025
  3. Junio C HamanoAug 8, 2025
  4. Julia EvansAug 8, 2025
  5. Junio C HamanoAug 8, 2025
  6. 2/5 doc: git rebase: dedup merge conflict discussionJulia Evans via GitGitGadget, Aug 8, 2025
  7. Junio C HamanoAug 8, 2025
  8. 3/5 doc: git rebase: clarify arguments syntaxJulia Evans via GitGitGadget, Aug 8, 2025
  9. 4/5 doc: git-rebase: move --onto explanation downJulia Evans via GitGitGadget, Aug 8, 2025
  10. 5/5 doc: git-rebase: update discussion of internalsJulia Evans via GitGitGadget, Aug 8, 2025
  11. 0/5 doc: git-rebase: clarify DESCRIPTION sectionJulia Evans via GitGitGadget, Aug 8, 2025
  12. 1/5 doc: git-rebase: start with an exampleJulia Evans via GitGitGadget, Aug 8, 2025
  13. Junio C HamanoAug 8, 2025
  14. 2/5 doc: git rebase: dedup merge conflict discussionJulia Evans via GitGitGadget, Aug 8, 2025
  15. 3/5 doc: git rebase: clarify arguments syntaxJulia Evans via GitGitGadget, Aug 8, 2025
  16. Junio C HamanoAug 8, 2025
  17. 4/5 doc: git-rebase: move --onto explanation downJulia Evans via GitGitGadget, Aug 8, 2025
  18. 5/5 doc: git-rebase: update discussion of internalsJulia Evans via GitGitGadget, Aug 8, 2025
  19. Junio C HamanoAug 8, 2025
  20. 0/5 doc: git-rebase: clarify DESCRIPTION sectionJulia Evans via GitGitGadget, Aug 8, 2025
  21. 1/5 doc: git-rebase: start with an exampleJulia Evans via GitGitGadget, Aug 8, 2025
  22. 2/5 doc: git rebase: dedup merge conflict discussionJulia Evans via GitGitGadget, Aug 8, 2025
  23. 3/5 doc: git rebase: clarify arguments syntaxJulia Evans via GitGitGadget, Aug 8, 2025
  24. 4/5 doc: git-rebase: move --onto explanation downJulia Evans via GitGitGadget, Aug 8, 2025
  25. 5/5 doc: git-rebase: update discussion of internalsJulia Evans via GitGitGadget, Aug 8, 2025
  26. 0/5 doc: git-rebase: clarify DESCRIPTION sectionJulia Evans via GitGitGadget, Aug 9, 2025
  27. 1/5 doc: git-rebase: start with an exampleJulia Evans via GitGitGadget, Aug 9, 2025
  28. Phillip WoodAug 10, 2025
  29. Patrick SteinhardtAug 11, 2025
  30. Karthik NayakAug 11, 2025
  31. Ben KnobleAug 11, 2025
  32. Karthik NayakAug 12, 2025
  33. Junio C HamanoAug 12, 2025
  34. Phillip WoodAug 11, 2025
  35. Karthik NayakAug 12, 2025
  36. D. Ben KnobleAug 12, 2025
  37. Junio C HamanoAug 12, 2025
  38. Karthik NayakAug 14, 2025
  39. 2/5 doc: git rebase: dedup merge conflict discussionJulia Evans via GitGitGadget, Aug 9, 2025
  40. Patrick SteinhardtAug 11, 2025
  41. Phillip WoodAug 11, 2025
  42. 3/5 doc: git rebase: clarify arguments syntaxJulia Evans via GitGitGadget, Aug 9, 2025
  43. 4/5 doc: git-rebase: move --onto explanation downJulia Evans via GitGitGadget, Aug 9, 2025
  44. D. Ben KnobleAug 9, 2025
  45. 5/5 doc: git-rebase: update discussion of internalsJulia Evans via GitGitGadget, Aug 9, 2025
  46. Phillip WoodAug 10, 2025
  47. symmetric difference with --left-only vs. range notationD. Ben Knoble, Aug 13, 2025
  48. Junio C HamanoAug 13, 2025
  49. Patrick SteinhardtAug 11, 2025
  50. Ben KnobleAug 11, 2025
  51. Patrick SteinhardtAug 11, 2025
  52. Julia EvansAug 11, 2025
  53. 0/5 doc: git-rebase: clarify DESCRIPTION sectionJulia Evans via GitGitGadget, Aug 11, 2025
  54. 1/5 doc: git-rebase: start with an exampleJulia Evans via GitGitGadget, Aug 11, 2025
  55. Junio C HamanoAug 11, 2025
  56. 2/5 doc: git rebase: dedup merge conflict discussionJulia Evans via GitGitGadget, Aug 11, 2025
  57. 3/5 doc: git rebase: clarify arguments syntaxJulia Evans via GitGitGadget, Aug 11, 2025
  58. 4/5 doc: git-rebase: move --onto explanation downJulia Evans via GitGitGadget, Aug 11, 2025
  59. 5/5 doc: git-rebase: update discussion of internalsJulia Evans via GitGitGadget, Aug 11, 2025
  60. Junio C HamanoAug 11, 2025
  61. 0/5 doc: git-rebase: clarify DESCRIPTION sectionJulia Evans via GitGitGadget, Aug 11, 2025
  62. 1/5 doc: git-rebase: start with an exampleJulia Evans via GitGitGadget, Aug 11, 2025
  63. 2/5 doc: git rebase: dedup merge conflict discussionJulia Evans via GitGitGadget, Aug 11, 2025
  64. 3/5 doc: git rebase: clarify arguments syntaxJulia Evans via GitGitGadget, Aug 11, 2025
  65. 4/5 doc: git-rebase: move --onto explanation downJulia Evans via GitGitGadget, Aug 11, 2025
  66. 5/5 doc: git-rebase: update discussion of internalsJulia Evans via GitGitGadget, Aug 11, 2025
  67. Junio C HamanoAug 11, 2025
  68. Julia EvansAug 11, 2025
  69. Junio C HamanoAug 11, 2025
  70. 0/5 doc: git-rebase: clarify DESCRIPTION sectionJulia Evans via GitGitGadget, Aug 12, 2025
  71. 1/5 doc: git-rebase: start with an exampleJulia Evans via GitGitGadget, Aug 12, 2025
  72. 2/5 doc: git rebase: dedup merge conflict discussionJulia Evans via GitGitGadget, Aug 12, 2025
  73. 3/5 doc: git rebase: clarify arguments syntaxJulia Evans via GitGitGadget, Aug 12, 2025
  74. 4/5 doc: git-rebase: move --onto explanation downJulia Evans via GitGitGadget, Aug 12, 2025
  75. 5/5 doc: git-rebase: update discussion of internalsJulia Evans via GitGitGadget, Aug 12, 2025
  76. Junio C HamanoAug 14, 2025
  77. 0/5 doc: git-rebase: clarify DESCRIPTION sectionJulia Evans via GitGitGadget, Aug 15, 2025
  78. 1/5 doc: git-rebase: start with an exampleJulia Evans via GitGitGadget, Aug 15, 2025
  79. 2/5 doc: git rebase: dedup merge conflict discussionJulia Evans via GitGitGadget, Aug 15, 2025
  80. 3/5 doc: git rebase: clarify arguments syntaxJulia Evans via GitGitGadget, Aug 15, 2025
  81. 4/5 doc: git-rebase: move --onto explanation downJulia Evans via GitGitGadget, Aug 15, 2025
  82. Junio C HamanoAug 15, 2025
  83. Phillip WoodAug 18, 2025
  84. Junio C HamanoAug 18, 2025
  85. Julia EvansAug 19, 2025
  86. Junio C HamanoAug 19, 2025
  87. 5/5 doc: git-rebase: update discussion of internalsJulia Evans via GitGitGadget, Aug 15, 2025
  88. Phillip WoodAug 18, 2025
  89. 0/5 doc: git-rebase: clarify DESCRIPTION sectionJulia Evans via GitGitGadget, Aug 23, 2025
  90. 1/5 doc: git-rebase: start with an exampleJulia Evans via GitGitGadget, Aug 23, 2025
  91. 2/5 doc: git rebase: dedup merge conflict discussionJulia Evans via GitGitGadget, Aug 23, 2025
  92. 3/5 doc: git rebase: clarify arguments syntaxJulia Evans via GitGitGadget, Aug 23, 2025
  93. 4/5 doc: git-rebase: move --onto explanation downJulia Evans via GitGitGadget, Aug 23, 2025
  94. 5/5 doc: git-rebase: update discussion of internalsJulia Evans via GitGitGadget, Aug 23, 2025
  95. Phillip WoodAug 13, 2025
  96. Julia EvansAug 13, 2025
  97. Junio C HamanoAug 14, 2025
  98. Phillip WoodAug 15, 2025
  99. Junio C HamanoAug 15, 2025
  100. Phillip WoodAug 15, 2025
  101. Julia EvansAug 15, 2025
  102. Phillip WoodAug 15, 2025
  103. D. Ben KnobleAug 9, 2025

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.