チュートリアル - 衝突する変更をマージする

JapaneseTutorialMerge では、私達は単純な [:Merge:マージ] の扱い方を学びました。

["Mercurial"] はより複雑な [:Merge:マージ] も扱います。2 人があるファイルの同じ行を編集し、その後どうすべきかを解明しなければいけなくなるのは必ずしも珍しくはありません。こういった問題は衝突と呼ばれます; 衝突にたいして何をすべきかを解明することは、それを解決する、と呼ばれます。

まず人為的に衝突した状況を作ってみましょう。前にもしたように、my-hello を [:Clone:複製]することから始めましょう。

$ cd ..
$ hg clone my-hello my-hello-not-cvs

今度は hello.c の出力に新しい行を加えてみましょう:

$ cd my-hello-not-cvs
$ vi hello.c

main をこのように変更します:

int main(int argc, char **argv)
{
        printf("hello, world!\n");
        printf("sure am glad I'm not using CVS!\n");
        return 0;
}

そしてこの変更を [:Commit:コミット]します。

$ hg commit -m 'Give thanks for dodging bullet'

JapaneseTutorialFirstChange では、私達は my-hello-new-output でも 2行目の出力を加えた [:ChangeSet:チェンジセット]を作成したのを思いだしてください。ここにその変更を [:Pull:引っ張る] としたら、何が起きるでしょうか?

$ hg pull ../my-hello-new-output
pulling from ../my-hello-new-output
searching for changes
adding changesets
adding manifests
adding file changes
added 1 changesets with 1 changes to 1 files (+1 heads)
(run 'hg update' to get a working copy)

ここまでは良いでしょう。["Update"] してみましょう。

$ hg update
this update spans a branch affecting the following files:
 hello.c (resolve)
aborting update spanning branches!
(use update -m to merge across branches or -C to lose changes)

JapaneseTutorialMerge のように、update -m を実行する必要があります。しかし、ここに変化があります。["Mercurial"] は自動的に [:Merge:マージ]することができません、というのは各[:ChangeSet:チェンジセット]によって、同じソースファイルの同じ行が異なるように変更されているからです (一方は私達が[:Commit:コミット]したもので、もう一方は[:Pull:引っ張って]きたものです。その代わりに、["Mercurial"] は手動でマージするのを助けてくれるプログラムを起動するでしょう。)

$ hg update -m

この時点で何が起きるかは、コンピュータにインストールされているプログラムに依存します。もし幸運にも私達に先見の明があって、[:MergeProgram:マージプログラム]をインストールしていたなら、[:MergeProgram:マージプログラム]が立ち上がります。ここで、私達は2つの変更の間で何が衝突しているのかを確認し、それらをどうやって解決するかを決めることができます。

もし[:MergeProgram:マージプログラム]をインストールしていないなら、テキストエディタが立ち上がり、[:Merge:マージ]する必要があるファイルを開きます。これを手で行うことは 非常に間違いを起こしやすく、退屈です。エディタを終了して hg undo コマンドを使って ["Pull"] の影響を元に戻して、その後 [:MergeProgram:マージプログラム] をインストールして、その後もう1度試してみるのが最善です。

注意: ["Mercurial"] はどのプログラムを実行する必要があるかを調べるために HGMERGE 環境変数と設定ファイルを調べます。もし何も設定されていなければ、hgmerge スクリプトを実行します。これは諦める前に一般的なプログラムを幾つか試します。

それでは JapaneseTutorialConclusion に進んでおしまいにしましょう。