Git sucks, or why do I use darcs instead

This article is my small individual experience of using version control systems. It's for your information.

  1. Git sucks, or why do I use darcs instead
    1. Where git sucks
      1. Git is too simple and stupid for me
      2. No dependency controlling
      3. Interactive mode sucks
      4. Reverting old commits sucks
      5. No tracking of past file locations
      6. Unicode support sucks
      7. Code sharing sucks
    2. Where git rocks
      1. Git's performance rocks
      2. Gits' branches rock
    3. Git vs CVS vs SVN vs Mercurial vs Bazaar
    4. Links

Where git sucks

Git is too simple and stupid for me

git - the stupid content tracker
Linus Torvalds, man git

First, I want to use revision control systems for all possible thoughts which can come in my head.

Darcs has a nice patch theory describing what I can do with history and what I can't because of dependency problems. Git's history seems to me like a store of diffs which lay one by one with no way to take a bottom one without touching an upper. It looks like using “cp -r revision control system”, the only difference is that it takes less of disk space.

No dependency controlling

Just see this video to understand what is it. It shows it very clear.

link to youtube

Interactive mode sucks

It's what darcs has by default and git hasn't.

Interactive mode is usually annoying in command-line tools, but not when I need to know, what I really do with my code. It's also simplifies partial commits very much.

Reverting old commits sucks

How can I revert an old change only in the chosen file? In darcs, I can do darcs unrecord or darcs obliterate and follow its instructions. In git, I can devise only:

git diff <commit>..<commit>^ <file> | git apply -

And no dependency analysis will be performed. Just a diff. Simple and stupid.

No tracking of past file locations

In darcs, I can can see what happened with file which was in the working copy but for now it doesn't exists:

[komar@pavilion ~/k.b.n/ru]$ darcs changes -s web
Changes to ru/web:

Mon Apr 18 00:42:28 MSD 2011  Alexander Markov <>
  * mv */web */location

     ./en/web -> ./en/location
     ./ru/web -> ./ru/location

This feature I use in this wiki. Try to go at /en/web and you will be redirected to /en/location. How can I get the same in git? If somebody knows, let me know, because I need it to add this feature to my site’s engine code.

By the way, here's a recipe for mercurial:

hg export -g -r `hg log --template '{node}' -l1 --removed MOVED_FILE_NAME` | grep '^rename'

Unicode support sucks

The problem is solved.

By the way, new version of darcs fucks up unicode commit messages, so "выкатываем этот стыд" becomes "2K:0BK205< MB>B ABK4". Darcs developers won't fix it.

Code sharing sucks

What we need to share read-only darcs repo? A webserver. Just put your repo on http and everybody will be able:

In git, we need a... Hm... Github?

Of course, you can run some crutches, but it's not too simple.

The problem is solved:

git --bare update-server-info
mv hooks/post-update.sample hooks/post-update
chmod a+x hooks/post-update

Where git rocks

Git's performance rocks

Git is very fast. Nuff said.

If you need to create a really huge repo, just use git.

The only haskell thing that works good is xmonad. I used it for years and still very happy with it.
The only haskell things that works fast are qsort and shootout tests.
The other haskell soft is full of shit and I can't understand why.

Gits' branches rock

The same. If you really need to use branches, use git.

Git vs CVS vs SVN vs Mercurial vs Bazaar

And don't think what CVS, SVN, mercurial or bazaar is better than git. It's not truth, these version control systems are much worse. You can read about it below.