[Top][All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: preferring mercurial

From: Martin Geisler
Subject: Re: preferring mercurial
Date: Wed, 15 Jan 2014 17:07:11 +0000 (UTC)
User-agent: Loom/3.14 (http://gmane.org/)

Stephen J. Turnbull <stephen <at> xemacs.org> writes:

> François Orieux writes:
>  > My resume of all the posts I have read is that git and hg are
>  > technically equivalent.
> AFAICS they are very much *not* technically equivalent.  They may be
> equal in power, especially at the UI level, but git exposes a much
> cleaner interface to the internal model of blobs (file content), trees
> (file directories), and commits *to the user*.

Whether that is a good idea or not is debatable :)
> This means that git is more hackable: you can script it with shell,

Did you know that the official API for Mercurial is it's command line
interface? That means that scripting it with a shell script is not just
possible but even recommended. There are libraries for a number of languages
that gives you a higher level API:


There are a number of "debug" commands that you can use to expose the
internal structure of the changelog, the manifests, and the filelogs (like
Git, Mercurial also stores the data in a 3-level structure.)

> you can script it with Python, you can script it with Emacs Lisp, or
> you can write C.  Bzr definitely loses big here: the internals are
> layer upon layer upon layer of complex Python API.  I don't know about
> Mercurial, haven't looked at its internals.  Git invites you to play
> with the DAG, just as Lisp invites you to play with lists.
> Is this *better*?  That's a matter of taste.  But different?  Definitely.
>  > Hg is cleaner, easier with better doc and ui
> I disagree, but again it's a matter of taste.
>  > with a bigger respect of history.
> That is a lie, and you should stop repeating it, and tell people who
> try to tell it to you to stop, too.
> Nothing has more respect for history than git.  Using git, you can
> forget history (by deleting or moving refs) but you can't change it or
> delete it.[1]  That's why git doesn't have backups (the way hg and bzr
> save bundles if you do a "commit --amend" or a "strip") for the
> operations that fans of other VCS call "history-changing" -- it
> doesn't need them.  History isn't *changed*, it is recreated -- and
> the original history remains accessible to the user.  AFAIK hg and bzr
> *do* destroy history when they perform operations like commit --amend,
> strip, and rebase.  For sure, git *does not*.

(Mercurial developer here.) I can assure you that Mercurial works the same
way: when you amend or rebase, you *recreate* history. It *must* work like
this since Mercurial (just like Git) uses recursive SHA-1 hashing to
determine the ID for each commit.

The old history is not destroyed, but it is currently moved out of the
repository proper -- it is moved into the bundles you mention above. That
makes it possible to restore it with 'hg pull .hg/strip-backup/your-bundle'

I agree that this is not as nice as merely hiding the old history like Git
does. It's also not as efficient since we have to move data around when
creating the bundle. This is why we're working hard on making Mercurial
*hide* the old history instead of moving it into bundles. The code is
currently in an extension that you can enable:


I've been using it for a year now and this means that all my rebased and
amended commits are still present in the repository and 'hg log --hidden'
will show them.

> It's true that you can alter the presentation of history in git
> relatively easily compared to other VCSes.  But it's possible in them,
> too, and (AFAIK) in them it does destroy original history in the
> process of remaking it.

Not 100% accurate for Mercurial today and it will be plain wrong in the future.

Martin Geisler

reply via email to

[Prev in Thread] Current Thread [Next in Thread]