Differences between revisions 2 and 3
Revision 2 as of 2005-11-17 07:07:54
Size: 4829
Editor: HidetakaIwai
Comment: Updated the translation to r12
Revision 3 as of 2007-11-29 03:18:57
Size: 5507
Comment: Updated the translation to r19.
Deletions are marked like this. Additions are marked like this.
Line 55: Line 55:
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)
abort: update spans branches, use 'hg merge' or 'hg update -C' to lose changes
Line 61: Line 58:
JapaneseTutorialMerge のように、{{{update -m}}} を実行する必要があります。しかし、ここに変化があります。["Mercurial"] は自動的に [:Merge:マージ]することができません、というのは各[:ChangeSet:チェンジセット]によって、同じソースファイルの同じ行が異なるように変更されているからです (一方は私達が[:Commit:コミット]したもので、もう一方は[:Pull:引っ張って]きたものです。その代わりに、["Mercurial"] は手動でマージするのを助けてくれるプログラムを起動するでしょう。) JapaneseTutorialMerge のように、{{{hg merge}}} を実行する必要があります。しかし、ここに変化があります。["Mercurial"] は自動的に [:Merge:マージ]することができません、というのは各[:ChangeSet:チェンジセット]によって、同じソースファイルの同じ行が異なるように変更されているからです (一方は私達が[:Commit:コミット]したもので、もう一方は[:Pull:引っ張って]きたものです。その代わりに、["Mercurial"] は手動でマージするのを助けてくれるプログラムを起動するでしょう。)
Line 64: Line 61:
$ hg update -m $ hg merge
Line 68: Line 65:

以下が、Linux 上の vim エディタによって表示された衝突の例です。

{{{
/*
 * hello.c
 *
 * Placed in the public domain by Bryan O'Sullivan
 *
 * This program is not covered by patents in the United States or other
 * countries.
 */

#include <stdio.h>

int main(int argc, char **argv)
{
        printf("hello, world!\n");
<<<<<<< /home/motoko/project/my-hello-not-cvs/hello.c.orig.197516148
        printf("sure am glad I'm not using CVS!\n");
||||||| /tmp/hello.c~base.aYR8Pf
=======
        printf("sure am glad I'm using Mercurial!\n");
>>>>>>> /tmp/hello.c~other.F7OpXy
        return 0;
}
}}}
Line 77: Line 101:
もし[:MergeProgram:マージプログラム]をインストールしていないなら、テキストエディタが立ち上がり、[:Merge:マージ]する必要があるファイルを開きます。これを手で行うことは '''非常に'''間違いを起こしやすく、退屈です。エディタを終了して {{{hg undo}}} コマンドを使って ["Pull"] の影響を元に戻して、その後 [:MergeProgram:マージプログラム] をインストールして、その後もう1度試してみるのが最善です。 もし[:MergeProgram:マージプログラム]をインストールしていないなら、テキストエディタが立ち上がり、[:Merge:マージ]する必要があるファイルを開きます。これを手で行うことは '''非常に'''間違いを起こしやすく、退屈です。エディタを終了して {{{hg rollback}}} コマンドを使って ["Pull"] の影響を元に戻して、その後 [:MergeProgram:マージプログラム] をインストールして、その後もう1度試してみるのが最善です。
Line 79: Line 103:
'''注意:''' ["Mercurial"] はどのプログラムを実行する必要があるかを調べるために {{{HGMERGE}}} 環境変数と設定ファイルを調べます。もし何も設定されていなければ、{{{hgmerge}}} スクリプトを実行します。これは諦める前に一般的なプログラムを幾つか試します。 (注: Mercurial バージョン 0.9 より前では、{{{hg update -m}}} が {{{hg merge}}} の代わりに、{{{hg undo}}} が hg rollback の代わりに使われていました。)

(注: 不必要な hello.c.orig が残るけどどうしよう?)

いつものように、この変更をレポジトリに commit して完了です:

{{{
$ hg commit -m "Merged changes from my-hello-new-output"
}}}

このコマンドはなにも出力しないはずです。

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

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
abort: update spans branches, use 'hg merge' or 'hg update -C' to lose changes

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

$ hg merge

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

以下が、Linux 上の vim エディタによって表示された衝突の例です。

/*
 * hello.c
 *
 * Placed in the public domain by Bryan O'Sullivan
 *
 * This program is not covered by patents in the United States or other
 * countries.
 */

#include <stdio.h>

int main(int argc, char **argv)
{
        printf("hello, world!\n");
<<<<<<< /home/motoko/project/my-hello-not-cvs/hello.c.orig.197516148
        printf("sure am glad I'm not using CVS!\n");
||||||| /tmp/hello.c~base.aYR8Pf
=======
        printf("sure am glad I'm using Mercurial!\n");
>>>>>>> /tmp/hello.c~other.F7OpXy
        return 0;
}

["Mercurial"] はファイル毎の 3-way マージを使用します。これはマージ処理に 3 つの入力ファイルがあることを意味し、それらは次の通りです:

  • ローカルファイル (現在のリポジトリ由来)
  • 他のファイル (マージされるリポジトリ由来)
  • 基本ファイル (枝分かれする前の最後のバージョン)

3-way についてのさらなる情報は、[http://revctrl.org/ Revctrl wiki] にある [http://revctrl.org/ThreeWayMerge ThreeWayMerge] を見てください。

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

(注: Mercurial バージョン 0.9 より前では、hg update -mhg merge の代わりに、hg undo が hg rollback の代わりに使われていました。)

(注: 不必要な hello.c.orig が残るけどどうしよう?)

いつものように、この変更をレポジトリに commit して完了です:

$ hg commit -m "Merged changes from my-hello-new-output"

このコマンドはなにも出力しないはずです。

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

JapaneseTutorialConflict (last edited 2009-05-19 19:30:58 by localhost)