From: Jakub Narebski <jnareb@gmail.com>
To: "Arne Babenhauserheide" <arne_bab@web.de>
Cc: mercurial@selenic.com, SLONIK.AZ@gmail.com, git@vger.kernel.org
Subject: Re: [VOTE] git versus mercurial (for DragonflyBSD)
Date: Mon, 27 Oct 2008 02:52:22 +0100 [thread overview]
Message-ID: <200810270252.23392.jnareb@gmail.com> (raw)
In-Reply-To: <200810270147.52490.arne_bab@web.de>
On Mon, 27 Oct 2008, Arne Babenhauserheide wrote:
> Am Sonntag 26 Oktober 2008 19:55:09 schrieb Jakub Narebski:
> >
> > I agree, and I think it is at least partially because of Git having
> > cleaner design, even if you have to understand more terms at first.
>
> What do you mean by "cleaner design"?
Clean _underlying_ design. Git has very nice underlying model of graph
(DAG) of commits (revisions), and branches and tags as pointers to this
graph.
> From what I see (and in my definition of "design"), Mercurial is designed as
> VCS with very clear and clean design, which even keeps things like streaming
> disk access in mind.
I have read description of Mercurial's repository format, and it is not
very clear in my opinion. File changesets, bound using manifest, bound
using changerev / changelog.
Mercurial relies on transactions and O_TRUNC support, while Git relies
on atomic write and on updating data then updating reference to data.
I don't quite understand comment about streaming disk access...
> Also, looking at git, git users still have to garbage collect regularly, which
> shows to me that the design wasn't really cleaner.
Well, they have to a lot less than they used to, and there is
"git gc --auto" that can be put in crontab safely.
Explicit garbage collection was a design _decision_, not a sign of not
clear design. We can argue if it was good or bad decision, but one
should consider the following issues:
* Rolling back last commit to correct it, or equivalently amending
last commit (for example because we forgot some last minute change,
or forgot to signoff a commit), or backing out of changes to the
last commit in Mercurial relies on transactions (and locking) and
correct O_TRUNC, while in Git it leaves dangling objects to be
garbage collected later.
* Mercurial relies on transaction support. Git relies on atomic write
support and on the fact that objects are immutable; those that are
not needed are garbage collected later. Beside IIRC some of ways of
implementing transaction in databases leads to garbage collecting.
* Explicit packing and having two repository "formats": loose and
packed is a bit of historical reason: at the beginning there was
only loose format. Pack format was IIRC invented for network
transport, and was used for on disk storage (the same format!) for
better I/O patterns[1]. Having packs as 'rewrite to pack' instead
of 'append to pack' allows to prefer recency order, which result in
faster access as objects from newer commits are earlier in delta
chain and reduction in size in usual case of size growing with time
as recency order allows to use delete deltas. Also _choosing_ base
object allows further reduce size, especially in presence of
nonlinear history.
* From what I understand Mercurial by default uses packed format for
branches and tags; Git uses "loose" format for recent branches
(meaning one file per branch), while packing older references.
Using loose affects performance (and size) only for insane number of
references, and only for some operations like listing all references,
while using packed format is IMHO a bit error prone when updating.
* Git has reflogs which are pruned (expired) during garbage collecting
to not grow them without bounds; AFAIK Mercurial doesn't have
equivalent of this feature.
(Reflogs store _local_ history of branch tip, noting commits,
fetches, merges, rewinding branch, switching branches, etc._
[1] You wrote about "streaming disk access". Git relies (for reading)
on good mmap implementation.
> As an example: If I want some revision in hg, my repository just reads the
> files in the store, jumps to the latest snapshots, adds the changes after
> these and has the data.
If you want to show some revision in Git, meaning commit message and
diff in patch format (result of "git show"), Git just reads the commit,
outputs commit message, reads parent, reads trees and performs diff.
If you want to checkout to specific revision, Git just reads commit,
reads tree, and writes this tree (via index) to working area.
> In git is has to check all changesets which affect the file.
I don't understand you here... if I understand correctly above,
then you are wrong about Git.
> If you read the hgbook, you'll find one especially nice comment:
>
> "Unlike many revision control systems, the concepts upon which Mercurial is
> built are simple enough that it’s easy to understand how the software really
> works. Knowing this certainly isn’t necessary, but I find it useful to have a
> “mental model” of what’s going on."
> - http://hgbook.red-bean.com/hgbookch4.html
>
> I really like that, and in my opinion it is a great compliment to hg, for two
> reasons:
>
> 1) Hg is easy to understand
Because it is simple... and less feature rich, c.f. multiple local
branches in single repository.
> 2) You don't have to understand it to use it
You don't have to understand details of Git design (pack format, index,
stages, refs,...) to use it either.
>
> And both are indications of a good design, the first of the core, the second
> of the UI.
Well, Git is built around concept of DAG of commits and branches as
references to it. Without it you can use Git, but it is hard. But
if you understand it, you can understand easily most advanced Git
features.
I agree that Mercurial UI is better; as usually in "Worse is Better"
case... :-)
--
Jakub Narebski
Poland
next prev parent reply other threads:[~2008-10-27 1:53 UTC|newest]
Thread overview: 65+ messages / expand[flat|nested] mbox.gz Atom feed top
2008-10-26 4:28 [VOTE] git versus mercurial walt
2008-10-26 14:15 ` [VOTE] git versus mercurial (for DragonflyBSD) Jakub Narebski
2008-10-26 14:30 ` Maxim Vuets
2008-10-26 15:05 ` Leo Razoumov
2008-10-26 18:55 ` Jakub Narebski
2008-10-27 0:20 ` Arne Babenhauserheide
2008-10-27 4:15 ` Leo Razoumov
2008-10-27 7:16 ` Arne Babenhauserheide
2008-10-27 7:16 ` dhruva
2008-10-27 0:47 ` Arne Babenhauserheide
2008-10-27 1:52 ` Jakub Narebski [this message]
2008-10-27 7:50 ` Arne Babenhauserheide
2008-10-27 9:41 ` Jakub Narebski
2008-10-27 10:12 ` Leslie P. Polzer
2008-10-27 10:14 ` Arne Babenhauserheide
2008-10-27 12:48 ` Jakub Narebski
[not found] ` <200810271512.26352.arne_bab@web.de>
2008-10-27 18:01 ` Jakub Narebski
2008-10-27 20:48 ` Arne Babenhauserheide
2008-10-27 21:07 ` Miklos Vajna
2008-10-27 21:30 ` Arne Babenhauserheide
2008-10-28 0:13 ` Miklos Vajna
2008-10-28 17:48 ` Andreas Ericsson
2008-10-28 19:11 ` Arne Babenhauserheide
2008-10-28 19:38 ` SZEDER Gábor
2008-11-06 16:25 ` Marcin Kasperski
2008-11-06 17:41 ` Isaac Jurado
2008-10-28 19:16 ` Randal L. Schwartz
2008-10-27 23:25 ` Jakub Narebski
2008-10-27 9:29 ` Benoit Boissinot
2008-10-27 10:57 ` Jakub Narebski
2008-10-27 14:29 ` 0000 vk
2008-10-27 14:57 ` Jakub Narebski
[not found] ` <1225100597.31813.11.camel@abelardo.lan>
2008-10-27 11:42 ` David Soria Parra
2008-10-27 20:07 ` Brandon Casey
2008-10-27 20:37 ` Jakub Narebski
2008-10-28 1:28 ` Nicolas Pitre
2008-10-26 15:57 ` Felipe Contreras
2008-10-26 19:07 ` Jakub Narebski
2008-10-26 19:54 ` Felipe Contreras
2008-10-28 12:31 ` [VOTE] git versus mercurial walt
2008-10-28 14:28 ` Johannes Schindelin
2008-10-28 14:41 ` Git/Mercurial interoperability (and what about bzr?) (was: Re: [VOTE] git versus mercurial) Peter Krefting
2008-10-28 14:59 ` Johannes Schindelin
2008-10-28 15:02 ` Git/Mercurial interoperability (and what about bzr?) Matthieu Moy
2008-10-28 15:03 ` Git/Mercurial interoperability (and what about bzr?) (was: Re: [VOTE] git versus mercurial) Nicolas Pitre
2008-10-28 15:33 ` Pieter de Bie
2008-10-28 19:12 ` Miklos Vajna
2008-10-28 21:10 ` Miklos Vajna
2008-10-28 21:31 ` Theodore Tso
2008-10-28 23:28 ` Miklos Vajna
2008-11-01 8:06 ` Git/Mercurial interoperability (and what about bzr?) Florian Weimer
2008-11-01 10:03 ` Santi Béjar
2008-11-01 10:33 ` Jakub Narebski
2008-11-01 10:44 ` Florian Weimer
2008-11-01 11:10 ` Florian Weimer
2008-11-01 12:26 ` Jakub Narebski
2008-11-01 13:39 ` Theodore Tso
2008-11-01 17:51 ` Linus Torvalds
2008-11-02 1:13 ` Theodore Tso
2008-11-01 10:16 ` Git/Mercurial interoperability (and what about bzr?) (was: Re: [VOTE] git versus mercurial) Peter Krefting
2008-10-29 19:11 ` [VOTE] git versus mercurial Shawn O. Pearce
2008-10-29 19:36 ` Boyd Lynn Gerber
2008-10-29 19:48 ` Johannes Schindelin
2008-10-29 19:51 ` Boyd Lynn Gerber
2008-10-29 8:15 ` Miles Bader
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200810270252.23392.jnareb@gmail.com \
--to=jnareb@gmail.com \
--cc=SLONIK.AZ@gmail.com \
--cc=arne_bab@web.de \
--cc=git@vger.kernel.org \
--cc=mercurial@selenic.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).