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

Re: git rebase --preserve-merges seems to not work

From
Björn Steinbrink <b.steinbrink@gmx.de>
Date
Sep 9, 2010, 05:51 UTC
Message-ID
<20100909055104.GA21004@atjola.homenet>
In-Reply-To
<4C886DF3.8050903@workspacewhiz.com>
On 2010.09.08 23:17:39 -0600, Joshua Jensen wrote:
Show 20 quoted lines
> # Commit 'd' is something I would pull --rebase from the server
> before I push.
> $ git lg --all
> *   472fd93 - (HEAD, bc-merge) Merge commit 'c' into HEAD (3 seconds ago)
> |\
> | * d132c87 - (c) c (2 minutes ago)
> | * 4a88fd1 - b (2 minutes ago)
> |/
> | * 6abf527 - (d) d (2 minutes ago)
> |/
> * b576660 - (a, master) a (3 minutes ago)
> 
> 
> # Here is the rebase with the --preserve-merges option.
> $ git rebase --preserve-merges d
> Rebasing (n/3)
> Successfully rebased and updated detached HEAD.
> 
> # Of course, bc-merge is an orphaned branch.  Its changes got
> replayed on top of 'd'.
Yup, and the "problem" is, that both sides of the merge got replayed.
> # Note the merge commit with the description "Merge commit 'c' into
> HEAD" is missing.

Because the merge could be resolved as a fast-forward, as it merges the replayed commits b' and c', not the originals.

Show 11 quoted lines
> $ git lg --all
> * 2c93a8a - (HEAD) c (11 seconds ago)
> * 2b98bc6 - b (11 seconds ago)
> * 6abf527 - (d) d (3 minutes ago)
> | *   472fd93 - (bc-merge) Merge commit 'c' into HEAD (74 seconds ago)
> | |\
> |/ /
> | * d132c87 - (c) c (3 minutes ago)
> | * 4a88fd1 - b (3 minutes ago)
> |/
> * b576660 - (a, master) a (4 minutes ago)

What you actually wanted to replay is just the first-parent history, redoing the merges with their respective original second parent. Jonathan (Cc'ed) had the same problem about a month ago.

The "first parent" thing isn't that well defined, criss-cross merges combined with some unfortunate fast-forwards will easily make the first-parent history become the one that you didn't mean (ask any git-svn users that dared to use "git merge" without fully understanding how git-svn uses the history ;-)), but it works in this special case. And with that special case in mind (and admittedly probably not thinking much further) I came up with this patch a few years ago:

http://marc.info/?l=git&m=119379735525213&w=2

It was not my itch to scratch though, so I never got around to get it included, and of course it doesn't apply cleanly anymore. I tried to give some hints to Jonathan ("hachi") on #git on how to update the patch to make it apply again:

http://colabti.de/irclogger/irclogger_log/git?date=2010-08-20#l1241
Feel free to pick up from there...
Björn
Previous: Joshua JensenNext: Joshua Jensen
Message 2 of 3 in “git rebase --preserve-merges seems to not work”
  1. Joshua JensenSep 9, 2010
  2. Björn SteinbrinkSep 9, 2010
  3. Joshua JensenSep 9, 2010

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.