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

Re: overly smart rebase - bug or feature?

From
FSFedor Sergeev <fedor.sergeev@sun.com>
Date
Nov 10, 2008, 23:36 UTC
Message-ID
<20081110233649.GI6799@sun.com>
In-Reply-To
<7vod0n41i5.fsf@gitster.siamese.dyndns.org>
On Mon, Nov 10, 2008 at 03:14:42PM -0800, Junio C Hamano wrote:
Show 8 quoted lines
> Fedor Sergeev <Fedor.Sergeev@Sun.COM> writes:
> 
> > I have recently hit a behavior which might well be a feature, 
> > but it was very surprising (in a bad sense) to me.
> 
> It is a feature misfiring.
> 
> Rebase is essentially a repeated cherry-pick, and a cherry-pick of commit
But cherry-pick does fail, as shown in my original mail!
Show 6 quoted lines
> A on top of commit B is done by a simplified 3-way merge between A and B
> using the parent of A as the common ancestor.
> 
>      A                          A'
>     /                          /
>    A^... pseudo history ...---B

Well, my history is exactly that, not pseudo (and I dont quite follow your reasoning yet to understand whether this is important or not):

   A   B
    \ /
     A^
A^ *is* a common ancestor of both A and B.
> 
> When your history has renamed Makefile to Makefile2 (thereby losing
> Makefile)

My history did not rename Makefile. There were three identical Makefiles (in A^) After that one was deleted (in B). On alternative branch it was edited (in A).

If I do *merge* A into B then it fails. If I do *cherry-pick* A into B then it fails. If I do *rebase* A onto B then it succeeds.

Show 10 quoted lines
> while transition from A^ to A modified Makefile, the difference
> between A^ to A that is applied to B to produce A' contains only the
> change about Makefile (and does not talk about the unchangedness of
> Makefile1 nor Makefile2 --- in fact, when A' is created, the machinery
> does not even know if A^ and A had Makefile1 or Makefile2).
> 
> When applying the change to Makefile, it notices that B does not have
> Makefile, but there is a path that is _identical_ to the preimage your
> change applies to (namely, Makefile2).  To support people who rename
> Makefile to Makefile2 in the history that led to B

There was no rename. There was a copy in initial commit (and you cant say if it was Makefile copied into Makefile2 or vice verse). I dont believe it should really be called "rename", even if one of the copies was killed later.

>, rebase (actually the
> underlying "am -3" it calls is where this rename detection smart lies)
> applies the changes to the "renamed" path.

In this given case both Makefile1 and Makefile2 were absolutely equal. If rebase chose to edit Makefile2 why didnt it change Makefile1?

> 
> You might be able to work this around by forcing rebase not to use the
> simplified 3-way merge, by saying "rebase -m".

Yeah, it worked. ... CONFLICT (delete/modify): Makefile deleted in master and modified in HEAD~0. Version HEAD~0 of Makefile left in tree. ...

Though it does make me wonder why *simplified* 3-way merge is smarter than git merge ;)))
best regards,
  Fedor..
Previous: Avery PennarunNext: Junio C Hamano
Message 4 of 7 in “overly smart rebase - bug or feature?”
  1. Fedor SergeevNov 10, 2008
  2. Junio C HamanoNov 10, 2008
  3. Avery PennarunNov 10, 2008
  4. Fedor SergeevNov 10, 2008
  5. Junio C HamanoNov 10, 2008
  6. Fedor SergeevNov 12, 2008
  7. Junio C HamanoNov 12, 2008

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.