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

Re: [BUG] rebase -p loses commits

From
Junio C Hamano <gitster@pobox.com>
Date
May 17, 2011, 00:54 UTC
Message-ID
<7vpqnii1sx.fsf@alter.siamese.dyndns.org>
In-Reply-To
<4DD1C277.9070605@sohovfx.com>
Andrew Wong <andrew.w@sohovfx.com> writes:
Show 16 quoted lines
> On 05/16/2011 04:36 PM, Junio C Hamano wrote:
>>     F---*  feature
>>    /   /
>>   B---M    master
>>
>> But what does it mean to rebase that on top of master, preserving merges
>> in the first place? You are already on top of 'master' and '*' itself
>> should be what you should get, no?  IOW, shouldn't you already be
>> up-to-date?
>>    
> Since preserve-merge uses the interactive-rebase, I think
> interactive-rebase should still pick the merge commit, which will then
> be consistent with what's happening if we rebase onto "F". So, without
> knowing whether "F" or "M" is the first-parent, I think
> interactive-rebase onto "F" and onto "M" should have the same
> effect. i.e. interactive-rebase picks the merge commit

I agree that changing the behaviour based on the "first-ness" of the parent is a wrong thing to do in general. But even then, I have a more fundamental question.

What does rebasing that '*' on top of M really mean?
Does it mean this?
    F---*                 F'--*'
   /   /   --->          /   /
  B---M             B---M---/
In other words:
	Take all the commits reachable from '*', exclude the ones that are
	ancestors of M, and make sure that commit that corresponds to each
	of the remaining commits (in this case, F' and *' correspond to F
	and * respectively) are decendants of M, and reconstruct the graph
	preserving the parenthood relationship between corresponding
	commits.

I would understand why some project may want to require you to rebase to the tip to keep a linear history, and the above sentence would be the right specification for linearizing rebase except for the "and reconstruct the graph" part.

But the above "preserving" rewrite does not even preserve the topology of the graph (the original * is a true merge between two forks, but *' is not) to begin with. Also, if you want to _usefully_ place F' on top of M, such a rewrite should resolve possible conflicts that was resolved at * in the original graph at F' anyway, which would mean that the resulting *' should become a totally empty commit.

Why would anybody want to do such a thing to begin with?
Previous: Andrew WongNext: Junio C Hamano
Message 5 of 28 in “[BUG] rebase -p loses commits”
  1. Jeff KingMay 16, 2011
  2. Andrew WongMay 16, 2011
  3. Junio C HamanoMay 16, 2011
  4. Andrew WongMay 17, 2011
  5. Junio C HamanoMay 17, 2011
  6. Junio C HamanoMay 17, 2011
  7. Jeff KingMay 17, 2011
  8. Andrew WongMay 17, 2011
  9. Jeff KingMay 17, 2011
  10. [RFC] Interactive-rebase doesn't pick all children of "upstream"Andrew Wong, May 21, 2011
  11. [RFC] Interactive-rebase doesn't pick all children of "upstream"Andrew Wong, May 21, 2011
  12. Andrew WongMay 21, 2011
  13. Interactive-rebase doesn't pick all children of "upstream"Andrew Wong, Jun 5, 2011
  14. Johannes SixtJun 5, 2011
  15. Andrew WongJun 5, 2011
  16. rebase -i -p: doesn't pick certain merge commits that are children of "upstream"Andrew Wong, Jun 7, 2011
  17. rebase -i -p: doesn't pick certain merge commits that are children of "upstream"Andrew Wong, Jun 7, 2011
  18. Andrew WongJun 12, 2011
  19. Junio C HamanoJun 13, 2011
  20. Andrew WongJun 13, 2011
  21. Stephen HabermanJun 16, 2011
  22. Andrew WongJun 18, 2011
  23. Stephen HabermanJun 18, 2011
  24. Andrew WongJun 18, 2011
  25. Stephen HabermanJun 18, 2011
  26. rebase -i -p: include non-first-parent commits in todo listAndrew Wong, Jun 18, 2011
  27. Andrew WongJun 18, 2011
  28. Jeff KingMay 17, 2011

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.