1. Benoît Allard
  2. mutable-history


mutable-history / docs / from-mq.rst

From MQ To Evolve, The Refugee Book

Cheat sheet

mq command new equivalent
qseries log
qnew commit
qrefresh amend
qpop update or qdown
qpush update or gup sometimes stabilize
qrm kill
qfold amend -c (for now, collapse soon)
qdiff odiff
qfinish --
qimport --

Replacement details

hg qseries

All your work in progress is now in real changeset all the time.

You can use the standard log to display them. You can use the phase revset to display unfinished business only and templates to have the same kind of compact output qseries has.

This will result in something like that:

wip = log -r 'not public()' --template='{rev}:{node|short} {desc|firstline}\n'

hg qnew

With evolve you handle standard changesets without an additional overlay.

Standard changeset are created using hg commit as usual.:

$ hg commit

If you want to keep the "wip are not pushed" behavior, you are looking for setting your changeset in the secret phase using the phase command.

Note that you only need it for the first commit you want to be secret. Later commits will inherit their parents phase.

If you always want your new commit to be in the secret phase, your should consider updating your configuration:

[phases] new-commit=secret

hg qref

A new command from evolution will allow you to rewrite the changeset you are currently on. just call:

$ hg amend

This command takes the same options as commit, plus the switch '-e' (--edit) to edit the commit message in an editor.

Amend have also a -c switch which allow you to make an explicit amending commit before rewriting a changeset.:

$ hg record -m 'feature A'
# oups, I forget some stuff
$ hg record babar.py
$ hg amend -c .^ # .^ refer to "working directoy parent, here 'feature A'

note: refresh is an alias for amend

hg qpop

the following command emule the behavior of hg qpop:

$ hg gdown

If you need to go back to an arbitrary commit you can just us:

$ hg update


gdown and update allow movement with working directory changes applied and gracefully merge them.

hg qpush

When you rewrite changesets, descendants of rewritten changesets are marked as "out of sync". You need to rewrite them on top of the new version of their ancestor.

The evolution extension adds a command to rewrite the "out of sync" changesets::

$ hg stabilize

You can also decide to do it manually using:

$ hg graft -O <old-version>


$ hg rebase -r <revset for old version> -d .

note: using graft allow you to pick the changeset you want next as the --move option of qpush do.

hg qrm

evolution introduce a new command to mark a changeset as "not wanted anymore".:

$ hg kill <revset>

hg qfold

$ hg up <top changeset>
$ amend --edit -c <bottom changeset>

or later:

$ hg collapse # XXX not implemented
$ hg rebase --collapse # XXX not tested

hg qdiff

odiff is an alias for hg diff -r .^ it works as qdiff, but outside mq.

hg qfinish and hg qimport

Is not necessary anymore. If you want to control exchange and mutability of changesets, see the phase feature

hg qcommit

If you really need to send patches through versioned mq patches, you should look at the qsync extension.