I use Git everyday. I can't imagine using anything else. But I have a
soft spot for Hg. For all the awesome power of Git it feels messy &
complicated. Hg just feels like a cleaner model, a simpler transition,
it's easier to explain and seems like it should just work. But for all
that I find it gets in my way a lot more than Git. What's going on?
I initially started my dvcs journey using Hg. I was predisposed to Hg
from reading Hg Init, which was the first time I
really got dvcs. With Hg I found all the usual benefits of associated
with a dcvs. The freedom of local commits, branching and local history.
But for various reasons I gave Git a try, once I got my head around the
way the different commands worked I really enjoyed Git. These days find
I hard to use anything else.
But I can't put my finger on what is wrong with Hg. Perhaps it's just
like wishing for the simpler times that never really were. Hg's
insistence on immutable commits feels a bit purist and academic at
times. After all, the first thing you need to do to use Hg as a
super-client is to enable the rebase
extension. In fact
it seems that Hg is moving closer to Git all the time. Most of the git
features for history editing are available as one mercurial extension or
another.
Cherry-picking,
interactive
rebase and
amending commits
all have equivalents.
Hg might dislike History Editing, but I suspect that these features are
necessary to get the most out of your dvcs. Hg's approach of locking
these off in extension has some benefit. You can understand the core
functionality and then understand these more advanced features as
manipulations of the DAG you already understand.
So I keep asking myself why it is that I find Hg so much more painful to
use. I think it's actually just the relative maturity. I was going to
write that Git has been around longer so had time to mature, but both Hg
and Git had their initial release in April 2005, so that's not it. Of
course it's not actually Hg that I find problematic it's the extensions
I rely on day to day. Things like Subversion integration, rebasing,
transplanting and history editing.
I think the real cause is that these extensions don't have the same
focus and buy in from the community as in Git. I almost get the
impression that they're looked down on.
Histedit is
perhaps the best example of this. It's a stunningly useful extension,
basically giving us interactive rebase. Yet if you look at the Hg
documentation of Editing
History it's only
mentioned as an after thought. The history editing solution distributed
with Hg is MQ. MQ can
do everything that Histedit can do, but it;s just so hard. The only
reason I can see for making MQ the default and not bundling Histedit is
to make history editing as hard as possible because it's philosophically
distasteful.
This dislike of history editing does have real effects. For
example Tortoise Hg has built in GUI
support for MQ patch queues, but Histedit is relegated to the command
line. I would think GUI histedit would be a real killer feature for a
dvcs UI. I also find these extension just lack a little bit of polish
compared to the Git alternatives. Rebase basically works like rebase but
Git rebase is smother. Git rebase will identify that the commits are the
same and just drop them, where as Hg rebase considers this a conflict.
There is no technical reason that the Hg extensions couldn't be as
polished as their Git equivalents, but it hasn't happened. I believe
this is because they are perceived as philosophically wrong by the Hg
community as illustrated by the fact that they're not distributed with
mercurial. I think this is a real shame, because I do like Hg, but it
feels just a little to academically pure for the real world. Git is
ugly, but it works with the ugly realities of the world.
There are comments.