Many years ago, I tried playing with distributed version controls. Darcs seemed to be all the rage back then, but somehow I found them to be way too complicated for my uses. Yesterday, I decided to give Git a whirl.
I got it.
Having used Subversion for a couple of years and CVS for more years than I care to remember, I realized that a central repository system was fundamentally broken. It requires one to keep so much in one’s head. I almost always have to execute a
svn status before every commit because I can’t remember about files that have moved, changed, deleted, added etc. This also adds a lot of cruft to the metadata of files that have had substantial changes across branch merges.
On the other hand, Git only cares about changes between trees. It cares about content and not files. You
diff trees, not files. This is all very beautiful.
I have only scratched the surface. I cheated and took the crash course for people coming from the Subversion world. I haven’t even explored how merges work across branches: they are about five of them in Git.
One day, I will get all of it. Until then, I’ll trust the judgement of the incredibly smart people who work on Git. This is another of Linus’ masterpieces.
PS: Here’s a fairly good explanation of the guts of Git: Git for computer scientists.