There are certain moments in my life where I feel this love. Love and satisfaction. In these moments I do not regret at all to still work for an “underdog” version control system like [monotone](http://www.monotone.ca) and have not converted to the dark side of the moon (read: git). One of these moments was today, when I did a merge between two branches.
See, many people working with Subversion or even git are annoyed of its merge behaviour. Sometimes they even fear to merge because hell breaks loose if the source branch moved files or even directories (yikes!) around. I cannot tell how often I had to resolve tree conflicts by hand in Subversion and I also cannot tell how often git forced me to clean my workspace from uncommitted or stashed changes before I was able to pull new stuff in.
Today now with monotone, I propagated the latest changes from the [main branch](https://code.monotone.ca/p/monotone/source/tree/h:net.venge.monotone/) to my little [source-tree-cleanup branch](https://code.monotone.ca/p/monotone/source/tree/h:net.venge.monotone.source-tree-cleanup/). The latter moves many files and even whole directories around, so one would expect merge chaos in an ordinary version control system if files inside these moved directories would have been changed, or even new files would have been added, in the main branch in the meantime, right?
Not so with monotone. It not only tracks the file identity and rename history for files, but also for directories, so the merge went flawlessly without manual intervention:
$ mtn propagate net.venge.monotone net.venge.monotone.source-tree-cleanup mtn: propagating net.venge.monotone -> net.venge.monotone.source-tree-cleanup mtn: [left] 4f505ed0817cef6a34e1cc404b0511426a15fef9 mtn: [right] ec9269fa9ddd7b7e2d4716610241a7577159ba9d mtn: [merged] 1b5c865085537cebd09b5e8481fba1eebfd63a03
And the update afterwards was no exception:
$ mtn update mtn: updating along branch 'net.venge.monotone.source-tree-cleanup' ... mtn: adding test/func/diff_order hinzu mtn: adding test/func/diff_order/__driver__.lua hinzu ... mtn: updating NEWS ... mtn: updating src/cmd_diff_log.cc mtn: updating src/cmd_list.cc ...
(some context: `./test/func` was `./tests` before and `./src` was `./`)
Call me fanboy, but I _love_ this version control system!