So this post made the rounds a couple of days ago, and it got me thinking… can Mercurial (hg) do any better? I think it can, especially with Evolve. Here is me describing how Evolve works:
As to the movie, if you have not seen it yet, you might want to wait until after you do, but the basic gist is a time-travel plot where they go back and fix timelines.
In the beginning
History is terribly wrong, an awful, crippling bug has been discovered way back in history, and it’s so terrible that a big chunk of current history has to be thrown out. Someone created evil sentinels, so evil that they decided to exterminate all mutants and most humans.
Finding the problem
Everyone digs back through the logs to find the cause of the problem. They know everything is bad now,
but remember that some time in the past it was ok
After some discussion,
$ hg bisect --bad
$ hg bisect --good
$ hg bisect --bad
the problem is revealed:
changeset: 1024:0adf0c6e2698
user: Raven Darkhölme <mystique@x-men.org>
date: Fri May 18 12:24:50 1973 -0500
summary: Kill Trask, get DNA stolen
A bookmark is placed here for future reference
Preparing Wolverine
Professor X and Magneto brief Wolverine on his impending task. The history has been made public, but the situation is so hopeless that hg admin Kitty Pryde decides to operate on Wolverine’s repo, the only one that could withstand the changes:
$ hg phases --draft --force -r 'descendants("mystiques-first-kill")'
Now Wolverine’s repo can endure any change. It’s a desperate move, but these are desperate times. Kitty sends Logan back:
Making the fixes
Wolverine dispatches some minor thugs and squashes a few bugs, but the first change needs to alter the timeline,
Now all of the history that was based on top of this commit is unstable. It’s still there, for now, but things are rocky. Sentinels are approaching in the bad future and might kill everyone. Shit will get real there.
That’s ok, though, Wolverine is badass, doesn’t give a fuck, and goes about his business,
$ hg ci -m "New recruit: Peter Maximoff <quicksilver@x-men.org>"
$ hg ci -m "Use Quicksilver to rescue Magneto"
$ hg ci -m "Stop Mystique from killing Trask (WIP)"
$ hg ci -m "Stop Mystique again from killing Trask"
$ hg fold -r .^ -m "Stop Mystique from killing Trask"
$ hg ci -m "Get metal painfully inserted into body. Then get drowned for good measure"
He decided that he didn’t want two separate commits for the same effect of stopping Mystique, so he folded those two commits into one. This is ok, because he’s still in draft mode.
Shelving working changes
Now Wolverine can’t do much about his current situation, and it’s up to others. So he decides to put his memory away for a while,
and now it’s up Mystique’s less buggy version, disguised as Stryker, to revive Wolverine,
and a whole lot of other merry developments happen offscreen:
$ hg ci -m "Get new recruits"
$ hg ci -m "Everyone's happy"
$ hg ci -m "Etc, etc"
Finalising
At this point, the unstable history with the bad timeline is no longer needed. If the X-Men had wanted to keep any part of it, they might have used the hg evolve
command, but they just want to forget the whole mess
$ hg prune -r "unstable()"
and the whole thing just fades away. Wolverine reawakens in the future, along with his memories,
and it’s up to him and future Professor X in the good timeline to fix all the merge conflicts that will ensue from this unshelving.