#language ja == チュートリアル - 変更をマージする == 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) }}} これは JapaneseTutorialShareChange の {{{pull}}} の出力と全く同じように見えます! だから私達がしなければならないことは [[Update]] ですね? {{{ $ hg update abort: update spans branches, use 'hg merge' or 'hg update -C' to lose changes }}} いや、何か起きました。[[Mercurial]] は私達に、 [[Repository|リポジトリ]]に私達が加えた変更を [[Merge|マージ]]する必要がある、と告げています。これは手間がかかりそうですね? 実際は非常に簡単です。出力の最後の行の指示に従ってみましょう: {{{ $ 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 (あるいはそれに類する [[MergeProgram|マージプログラム]]) を呼び出すことで、マージを自動的に扱えます。環境によっては、hgmerge はグラフィカルなマージ解決ツールを呼び出すかもしれません。{{{hello.c}}} を見れば、{{{my-hello-new-output}}} からの変更と {{{my-hello-desc}}} からの変更が ''両方とも'' 含まれているのを見つけることができます。 (注: Mercurial のバージョン 0.9 以前では, hg update -m が hg merge の代わりでした) 他の人々が作成した変更と連携するときは、最終的にはほとんどの時間をこの種のマージの実行に当てることになるでしょう。hg merge の出力の最後の行の通り、変更を[[Repository|リポジトリ]]に[[Commit|コミット]]することを忘れないでください: {{{ $ 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 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 で競合する変更が作成された場合の扱い方を学びましょう。 ---- CategoryJapanese