Thread (287 messages) 287 messages, 11 authors, 2018-10-08

Re: [PATCH 8/8] rebase -i: introduce --recreate-merges=no-rebase-cousins

From: Johannes Schindelin <hidden>
Date: 2018-01-29 20:42:52

Hi Philip,

On Thu, 18 Jan 2018, Philip Oakley wrote:
From: "Johannes Schindelin" <redacted>
quoted
This one is a bit tricky to explain, so let's try with a diagram:

       C
     /   \
A - B - E - F
 \   /
   D

To illustrate what this new mode is all about, let's consider what
happens upon `git rebase -i --recreate-merges B`, in particular to
the commit `D`. In the default mode, the new branch structure is:

     --- C' --
     /         \
A - B ------ E' - F'
     \    /
       D'

This is not really preserving the branch topology from before! The
reason is that the commit `D` does not have `B` as ancestor, and
therefore it gets rebased onto `B`.

However, when recreating branch structure, there are legitimate use
cases where one might want to preserve the branch points of commits that
do not descend from the <upstream> commit that was passed to the rebase
command, e.g. when a branch from core Git's `next` was merged into Git
for Windows' master we will not want to rebase those commits on top of a
Windows-specific commit. In the example above, the desired outcome would
look like this:

     --- C' --
     /         \
A - B ------ E' - F'
 \        /
  -- D' --
I'm not understanding this. I see that D properly starts from A, but
don't see why it is now D'. Surely it's unchanged.
It is not necessarily unchanged, because this is an *interactive* rebase.
If you mark `D` for `reword`, for example, it may be changed.

I use the label D' in the mathematical sense, to indicate that D' is
derived from D. It may even be identical to D, but the point is that it is
in the todo list of the interactive rebase, so it can be changed. As
opposed to, say, A and B. Those cannot be changed in this interactive
rebase.
Maybe it's the arc/node confusion. Maybe even spell out that the rebased
commits from the command are B..HEAD, but that includes D, which may not
be what folk had expected. (not even sure if the reflog comes into
determining merge-bases here..)

I do think an exact definition is needed (e.g. via --ancestry-path or
its equivalent?).
I don't find "ancestry path" any more intuitive a term than the
mathematically correct "uncomparable".

If you have a better way to explain this (without devolving into
mathematical terminology), please let's hear it.

Don't get me wrong, as a mathematician I am comfortable with very precise
descriptions involving plenty of Greek symbols.

But this documentation, and these commit messages do not target myself. I
know perfectly well what I am talking about here. The target audience are
software developers who may not have a background in mathematics, who do
not even want to fully understand what the heck constitutes a Directed
Acyclic Graph.

So what we need here is plain English. And I had thought that the analogy
with the family tree would be intuitive enough for even math haters to
understand easily and quickly...

Ciao,
Dscho
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help