Mercurialでのコンフリクトの解消方法

 Mercurialでは複数のファイルを変更した際に、一部のファイルのみをコミットする事が出来る。この機能は割とよく使うのだけど、ちょっとした落とし穴がある。共有リポジトリに他の誰かが既に変更をコミットしていた場合に、マージするのがちょっと面倒くさくなる。
 誰かが先にコミットをしていた場合、hg pullで変更点を一端こちら側のリポジトリに取り込んでからマージする事になる。hg pullした時点でリポジトリの最先端が枝分かれするので、hg mergeで変更点のマージ準備を行ってマージをしないといけないんだけど、hg mergeを実行しようとしても、"abort: outstanding uncommitted changes"というエラーが出てマージが行えない。
 おちついてメッセージを読んでみれば、コミットしてないけど変更されてるファイルの存在が問題である、という事が分かる。なので、ひとまず全ての変更をrevertしてやればhg mergeが動くようになるんだけど、せっかく作業して変更点を今更revertするのももったいない。そういうような時は、下にあるような手順で、一度リポジトリをコピーしてからマージ作業を行う。

  1. hg cloneして別リポジトリを作る。
  2. リポジトリでhg mergeを行う。headを分岐させた側(つまり、後でコミットした側)の変更点がワーキングディレクトリに反映されるので、hg statusで変更点のマージ状況を確認する。(なお、先にコミットした側の変更点は既にコミット済みのものとして扱われる。)
  3. 確認し、適宜変更を加えた後、hg commitでコミットする。
  4. 元のリポジトリに戻って、hg pullで別リポジトリでの変更点を取り込む。

 これで、元のリポジトリ側でもマージが完了し、開発が続けられるようになる。
 しかし、cloneしてから作業するのとかはやっぱりめんどくさいので、変更点はできるだけこまめにコミットした方が良いね。
 全体的にわかりにくいので、後で書き直そう…。