チュートリアル - 最初の変更を行う

JapaneseTutorialHistory から進んだ結果、私達は JapaneseTutorialClone で [:Clone:複製]した my-hello リポジトリの中に居ます。

各変更を別の[:Repository:リポジトリ]に分離するのは、["Mercurial"]で開発を実践する上で良いことです。これは関係のないコードが混ざるのを防ぎ、これにより個々の作業を個別にテストするのが楽になります。このモデルに従って始めてみましょう。

私達の他愛の無い目標は、"hello, world" プログラムの出力を別の行に変えることです。まず最初に、私達の小さなプロジェクトのために、my-hello を複製して my-hello-new-output と呼ばれる新しいリポジトリを作成します。

$ cd ..
$ hg clone my-hello my-hello-new-output

このばあい、clone コマンドは成功したら何も表示しません。

注意: 新しい [:Repository:リポジトリ] に説明文的な名前を付けたに注意してください。基本的には、[:Repository:リポジトリ] の目的を確認できるものを付けます。["Mercurial"] では [:Repository:リポジトリ] の [:Clone:複製] は手軽に行えるので、すぐに微妙に異なる大量のリポジトリが蓄積します。もしこれらのリポジトリに説明文的な名前を付けなければ、すぐにそれらを識別できなくなるでしょう。

それでは、新しいリポジトリを変更してみましょう。[:WorkingDirectory:作業ディレクトリ] (これは全てのファイルがあるディレクトリの私達の呼び名です)に入って、お好みのエディタでソースコードを変更してみましょう。

$ cd my-hello-new-output
$ vi hello.c

hello.c の中身は最初はこんな感じです:

/*
 * 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");
        return 0;
}

main を編集して余分に行を出力するようにしてみましょう。

(...)

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

終わったら、エディタを終了してください。この編集で、[:ChangeSet:チェンジセット]を作成する準備ができました。

しかし、もし仮に私達が作業を中断して、どの変更が[:ChangeSet:チェンジセット]に含まれるか忘れてしまったらどうなるでしょう? このために、status コマンドを使います。

$ hg status
M hello.c

出力は簡単ですが、接頭辞の Mhello.c が変更されて、[:ChangeSet:チェンジセット]に含まれるであろうことを、私達に簡単に教えてくれます。

diff コマンドを使うと、そのファイルに対して私達がした変更を実際に調べることができます。

$ hg diff
diff -r 82e55d328c8c hello.c
--- a/hello.c   Fri Aug 26 01:21:28 2005 -0700
+++ b/hello.c   Fri Sep 30 10:27:47 2005 +0800
@@ -12,5 +12,6 @@
 int main(int argc, char **argv)
 {
        printf("hello, world!\n");
+       printf("sure am glad I'm using Mercurial!\n");
        return 0;
 }

<!> 変更を 破棄して最初からやり直したいばあいは、revert コマンドを使ってファイルを変更されていない状態に戻すことができます。これが本当にしたいことなのか確認してください。

$ hg revert

[:ChangeSet:チェンジセット]を作成する行為は、[:Commit:コミット]すると呼ばれます。commit コマンドを使って [:Commit:コミット] を実行します。

$ hg commit

これはエディタを開いて、暗号のような行をいくつか表示します。

注意: デフォルトのエディタは vi です。これは EDITORHGEDITOR 環境変数を使って変更することができます。また、マニフェストのハッシュは、あなたがどのようにタイプしファイルを保存したかによって異なります。

(空行)
HG: manifest hash 14595beb70bcfb74bf227437d70c38878421c944
HG: changed hello.c

最初の行は空白で、続く行は [:ChangeSet:チェンジセット]に含まれるであろうファイルを特定します。

[:ChangeSet:チェンジセット]を[:Commit:コミット]するには、理由を書かなければなりません。これは通常[:ChangeSet:チェンジセット] コメントと呼ばれます。このようにタイプしてみましょう。

Express great joy at existence of Mercurial
HG: manifest hash 14595beb70bcfb74bf227437d70c38878421c944
HG: changed hello.c

次に、保存してエディタを終了します。全て上手くいったなら、commit コマンドは終了して何も表示しません。<!> もしテキストを保存せずにエディタを終了したなら、commit は操作を中断し、コミットする前に気を変えることができます。

今だと status コマンドは私達に何を教えてくれるでしょうか?

$ hg status

何もありません! 私達の変更は [:ChangeSet:チェンジセット] に [:Commit:コミット]されたので、コミットが必要な変更されたファイルが存在しません。 ["Tip"] は今では作業ディレクトリの内容に一致しています。

次の作業のために、更新履歴を調べることができます。

$ hg log
changeset:   2:a58809af174d
tag:         tip
user:        mpm@selenic.com
date:        Fri Aug 26 01:26:28 2005 -0700
summary:     Express great joy at existence of Mercurial

(...)

ありました! 私達が [:Commit:コミット]した [:ChangeSet:チェンジセット] です。

注意: ユーザ名、日付、ChangeSetID はもちろん変わるでしょう。

JapaneseTutorialClone で議論したように、新しい[:ChangeSet:チェンジセット]はこのリポジトリにのみ存在します。これは ["Mercurial"] の動作で極めて重要な部分です。

変更を共有するには、JapaneseTutorialShareChange に進まなければなりません。