Chris Gorman
Chris Gorman

Reputation: 51

Why can't I rebase on to an ancestor of source changesets if on a different branch?

I would like to know why the following pattern is not possible.

Having created a local feature branch (minor_feature - not intended to be shared with the world) I would like to rebase the work on it on to the tip of a well known branch (stable). However I have discovered that rebase finds nothing to be rebased in the case where stable has not progressed since branching away from it.

I appreciate that this breaks the rule that the destination of rebase can not be an ancestor of the source but can't work out why this should be prohibited in the simple case shown. I also understand that, branches aside, the topology would not actually change during the rebase. But given that the branch names are indeed significant to the topology, it only seems to be a special case in that stable has no further revisions commited to it. With a single extra revision on the tip of stable (say pulled in from elsewhere) I can of course perform the rebase

o  branch:minor_feature
|  rev:4
|  changeset:746d8191aa5d
|
o  branch:minor_feature
|  rev:3
|  changeset:520f565ba7f2
|
@  branch:stable
|  rev:2
|  changeset:64e7c753c090
|
o  branch:stable
|  rev:1
|  changeset:3dc55a5c9971
|
o  branch:stable
   rev:0
   changeset:fbf1f426945c

$hg rebase -b minor_feature
nothing to rebase

-- Thanks Chris Gorman

Upvotes: 3

Views: 2403

Answers (2)

Mikezx6r
Mikezx6r

Reputation: 16905

Rebase is strictly for changing ancestry of changesets. As you've observed, you're not changing ancestry here. Branches aren't included in the ancestry computation.

I'm not 100% sure what you're trying to accomplish. If it's to effectively remove the branch, then as long as you haven't pushed, you can likely use the MQ extension. Import the changesets, pop all. Ensure you're updated to the stable branch (which it should be by default), and push them all back on.

They should now all be on the stable branch.

Upvotes: 2

tghw
tghw

Reputation: 25313

You can do this with the convert extension. You would use a branchmap to rebase minor_feature to default. That file (we'll call it alldefault) would look something like this:

minor_branch default

Then the command would just be:

$ hg convert --branchmap alldefault oldrepo newrepo

When it finishes, newrepo will have the named branch "rebased" on top of the default branch.

Upvotes: 0

Related Questions