Git is admired because Linus Torvalds wrote it, but Mercurial is better because he didn't.
Developers with refined sensibilities are in a tough spot right now. We'd clearly like something to take the place of centralized tools like Subversion. But why, oh why, does it have to be Git? Let's examine the hype and the reality:
"The user interface is... not too bad"
False. I've heard dozens of authors whining about Git's usability. I thought maybe they were overstating the case, or were just confused. Then I tried Git. If anything, they were being too kind. Git polluted my /usr/bin with nearly 150 distinct binaries. Mercurial has one.
And if you think that you only need one or two of those commands for daily use, you're an optimist. Check out the "easy use" guide from, by the way, an awesome Ruby project. You're expected to juggle, depending on how you count them, about ten commands, just for day-to-day work.
Thegit rebasecommand will save your changes away, update the topic branch, and then reapply them.... Warning! If you are sharing a branch, you must use:git merge master... Rebase causes the commit layout to change and will confuse anyone you've shared this branch with.
Huh? Blah blah blah Ginger blah blah. For day-to-day use of Mercurial, you only need
hg fetch to get code, and hg commit to give code.Git apologists will tell you that you need all these extra commands because Git was written with the "UNIX philosophy" of small tools that do only one thing, and do it really well. Which brings us to our next myth.
"Git... consists of many commands that do one thing well"
O RLY? From Git's own gurus:
Git checkout can do three separate things:
- Change to a new head.
- Revert changes to a small number of files.
- Create a branch.
Those are pretty massively different tasks. So much for "doing one thing." I'll leave it as an exercise to the reader to debunk the "well" part. Hint: try using git for any non-trivial project.
Having lost the simplicity argument, Git-folk will try to tell you that the reason they dumped 150 pieces on your floor was so that you can build your own revision control software:
"It's not an SCM.... I bet you could make a reasonable SCM on top of it, though"
That was from Linus himself in the early days, though Git's recent admirers echo the same sentiment: "
git is first and foremost a toolkit for writing VCS systems."Who cares? I ordered a version control system, not a toolkit for building one! If I'd wanted building blocks for rolling my own, I'd have gone to Home Depot and bought a 1 and a 0. You can build any software you like out of those, including a source control tool.
Mercurial is a working DVCS right out of the box. Why not use it?
"The model is rock solid and infallible because it is simple."
Horseshit. I've even unwittingly repeated this stinker myself. Let's break it down a little. Quoth the explainers (alongside a rat's nest of UML, to boot):
The core Git filesystem can be explained as four types of objects: Blobs (files), Trees (directories), Commits and Tags.
Unfortunately, no, it can't. The core of Git may well be implemented as four kinds of things. But to get even the most basic tasks done, you need to know repositories, working trees, branches, remotes, masters, origins, index caches, and a bunch of other unexplained concepts.
The manual pages are no help, for the same reason that "look it up" is no help to someone with a spelling question. You have to know the name of the command before you can look it up. And the commands are so obliquely named that there's no way to reason upward from what you know about the alleged "four kinds of objects" to make an educated guess as to which of the 150 commands you're supposed to use.
"Git on Windows is only officially supported using Cygwin"
This is another way of saying, "Git is not supported on Windows."
I like Cygwin -- it's one of the few things that raises my (mandatory) Windows experience at work from "completely unbearable" to merely "excruciating." But forcing my teammates to download and wrestle with the Cygwin setup, much less learn Bash, makes Git a complete non-starter in the one place where it could do me some good.
Punting to Cygwin, in this day and age of awesome scripting languages (like the one Mercurial is based on) is basically shouting to the world, "I can't be bothered to do my job properly."
Actually, speaking of scripting, using Python is exactly why Mercurial can be so scriptable and extensible without dumping 150 inscrutable binaries into your /usr/bin.
"git is reliable"
I wanted to believe this. Really, really wanted to believe it. Unfortunately, Git fails at the most fundamental of source control tasks -- so much so that I'm going to have to take that up in a different post.
The short version is that Git encourages and even requires you to tamper with your project's source history, and that is a recipe for disaster, not reliability.
In summary: Git was created by a brilliant mind and is maintained by a posse of smart, motivated developers. But it's a stinker. Its power might justify the agonizing experience of using it, if there weren't any better alternatives. There are.
Code in good taste. Use Mercurial.
UPDATE 2008-2-6, 9 PM. In retrospect, a discussion on reliability should just be about data integrity: having a repository that's resistant to crashes and hardware failures and such. The concerns in the final section -- discovering how to get data reliably out -- are not a pronouncement on the resilience of the repository format. They have to deal with usability and coherence. "Reliability" as a fuzzy human term is too broad a word here.
36 comments:
Any reason why you don't write anything about mercurial in contrast to git?
Where does mercurial do things better, and *why*?
Does mercurial have anything like rebase? (Which personally i think is the number 1 greatest thing about git).
Mercurial's ``rebase'' is done either via mq or transplant. Transplant is probably closer to rebase as you know it.
@reuss: You're right -- a follow-up with more about Mercurial may be in order.
As to rebase, to me it's kind of a misfeature, at least the way it's pushed to the forefront of the workflow the way it is in Git. You can definitely do the kind of "pretend this temporary branch didn't happen" rewriting in Mercurial. It seems to be a bit... frowned upon, though.
Does Mercurial have cheap inline local branches yet? Because back when it didn't, that was one of the major selling points over mercurial.
I haven't timed inline branches vs. Git. (And at work, that'd be an unfair fight, what with Git saddled with the Cygwin baggage.) I suspect that on a level playing field, Git would still do inline branches faster. It's the main way you branch in Git, so that's what they've optimized for.
Mercurial supports inline branches, but as others have pointed out, they're kind of second-class citizens when compared to true clones (except the automatic "nameless branches" you get when you go back in time and then start committing).
I use and love git, yet you do not bring up a single one of the reasons I love git. Nothing I have ever used before is as fast, nothing I have ever used before makes branching and managing branches as easy, and nothing I have ever used has ever made merging as easy. One of the extremely nice extra features is that it has an integrated hash system whereby you can verify the integrity of everything in the system from the initial checkin to the current repository trivially and quickly.
Ah, but Lucas, all those are true of Mercurial as well. It's the fastest SCM on the platform I'm saddled with, it makes branching and merging an absolute joy, and it uses SHA-1 hashes to ensure that one check on one hash can verify all commits back to day one.
There's really no doubt that git's user interface has plenty of rough edges to cut yourself on.
But from my assessment, hg seems like git but several months back in features. You claim that git fails your definition "reliable" because it allows history rewriting, but this seems to be a non-sequitur. Git doesn't lose the patches or state, and they're tracked via reflogs.
So how exactly is it unreliable? I'm completely open to switching to mercurial if it's a better product, as I have no real attachment it for reasons other than the feature set and speed. If git might lose my data, then I'm out like a flash.
Here's why I currently prefer git:
- More natural branching in a single repository.
- The ability to rewrite multiple commits together.
- The repository can be packed whereas Mercurial collects lots of smaller files.
Mercurial encourages too many repositories floating around for all your branches. That's just not nice. Other than that it's one of the best SCMs out there. I just think Git is currently even better.
Unfortunately, while your situation may justify Hg as a better system, mine is the opposite. There isn't anything that I have found that allows seamless Hg/SVN interoperations. Git-svn is fully supported, and works excellent. As for some of your other things, I find rebase and stash to be the greatest tools in git.
Also, my definition of "history rewriting" is losing all trace of the old history. However, if you rewrite history in git, all commits based after that commit change to reflect the change. The SHA is based onthe current commit plus it's history. And whenever you do reset or anything similar, you are left with dangling commits, which are rough to get to, but they aren't lost.
However, if a git-svn equivalant for Hg came out. I would love to try it and compare.
@kirindave: The "rough edges" are the mechanism by which I saw data lost; i.e., having to muck with the history and losing data in a way that no status, log, update, merge, or other command would subsequently reveal. It wasn't a case of a low-level Git binary randomly trashing the repository; Git's SHA-1 hashes would detect that unlikely case readily.
@david: Well said. Myself, I don't mind the extra repositories. It feels like trading a little disk space for a faster, harder-to-screw up workflow.
@jim: You've hit on one of the things I don't like about Mercurial: subpar SVN support. The one-way tools can do a decent read-only copy of a SVN repo, but for push-pull you have to go with something like Tailor (which I haven't found very usable).
OTOH, the one SVN project where I commit most uses svn:externals, and my understanding is that git-svn doesn't handle those at all any more. There used to be a flag for it (curiously named --no-ignore-externals or such, instead of --use-externals), but it seems to have been removed without comment from recent Git versions.
And spending all day dealing with that kind of stuff is what makes me climb trees.
Git polluted my /usr/bin with nearly 150 distinct binaries. Mercurial has one.
This is vacuous: the fact that every git subcommand has its own binary is an implementation detail (and one that's gone away in the just-released 1.5.4). Yes, git has more commands than Mercurial, but that's because it has more capabilities. For example, hg has nothing like git-filter-branch, which is a powerful tool and a godsend when you need it. Check out its examples for the kinds of things it will let you do with a single command (an example: remove all commits from a given author from the history).
It's true that it can be overwhelming at first having so many subcommands, but that's what intro guides are for.
Those [three things that checkout can do] are pretty massively different tasks. So much for "doing one thing."
You picked a high-level (porcelain) command. Yes, the high-level commands are workflow-focused and will often do more than one small thing. That's the way Git is designed -- the high-level commands are layered on top of the low-level commands that only do one thing well.
The things "git checkout" does might seem unrelated at first, but it's another thing that makes sense (a lot of sense) once you get used to it. Git, unlike Mercurial, is designed to keep all branches in a single repository. "Checkout" essentially lets you change what branch you're working on. If you were in Mercurial and had a bunch of repositories side-by-side representing different branches, "checkout" in Git is like doing a "cd" to the Mercurial repository that contains the branch you want to work on. And as a convenience, it will let you create the branch in the same command if you want.
Mercurial is a working DVCS right out of the box.
As is Git -- the quotes that describe it only as building blocks are obsolete. Git is certainly competitive (and pretty clearly exceeds -- see git-filter-branch as an example) competing systems like Mercurial out-of-the-box.
Unfortunately, no, it can't. The core of Git may well be implemented as four kinds of things. But to get even the most basic tasks done, you need to know repositories, working trees, branches, remotes, masters, origins, index caches, and a bunch of other unexplained concepts.
I honestly regret that the existing explanations for all these things aren't better than they are, because these things really are simple when explained simply. Some of them have bad names (I think both "index" and "cache" are horrible names for that particular part of the system IMO). I hope that as Git usage moves from the hard-core people to more normal people that the explanations will continue to improve.
This is another way of saying, "Git is not supported on Windows."
Yep, my biggest beef with Git at the moment. But in the long term, I really think Git is the future and its poor Windows support is something that will hopefully be fixed by significantly motivated individuals.
I used to be more of a Mercurial guy, but there's just a moment (at least there was for me) where it all clicks and Git makes sense. Having your repository be just a giant DAG of commits is what you want -- forcing each fork in the road to live in its own separate repository is a pain and unnecessary.
"The user interface is... not too bad"
The interface gets improved. Latest Git release was mainly about improving usability and interface. Please remember that it is improved thanks to people constructively complaining on git mailing list (without being a troll).
Besides, what it matters how many binaries are installed in PATH? Most of them you wouldn't use. BTW. incoming 1.6.0 release will by default put most of binaries outside /usr/bin... as you can even now do by chosing install options.
About rebase:
Rebase allows to keep history linead (pro), but it is rewriting history (con). You should understand cons before using it. But you don't need to use rebase at all, if you use merge-based workflow.
If Mercurial doesn't have rebase (somebody mentioned 'transplant' extension (?) which does what git-rebase does, and mq extension, which is patch management interface like StGit or Guilt for git), it is no wonder that it is simplier.
"The model is rock solid and infallible because it is simple."
It is simple. You have graph of commits, and pointers to it (branches and tags). That is the core. That is the model.
Git encourages and even requires you to tamper with your project's source history
It is simply not true. Both about requires (you don't need to use rebase at all), and about encourages (I think there are enough warnings in documentation about dangers of rewriting history). And you always have reflogs for saving a kind of "undo" history.
Code in good taste. Use Mercurial.
Does Mercurial have submodules (subprojects, externals) support? Fix topmost commit easily? Have it got signed tags? Can it deal with a number of named branches simultaneously?
@josh: the fact that every git subcommand has its own binary is an implementation detail
But it's one that's foisted on the user. And it pollutes Git's own examples, too. Unless they've been cleaned up substantially in the intervening days, several of the tutorials hop freely between hyphenated and non-hyphenated versions, even within the same example.
Complexity does not necessarily equal power. There are parts of the problem that are complex in and of themselves, and there are parts of the problem that are only complex because the tools make it so.
For example, hg has nothing like git-filter-branch, which is a powerful tool and a godsend when you need it. Check out its examples
I will. Really and truly. I would love to find some killer itch that pushes me over this hill, because in a few years it looks like all the projects I love will be on Git.
Yes, the high-level commands are workflow-focused and will often do more than one small thing.
But the high level commands you really want to use are lumped right in with the lower-level, "don't touch these unless you want to lose a finger" ones. I'm a manpage reader, but I'm not a mind reader.
the quotes that describe it only as building blocks are obsolete.
The one from Linus is pretty old, but there are posts even within the last month that say the same thing.
Having your repository be just a giant DAG of commits is what you want -- forcing each fork in the road to live in its own separate repository is a pain and unnecessary.
Well, Mercurial's got inline branches. I keep meaning to use them on a sizable project "one of these days now," but I'm seduced by the clone approach.
I just think it's intellectually dishonest to imply git is not "reliable". In our community, that word has a definition and that definition is not "prone to user-error."
You should probably amend the post to make it clearer what you mean.
@kirindave: The sense I was going for was, "if it's this easy to break stuff, then it can't be trusted."
But I did not intend to make a statement one way or another about things like silent data corruption.
In retrospect, you're right that the meaning isn't clear, and I'll update (with properly overstruck text, so the history's preserved) the post.
Funny, I just posted on this topic one day before you, although not as elaborate and spiteful :)
http://blog.viridian-project.de/2008/02/04/revision-control-systems/
Seems like everyone is waking up to the Git experience these days. I actually did that about one year ago, but attributed my problems with it to my own stupidity.
Leslie
Interesting. I'm very much still open-minded about both of these, and need to invest some time in getting more familiar. I'll definitely be referring back to this entry and these comments as I do so.
Pretty stupid flamewar blog post. Go ahead and write another 10 like this. Post them to dzone and digg and you are oh so popilar.
@evolving: Do you see any ad banners? This blog wouldn't profit from popularity. The limited amount of attention it's received is about all I can handle. I have no idea how people manage to do this every day.
As to flamewars, read the comments here and on reddit. I think you'll find that most of them are the kind of "Okay, interesting, but have you looked at this?" or "I think you're misunderstanding; try this" variety.
If I'd wanted a flamewar, I'd have posted about the elections.
Hmmm... Interesting article. I actually agree with all the points given... but I still use git, and I think I'm going to stick with it. I can't learn two SCM (or can but see no point), and I think git is everything it has to be to be the 'bestest' SCM.
It is hard for beginners and Mercurial is _oh_so_easy_ (sigh) but it might get better and git is just too good at other stuff. Mostly I don't have to share my SCM work with other non-developers so 'easy' is not really an issue, and the times I do they will just have to cope. It's about 80/20 and 80% of the time I need something:
a) fast
b) widely-supported
c) well documented
Git is hands down the fast SCM. The other two factors are pretty equal.
I don't care about files in my /usr/bin/ or Windows support. Windows support will come if there is enough demand.
I think it's a pity git couldn't have had the command set of HG, but i'm mostly past that now and just use my memorised set of git commands.
Yeah... I'm not sold unfortunately.
I wrote a similar article a while ago which the main goal was to collect resources on DRCSs. Might be interesting to readers. Learning DRVCs
> Git polluted my /usr/bin with nearly 150 distinct binaries.
AFAIK, it is possible to have one binary (or very few binaries) in /usr/bin. In fact, the recommended way is "git some-command", not "git-some-command", and the only reason that the default installation still have so many binaries in /usr/bin is compatibility with old versions -- users scripts may depend on them. Probably, most binaries will probably disappear from /usr/bin in the next Git version.
> And if you think that you only need one or two of those commands for daily use, you're an optimist.
I doubt that any DVCS can be useful with one or two commands...
> For day-to-day use of Mercurial, you only need hg fetch to get code, and hg commit to give code.
"hg fetch" = "git pull"
"hg commit" = "git commit -a"
IMHO, even the simplest workflow normally requires such commands as 'diff', 'status', 'log'.
> Git was written with the "UNIX philosophy" of small tools that do only one thing,
"Unix philosophy" also implies that on top of those small tools, other tools are built, which do more complex tasks. So there is no contradiction here.
> "It's not an SCM.... I bet you could make a reasonable SCM on top of it, though"
This quote was written in April 2005, I don't see how it is relevant now.
> "The core Git filesystem can be explained as four types of objects: Blobs (files), Trees (directories), Commits and Tags."
> Unfortunately, no, it can't. The core of Git may well be implemented as four kinds of things. But to get even the most basic tasks done,...
You substitute one thing for another. Obviously, the explanation of how some thing is designed inside and how it is supposed to be used are two different explanations. Actually, Git and Mercurial have a lot in common. Most of what Bryan O'Sullivan writes about Mercurial in "A tour of Mercurial: the basics" can be directly to git or with minimum modifications. See "A tour of git: the basics" translation made by Carl Worth.
> "Git on Windows is only officially supported using Cygwin"
I know many people who use msysgit version of Git on Windows, and it works well for them.
> The short version is that Git encourages and even requires you to tamper with your project's source history, and that is a recipe for disaster, not reliability.
Certainly Git does not require to tamper history and hardly encourages to do so. The only reasonable application of git rebase is experimental branches, and the original history is preserved in the log for 90 days after re-writing.
@dpotapov:
> AFAIK, it is possible to have one binary (or very few binaries) in /usr/bin.
Yes, that installation option was added recently.
> In fact, the recommended way is "git some-command", not "git-some-command"
One could perhaps be forgiven for thinking the contrary from the existing documentation out there.
> IMHO, even the simplest workflow normally requires such commands as 'diff', 'status', 'log'.
Certainly, those are frequently-used commands, too. I think part of my confusion at the time of this writing (my temper has calmed since then, and others have kindly shown me where I've been wrong) was that diff / status work quite differently in Git than in other VCSes (both centralized and distributed).
> "Unix philosophy" also implies that on top of those small tools, other tools are built, which do more complex tasks.
It might have been nice for the tools at different layers of abstraction (porcelain vs. plumbing) to have been kept in different namespaces.
So there is no contradiction here.
> > "It's not an SCM.... I bet you could make a reasonable SCM on top of it, though"
> This quote was written in April 2005, I don't see how it is relevant now.
It's paired with a much more recent quote which says something very similar.
> Obviously, the explanation of how some thing is designed inside and how it is supposed to be used are two different explanations.
Except that some of the docs seem to say that a knowledge of what the four basic objects are is enough to understand how to use Git.
> See "A tour of git: the basics" translation made by Carl Worth.
I've read that, and it's lovely. You're right; in the intervening time since this post, I've seen a lot of similarities between Hg and Git (which I talk about in a followup post), and have seen many things to admire about Git.
> I know many people who use msysgit version of Git on Windows, and it works well for them.
I know others who have had performance issues (as I've had) and functionality problems. I'm glad the team is working on it, though.
> The only reasonable application of git rebase is experimental branches
The tutorials seem to recommend it for day-to-day workflow. In retrospect, perhaps that's not Git's fault per se.
Well, about a year ago, I considered git, but the lack of docs scared me. Now it is a different story. I imported the code from our SVN repo, and used it to track changes for a new feature. I think rebase is great, history only matters if it is IMPORTANT. Don't muck with history in your master branch, or the one tracking SVN ( it makes svn a sad panda ). But for getting a set of changes ready for commit, why have a whole seperate tool ( such as MQ ) when rebase can do 90% of it?
Basically, I was changing a core feature of our product, and writing a tool that needed to use that feature. So I created a branch off master ( that was tracking svn ). That branch had several tiny quick-n-dirty commits as I quickly copied over the code changes from a failed svn branch I was trying to maintain. These commits were in mixed order.
I used rebase interactive to quickly reorder them, so the tool changes came after the feature changes they depended on. Wow cool!
Then I realized, I should have a 'feature' branch, and a tool branch that tracked the head of the feature branch.
I create the tool branch, cherry-picked over the commits from my feature-rewrite branch that deal only with the tool. I then reset the 'tool' branch back a couple revisions so it popped the old tool commits off of it.
Voila, rewritten entirely in 5 minutes. This is after a week of using Git. I now have 2 branches tracking master ( which also tracks svn ). And I use rebase to keep them up to date. So when it is time to commit, it's a nice clean checkin.
I've found git no harder to use than SVN, and far easier in many cases. Because it is easy to create branches, and tweak history, merging is not issue.
And if I want those commits back, I can use reflog to get them back. Those 'lost' commits aren't really lost. They will stick around for a while ( user settable ) until a gc or pack causes them to be collective.
NB, I found "git help cmd-name" to be much more authorative and helpful than any svn online help. I don't what version of git you used, but 1.5+ are definite improvements.
The ability to edit and squash commits really makes it that much easier to commit early, commit often. Each small commit can be quickly reverted to restore work if you don't like it, and squashed into something more meaningful when you are ready to commit.
I think Git documentation is one of the main reasons why so many people believe that is difficult to use. Most documentation is written from Git developer POV, so it may be difficult to read for newcomers. Often the description of a porcelain command contains reference to plumbing commands or mentions some low-level features, which is probably interesting only to Git developers. Though the situation is gradually improves. For instance, when I started there was no simple way to obtain the list of most commonly used git commands. Now, you can type "git help" and see it. If you ned help with any command, you can type: "git help cmd-name" or "git help -w cmd-name". The latter is used to show help in your browser (in HTML format).
The ability to make quick-n-dirty commits and then edit them later was the key feature that attracted me to Git initially. It is very useful when you have many small changes and you want to test them on different computers with different settings. With SVN, you either end up saving not well tested changes or you create one big patch (as there is no convenient way to create series patches) and then manually copies and applies it to source code on different computers and only after that you can check in them as one big patch, which is no good as it make difficult to understand changes later. Also, it is very useful to save your current work in progress when you need to switch to something else.
Of course, the ability to edit the history of a branch is potentially dangerous as you can accidentally remove something useful. Fortunately, git provides safenet called the reflog. In essence, git stores the local log of all your operation thus you can restore what was accidentally. The reflog is useful in other situation like to remember what you did a week ago, etc. The default expiration time for the reflog is 90 days, but you can make infinity. Personally, I believe 90 days is reasonable time as what was removed so long time ago is very unlikely to be useful.
@crusoe, @dpotapov: You're both right about the advantages of Git over SVN. The ability to make provisional, experimental changes in branches or clones is the huge win of any DVCS.
Seems to me, the 'pro mercurial' git maintains this page simply as an effort to shift the 'hearts' of some programmers away from Git. Little he knows that all his ineffective praising of Mercurial does not make it better than Git. Mercurial's worse implementation and inefficiency are a known issue, and this is reflected in the performance results whenever Mercurial is compared to Git.
Check out this link to see what I mean.
http://weblogs.mozillazine.org/jst
/archive/2006/11/vcs_performance.html
Hi, GitFan.
It's been a long time since this post. I got what I needed to off my chest, and have since been content limping along in whichver SCM any given project is using (SVN, git, sometimes even bzr) for short forays, and interoperability approaches (e.g., patch queues) for longer ones.
As to Mercurial's allegedly "worse implementation," do you have a specific comparison of source code to point to, or just a two-year old article showing same order-of-magnitude performance between the same tools (quite a coup, since Mercurial is written in Python)?
@undees, @GitFan: First, Mercurial is not written in pure Python - if I remember correcly parts of it are written in C for better performance. Nevertheless I'll wait for vcscompare.blogspot.com to write speed comparison (speed benchmark).
Second, IMVHO Mercurial has worse design than Git, and this is not something that is easy corrected because of backwards compatibility. I'm talking here mainly about idea of local and remote-tracking branches in Mercurial vs. Git, and about tags.
@Jakub: you're correct to point out that a few of the performance-critical parts of Mercurial are written in C. Still, a big part of the reason that it's able to compete so well with Git is the revlog format, which was designed to reduce disk seeks. (Part of me wonders to what degree solid-state drives will erode the benefits of this optimization; guess we'll see.)
I know your feelings on branch tracking and tags; the e-mail exchange we had on the subject a couple of months ago was both interesting and enlightening. The tag situation is just a case where the Mercurial design sort of painted itself into a corner.
As to tracking remote branches, I tend to prefer the Mercurial approach of not having to manually set up a remote-to-local mapping and look up the correct incantation every time I do a pull.
@undees: From what I understand Git packs also reduces disk seeks (although from what I understand it was primarly written for network transport). Mercurial revlog-ng and transactions vs Git pack and loose format have each their own tradeoffs. I like what somebody said that Mercurial repository format is optimized for cold cache and patch applying, while Git repository format is optimized for warm cache and merges.
I won't write again about my thoughts on tags and local branches in Mercurial... but now setting up remote tracking branches info in Git is very easy thanks to "git remote add <name> <URL>" and globbing refspecs; no need to manually set up this information any longer (of course "git clone" have had setup this information for the origin repository for much longer time).
Hello guys,
I understand performance tests are not important specially if they are as old as two years... Of course assuming Mercurial at least made an effort in closing the gap. Perhaps a 'to the point' response to git and mercurial misunderstandings would clear things up... but then, knowledge is never enlightenment for some. May you not be one of them :)
http://weblog.masukomi.org/2008/02/07
/a-rebuttal-to-use-mercurial-you-git
@Jacob: Yes, I've read that link and found it to be a gently written, informative response.
As for clearing up misunderstandings and building bridges, this recent article does wonders:
http://importantshock.wordpress.com/2008/08/07/git-vs-mercurial/
Somehow, everyone here kind of agreed that git's interface is hard to use. Some points about that:
* I never really had any problems with it, thought it was straight forward enough.
* The git devs recognize that it needs cleaning up, and work is being done.
* There is a project called easy-git which makes using git's interface much easier. I, again, never found the need though.
Post a Comment