selectively applying changesets

Matt Mackall mpm at selenic.com
Sun Sep 25 18:43:35 CDT 2005


On Sun, Sep 25, 2005 at 02:08:55PM -0700, Eric M. Hopper wrote:
> On Sun, 2005-09-25 at 22:50 +0200, Stefan van der Walt wrote:
> > Say two users, A and B, are working on a project.  B clones the latest
> > stable release and adds two features (as changesets 1 through 10 and
> > 20 through 30, separately) into his public repository.  User A then
> > decides to merge back only the first feature, changesets 1 through 10,
> > into his repository.
> > 
> > In pseudo-hg, A wants to do something like:
> > 
> > $ hg pull -r 1:10 B
> > $ hg update -m
> > 
> > Is an export/import the appropriate way to do this?
> 
> Currently, export/import is the only way to do this, but it isn't a very
> good way.  Mostly because the changesets will not be properly identified
> with the same unique hashes on the import side as they are on the export
> side.
> 
> This means if you ever do an actual 'pull' from a remote repository, you
> will get all the same changes again, but they will be considered to be
> different changesets that happen on a branch.
> 
> There are ways to sort of simulate the behavior you want by pulling
> _all_ the changes, then updating to a particular changset and branching
> off from there.  But it isn't really quite the same.  Also, if a lot of
> people do this eventually there'll end up being this vast sea of
> orphaned changsets that keep moving from repository to repository but
> are basically dead as far as new development based on them is concerned.
> 
> I've been thinking of good ways to deal with this problem, as my own
> development style would tend to create a lot of these orphaned branches
> that should probably never be seen outside my repositories.

To handle this problem we need:

- a way to remember which changesets we didn't want, and why, and
  when, and by who
- a way to deal with the inter-changeset dependencies
- a way to record that information in a form that works naturally with
  history, merge, annotate, etc.
- a way to propagate this information to other users

Which is I why the solution I've personally been using is[1]:

  hg export <unwanted changeset> | patch -p1 -R
  hg ci -m <explanation>

- it stores the reversal along with a description and all the other
  appropriate information
- it handles changeset ordering problem in about the only practical
  way, namely letting the user manage it directly
- it does the right thing on future merges
- it doesn't hide or distort the history in any way
- it doesn't require inventing any new mechanisms
- and it obviously already exists and works

While some form of automation might improve on things a bit, I doubt
there's an approach which is conceptually cleaner.

[1] as a special case for when all the unwanted bits are contiguous on
the tip:

  hg revert <last good changeset>
  hg ci -m "Well THAT wasn't such a good idea"

-- 
Mathematics is the supreme nostalgia of our time.


More information about the Mercurial mailing list