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

JapaneseTutorialExport では、私達は他の人と変更を共有する方法を学びました。しかし (バージョン 0.7 の時点では) ["Import"] はメールで送られたマージを正しく扱えないので、私たちは非互換の変更を加えられた他のリポジトリから変更を引っ張ってマージするのを実演してみます。

まず、私達は何かマージするものを作成しなければいけません。my-hello リポジトリをもう一度 [:Clone:複製]しましょう。

$ cd ..
$ hg clone my-hello my-hello-desc

hello.c のコメントセクションに説明を付けてみます。

$ cd my-hello-desc
$ vi hello.c

2 行目をこのように変更しましょう:

 * hello.c

を、こう変更します:

 * hello.c - hello, world

保存してエディタを終了して、変更を[:Commit:コミット]しましょう。今回は commit コマンドに -m オプションを使って,エディタを起動しないようにして時間を節約します:

$ hg commit -m 'Add description of hello.c'

この時点で、my-hello-new-output [:Repository:リポジトリ] の hello.c に変更が1つあり、my-hello-desc [:Repository:リポジトリ] の hello.c に別の変更があります。これら 2つの分岐した開発ラインをどうやってマージするのでしょう? 一方からもう一方へ pull したいときに、問題は起きないでしょうか?

これは全く上手くいきます。my-hello-desc にまだ居る間に、my-hello-new-output から変更を [: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)

これは JapaneseTutorialShareChangepull の出力と全く同じように見えます! だから私達がしなければならないことは ["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)

いや、何か起きました。["Mercurial"] は私達に、 [:Repository:リポジトリ]に私達が加えた変更を [:Merge:マージ]する必要がある、と告げています。これは手間がかかりそうですね? 実際は非常に簡単です。出力の最後の行の指示に従ってみましょう:

$ hg update -m
merging hello.c

すべきことはこれだけです! ["Mercurial"] はマージを自動的に扱えます。hello.c を見れば、my-hello-new-output からの変更と my-hello-desc からの変更が 両方とも 含まれているのを見つけることができます。

他の人々が作成した変更と連携するときは、最終的にはほとんどの時間をこの種のマージの実行に当てることになるでしょう。

しかし、私達はさらに進んで、JapaneseTutorialConflict で競合する変更が作成されたばあいの扱い方を学びましょう。