チュートリアル - 変更をマージする
JapaneseTutorialExport では、私達は他の人と変更を共有する方法を学びました。しかし (バージョン 0.7 の時点では) Import はメールで送られたマージを正しく扱えないので、私たちは非互換の変更を加えられた他のリポジトリから変更を引っ張ってマージするのを実演してみます。
まず、私達は何かマージするものを作成しなければいけません。my-hello リポジトリをもう一度 複製しましょう。
$ 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 コマンドに -m オプションを使って,エディタを起動しないようにして時間を節約します:
$ hg commit -m 'Add description of hello.c'
この時点で、my-hello-new-output リポジトリ の hello.c に変更が1つあり、my-hello-desc リポジトリ の hello.c に別の変更があります。これら 2つの分岐した開発ラインをどうやってマージするのでしょう? 一方からもう一方へ pull したいときに、問題は起きないでしょうか?
これは全く上手くいきます。my-hello-desc にまだ居る間に、my-hello-new-output から変更を 引っ張ってきて、何が起きるか見てみましょう:
$ 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)
これは JapaneseTutorialShareChange の pull の出力と全く同じように見えます! だから私達がしなければならないことは Update ですね?
$ hg update abort: update spans branches, use 'hg merge' or 'hg update -C' to lose changes
いや、何か起きました。Mercurial は私達に、 リポジトリに私達が加えた変更を マージする必要がある、と告げています。これは手間がかかりそうですね? 実際は非常に簡単です。出力の最後の行の指示に従ってみましょう:
$ hg merge merging hello.c 0 files updated, 1 files merged, 0 files removed, 0 files unresolved (branch merge, don't forget to commit)
(Windows ユーザーへ: 「'hgmerge' は、内部コマンドまたは外部コマンド、操作可能なプログラムまたはバッチ ファイルとして認識されていません。」といったエラーの場合、Mercurial がマージプログラムを見つけられません。これを解決する方法は MergeProgram を参照してください)
すべきことはこれだけです! Mercurial は、内部で hgmerge (あるいはそれに類する マージプログラム) を呼び出すことで、マージを自動的に扱えます。環境によっては、hgmerge はグラフィカルなマージ解決ツールを呼び出すかもしれません。hello.c を見れば、my-hello-new-output からの変更と my-hello-desc からの変更が 両方とも 含まれているのを見つけることができます。
(注: Mercurial のバージョン 0.9 以前では, hg update -m が hg merge の代わりでした)
他の人々が作成した変更と連携するときは、最終的にはほとんどの時間をこの種のマージの実行に当てることになるでしょう。hg merge の出力の最後の行の通り、変更をリポジトリにコミットすることを忘れないでください:
$ hg commit -m "Merged changes from my-hello-new-output" There shouldn't be any output from this command.
マージでなにが変更されたかを表示する為に、annotate コマンドでファイルの行ごとの ChangeSet を表示できます。リビジョン 2 が私達の my-hello-desc レポジトリについての変更、リビジョン 3 は my-hello-new-output レポジトリから my-hello-desc レポジトリに pull してマージされた変更です。
$ hg annotate hello.c 0: /* 2: * hello.c - hello, world 0: * 0: * Placed in the public domain by Bryan O'Sullivan 0: * 0: * This program is not covered by patents in the United States or other 0: * countries. 0: */ 0: 0: #include <stdio.h> 0: 0: int main(int argc, char **argv) 0: { 0: printf("hello, world!\n"); 3: printf("sure am glad I'm using Mercurial!\n"); 0: return 0; 0: }
しかし、私達はさらに進んで、JapaneseTutorialConflict で競合する変更が作成された場合の扱い方を学びましょう。