Mercurialではじめる分散構成管理

第1回 「分散」への第一歩 ~ ローカルでの複製

この記事を読むのに必要な時間:およそ 6 分

ワーキングディレクトリへの操作の取り消し

"hg commit"により変更を確定する前の操作,即ちワーキングディレクトリに対する操作は,"hg revert"コマンドにより取り消すことができます。

以下は,"hg add"によるファイルの追加指示の取り消し例です。

コマンド7

% echo "good by" > goodby.txt
% hg add goodby.txt
% hg status -A
A goodby.txt
% hg revert goodby.txt
% hg status -A
? goodby.txt
%

以下は,"hg remove"によるファイルの削除指示の取り消し例です。

コマンド8

% hg remove hello.txt
% ls hello.txt
ls: cannot access hello.txt: No such file or directory
% hg status -A
R hello.txt
% hg revert hello.txt
% ls hello.txt
hello.txt
% hg status -A
C hello.txt
% 

以下は,構成管理下にあるファイルの内容変更の取り消し例です("hg revert"により作成される"hello.txt.orig"は,"hg revert"直前の内容を保持するバックアップファイルです⁠⁠。

コマンド9

% echo 'good by' >> hello.txt
% hg status -A
M hello.txt
% hg diff
diff -r a044b949325f hello.txt
--- a/hello.txt	Mon May 05 21:16:24 2008 +0900
+++ b/hello.txt	Mon May 05 21:26:19 2008 +0900
@@ -1,1 +1,2 @@ hello
 hello
+good by
% hg revert hello.txt
% hg status -A
C hello.txt
? hello.txt.orig
% hg diff
% 

以下は,手動でのファイル削除の取り消し例です。

コマンド10

% rm hello.txt
% hg status -A
! hello.txt
% hg revert hello.txt
% ls hello.txt
hello.txt
% hg status -A
C hello.txt
% 

ご覧のように,"hg revert"により取り消すことができます。ちなみに,"hg status"に対する"-A"オプション指定は,⁠改変無し="C"lean」なファイルに関する状態表示も行うように指示するものです。

リポジトリへの操作の取り消し

間違って実行してしまった"hg commit"は, "hg rollback"により取り消すことができますが, 残念なことに1回分しか取り消すことができません。

「一回分しか取り消せない⁠⁠ ことを「多い」と見るか「少ない」と見るかは人それぞれでしょうが, 一旦"commit"してしまったら取り返しがつかないCVSと比較すれば, 心理的な余裕は断然違ってくるでしょう。

コマンド11

% echo "good by" >> goodby.txt
% hg add goodby.txt
% hg status
A goodby.txt
% hg commit -m 'goodby'
% hg status
% hg rollback
rolling back last transaction
% hg status
A goodby.txt
% 

ファイルの複製・改名

Mercurialでは, "hg copy"を使うことで, ファイルを複製することができます。

コマンド12

% hg copy hello.txt goodby_hg_copy.txt
% hg commit -m 'copy hello to goodby'
% hg log goodby_hg_copy.txt
changeset:   1:b3fdaab39142
tag:         tip
user:        fujiwara
date:        Mon May 05 21:30:58 2008 +0900
summary:     copy hello to goodby

% hg log -f goodby_hg_copy.txt
changeset:   1:b3fdaab39142
tag:         tip
user:        fujiwara
date:        Mon May 05 21:30:58 2008 +0900
summary:     copy hello to goodby

changeset:   0:a044b949325f
user:        fujiwara
date:        Mon May 05 21:16:24 2008 +0900
summary:     add hello.txt

% 

"hg log"コマンドに"-f"(ないし"--follow")オプションを指定することで,複製元ファイルの履歴情報(上記例では"hello.txt"由来の"a044b949325f")も表示させることができます。

(1)"hg copy"による複製が複製元の履歴情報を引き継ぐことと,⁠2)"hg remove"による削除でも履歴情報はリポジトリに保持されたまま,ということを利用し,これら2つを組み合わせることで,実質的に「改名」として機能する"hg rename"というコマンドも提供されています。

"hg revert"や"hg rollback"による取り消しと違い,履歴情報がリポジトリに残ってしまいますが,一種の「取り消し」とも言える「改名」ができるということも,心理的な余裕に繋がるのではないでしょうか?なお,心理的余裕のせいで命名がぞんざいになる,という弊害に関しては,各自で対応してください。

それでは「分散」への第一歩として,ローカルホストにおけるリポジトリの複製をしてみましょう。

「分散リポジトリ」の解説を期待していたのに,⁠ローカルホストにおける複製」と聞いて,拍子抜けしている方も居られるかもしれません。しかし,リポジトリ間の連携方式が統一されているMercurialを利用する場合,連携対象リポジトリがローカルホスト上にあるのか,それともネットワークの向こう側にあるのかは,さして大きな違いでは無いのです。

著者プロフィール

藤原克則(ふじわらかつのり)

Mercurial三昧の日々が嵩じて, いつの間にやら『入門Mercurial Linux/Windows対応』を上梓。凝り性なのが災いして,年がら年中アップアップな一介の実装屋。最近は仕事の縁が元で,OpenSolarisに入れ込む毎日。