Hi, On Wed, 7 Feb 2018, Sergey Organov wrote: > Johannes Schindelin <johannes.schindelin@xxxxxx> writes: > > [...] > > > +--recreate-merges:: > > + Recreate merge commits instead of flattening the history by replaying > > + merges. Merge conflict resolutions or manual amendments to merge > > + commits are not preserved. > > I wonder why you guys still hold on replaying "merge-the-operation" > instead of replaying "merge-the-result"? This misses the point of rebasing: you want to replay the changes. > The latter, the merge commit itself, no matter how exactly it was > created in the first place, is the most valuable thing git keeps about > the merge, and you silently drop it entirely! You miss another very crucial point. I don't blame you, as you certainly have not used the Git garden shears for years. Let me explain the scenario which comes up plenty of times in my work with Git for Windows. We have a thicket of some 70 branches on top of git.git's latest release. These branches often include fixup! and squash! commits and even more complicated constructs that rebase cannot handle at all at the moment, such as reorder-before! and reorder-after! (for commits that really need to go into a different branch). Even if you do not have such a complicated setup, it is quite possible that you need to include a commit in your development that needs to be dropped before contributing your work. Think e.g. removing the `-O2` flag when compiling with GCC because GDB gets utterly confused with executables compiled with `-O2` while single-stepping. This could be an initial commit called `TO-DROP` or some such. And guess what happens if you drop that `pick` line in your todo list and then the `merge` command simply tries to re-create the original merge commit's changes? Exactly. The merge will become an evil merge, and will introduce that very much not-wanted and therefore-dropped changes. > OTOH, git keeps almost no information about "merge-the-operation", so > it's virtually impossible to reliably replay the operation > automatically, and yet you try to. That is true. However, the intended use case is not to allow you to recreate funny merges. Its use case is to allow you to recreate merges. At a later stage, I might introduce support to detect `-s ours` merges, because they are easy to detect. But even then, it will be an opt-in. > IMHO that was severe mistake in the original --preserve-merges, and you > bring with you to this new --recreate-merges... It's sad. Please refrain from drawing this discussion into an emotional direction. That is definitely not helpful. > Even more sad as solution is already known for years: > > bc00341838a8faddcd101da9e746902994eef38a > Author: Johannes Sixt <j6t@xxxxxxxx> > Date: Sun Jun 16 15:50:42 2013 +0200 > > rebase -p --first-parent: redo merge by cherry-picking first-parent change > > and it works like a charm. It might work for you, as you probably used --preserve-merges, and dealt with the fact that you could neither drop nor reorder commits. So --preserve-merges --first-parent is probably what you were looking for. Instead, --recreate-merges is all about allowing the same level of freedom as with regular interactive rebases, but recreating the original commit topology (and allowing to change it, too). Therefore, I think that it would be even harmful to allow --recreate-merges --first-parent *because it would cause evil merges*! And I totally could see myself being vexed again about options that worked perfectly well (just like --preserve-merges) being completely messed up by allowing it to be combined with options *that they cannot work with* (just like --preserve-merges --interactive, a *huge* mistake causing so many annoying "bug" reports: I *never intended it that way because I knew it would not work as users expect*). So no, I do not think that --recreate-merges --first-parent is a good idea at all. Unless you try to do that non-interactively only, *and disallow it in interactive mode*. Because the entire point of the interactive rebase is to allow reordering and dropping commits, in --recreate-merges even moving, introducing and dropping merge commits. The --first-parent option flies in the face of this idea. Ciao, Johannes