Mercurialの使い方をわかりやすく解説!Gitとの特徴の違いを紹介!
大規模な開発プロジェクトやソフトウェア開発に欠かせないソースコード管理システムが多く存在します。
中でもよく使われているシステムがGitとMercurialです。
今回はMercurialでソースコード管理を行いたい開発者向けに、Mercurialの特徴と使い方やインストール、セットアップ方法をわかりやすく解説します。
Mercurialとは?
Mercurialは2005年に初版リリースされたクロスプラットフォームのバージョン管理システムソフトウェアのことです。
現在2020年時点では、5.3までリリースされています。
Mercurialのコマンドはhg
英語のMercuryが水銀を意味し、元素記号のhgから来ています。
この記事で説明されるMercurialのコマンドは、全てhgと表記します。
Mercurialリポジトリ
MercurialリポジトリはBitbucketからサポートを受けています。
そのため、Bitbucketが欠かせないMercurialリポジトリのシステムです。
Mercurialのリポジトリの中には、ストアと連動する作業ディレクトリが含まれています。
ストアの中にある、プロジェクトの履歴が含まれており、すべての作業ディレクトリと履歴のプライベートコピーと組んでいます。
プロジェクトのファイルのコピーや、リビジョン管理されているファイルが、作業のディレクトリに含まれています。
作業ディレクトリからのコミット
作業ディレクトリからストアにあるリビジョンにコミットを行い、コミットされたリビジョンが作業ディレクトリの親になります。
複数のファイルに関連付けされているチェンジセット
Mercurialにはプロジェクトの全体にあるリビジョンの単一のアトミックチェンジセットに、複数のファイルへの変更を関連付けています。
それぞれのリビジョンには番号があり、分散並列開発を許可しています。そのため、リビジョン番号はユーザー間で一致しない事があります。
また、Mercurialはそれぞれのリビジョンに、グローバルチェンジセットIDも割り当てています。チェンジセットのIDは40桁の16進数です。
Mercurialによる複製から更新まで
Mercurialは他の方リポジトリからファイルをコピーし、コミットを行い、更新することができます。
また、他の方と変更されたファイルを共有することができます。詳しくは「Mercurialの使い方」で説明します。
Mercurialの分散システム
Mercurialの分散システムは、完全に分散化されたシステムで、中央リポジトリの内部概念が存在しません。
そのため、ユーザーは変更したファイルを共有するための独自のトポロジを定義することができます。
MercurialとGitの違い
Mercurialは、クロスプラットフォームの分散型バージョン管理システムと述べましたが、Gitも分散型のソースコード管理システムです。
しかし、MercurialとGitには違いがあります。MercurialとGitの違いについて説明します。
Mercurialはマージの戻しが難しい
Gitでもマージの戻しは戻すことが難しいです。
もしもMercurialで間違ってしまったマージをプッシュしてしまった場合、相手から叱責されてしまう事があります。
Mercurialにはマージを戻すための操作コマンドがデフォルトで存在しないため、コミットをローカルで戻すための拡張コマンドが必要になります。
MercurialはGitと違って単純な機能
Mercurialは複雑で高機能のGitとは違い、単純なコマンドしか使いません。
実行するコマンドは、clone・up-C・commit・merge・diff・branch・pull・pushのみとなります。
Mercurialはブランチに対する更新のみで行えるコマンドのため、マージの戻しのコマンドが不明です。
故に、間違ってしまった場合の処置が難しいのです。
また、MercurialとGitの実行コマンド「pull」は使い勝手に違いがあります。
Gitはローカルに反映するまでのすべてを実行してくれるのに対し、Mercurialはリポジトリの情報を引き寄せるだけのみのコマンドです。
その後に実行するものがブランチの切り替えとローカルのクリーンから、ローカルの更新までといった手順になります。
Mercurialをインストールしてみよう
Mercurialのインストール方法は、PCの使用機種によって異なります。
Linux、MacOS X、その他のUnixはUnixInstall、WindowsはWindowsinstallの指示に従うようにしてください。
ここで説明されるMercurialは、リリース0.7以降のものです。インストールしたいMercurialのバージョンをご確認ください。
LinuxでのInstall
まずLinuxInstallを行う前に、前提条件があります。
PCのシステムに、Mercurialを実行するためのPythonがない場合は、バージョン2.4以降のPythonをインストールしてください。
その他にインストールしておくべきプログラムは、Python CヘッダーファイルやCコンパイラ、3-way MergeProgramです。
ドキュメントの前提条件として、インストールを行うMercurialのバージョンによって異なります。
Mercurialが1.3x以前の場合、AsciiDocとxmlto、Mercurialが1.4以降の場合、Docutilsが必要です。
前提条件が多いですが、Mercurialを実行するために必要なプログラムです。
実行予定のMercurialのバージョンとPythonのバージョンを確認した上で、インストールを行ってください。
LinuxInstallによるソースの展開を行うために、必要な最初のステップでは下記の通りに入力してください。
- $ tar xvzf mercurial- <ver> .tar.gz
- $ cd mercurial- <ver>
ユーザーごとでは、ホームディレクトリにインストールする場合、次の通り実行してください。
- $ make install-home
必要に応じて、PYTHON = / path / to / python2.4-or-newerを追加してください。入力しましたら、次のコマンドを実行してください。
- export PYHONPATH = $ {HOME} / lib / python
- export PATH = $ {HOME} / bin:$ PATH
一部の64bitシステムでは、PYHONPATHでのlibをlib64にする必要があります。それ以外はlibを使ってください。
これはホストの環境との競合を最小限にした方法です。
ISPによって、webサイトまたはアプリケーションを管理するために、Mercurial を使う場合の対策です。
システム全体のインストールを行う場合、root権限が必要になります。デフォルトの場合、Mercurialは/ usr / localにインストールされます。
使用しているシステムの一部では、PATH環境変数の調整が必要になる事があります。
- $ make install
- $ export PATH = $ {PATH}:/ usr / local / bin
Pythonが/ usr / localにない場合、Pythonのバージョンが2.5の時、PYTHONPATH環境変数調整方法は下記の通りとなります。
- $ export PYTHONPATH = / usr / local / lib / python2.5 / site-packages:$ {PYTHONPATH}
また、デフォルトのPythonのバージョンが2.4以前であれば、PYTHONのオプションを使います。
- $ make install PYTHON = / path / to / python2.4
またビルドディレクトリのインストールを行う時、Mercurialの開発版をMercurialソース配布先から直接実行したい時は、下記の通り実行してください。
- $ make local
最後にインストールできたかどうか、チェックを行います。次の表示であれば問題がありません。
もし「モジュールが見つかりません」といった問題があれば、PYTHONPATHの設定が正常にできていない可能性が高いです。
- $ hg debuginstall
- Checking encoding (UTF-8)…
- Checking extensions…
- Checking templates…
- Checking patch…
- Checking merge helper…
- Checking commit editor…
- Checking username…
- No problems detected
WindowsでのInstall
WindowsのソースからMercurialをインストールする場合、2つの方法があります。
パフォーマンスの向上のためにC拡張を使い、最適化バージョンをコンパイルする方法と、Pythonメソッドを使う方法です。
Pythonメソッドを使う方法では、Cコンパイラは必要ありません。この2つの方法どちらも、PythonとMercurialのソースが必要になります。
Pythonの公式ダウンロードサイトよりインストールしたいバージョンのPythonバイナリをダウンロードし、デフォルトのC:\ Python26にインストールしてください。
MercurialダウンロードサイトよりインストールしたいバージョンのMercurialソースをダウンロードし、C:\ Mercurial_srcに解凍してください。
Mercurialソースまでインストール完了している事を確認してください。
ここからはC拡張により、最適化されたバージョンを構築するための手順になります。
MinGWWindows用ダウンロードサイトよりインストールしたいバージョンのMinGWバイナリを書き込み可能のディレクトリへダウンロードします。
インストール先は、デフォルトのC:\ MinGWにしてください。
PATH envにC:\ MinGW \ binを追加してください。ファイル名が次の通りになります。
「C:\ Python26; bla bla bla; C:\ MinGW \ bin」です。
Windowsコマンドプロンプトを開き、dirをC:\ Mercurial_srcに変更し、次のコマンドを実行してください。
- python setup.py build –force -c mingw32
- python setup.py install –force –skip-build
ここまでが最適化されたバージョンを構築するための方法です。
Pythonメソッドの代替を構築する場合は、Mercurialソースまでインストール完了できていることを確認します。
確認ができましたら、WindowsコマンドプロンプトでdirをC:\ Mercurial_srcに変更し、次のコマンドを実行してください。
- C:\ Python26 \ python.exe setup.py –pure build_py -c -d build_ext -i build_mo –force
- C:\ Python26 \ python.exe setup.py –pure install –force
すべての作業が終わりましたら、セットアップ環境構成を行ってください。
KDiff3のダウンロードサイトよりインストールしたいバージョンのKDiff3をダウンロードします。デフォルトのC:\ Program Files \ KDiff3にインストールしてください。
- PATH envにC:\ Program Files \ KDiff3を追加。
- メモ帳でMercurial構成ファイルを作成します。
「C:\ Documents and Settings \ [your_name] \ Mercurial.ini」または「C:\ Users \ [your_name] \ Mercurial.ini」に作成してください。
構成ファイルの内容は下記の通り入力してください。
- [ui]
- editor = Notepad
- username = your_name <your_email_address>
- [merge-tools]
- kdiff3.priority=-1
- kdiff3.args=–L1 base –L2 local –L3 other $base $local $other -o $output
- kdiff3.regkey=Software\KDiff3
- kdiff3.regappend=\kdiff3.exe
- kdiff3.fixeol=True
- kdiff3.gui=True
最後に、C:\ Python26 \ Scripts \ hgからC:\ Python26 \ hg.pyにコピーしてください。
ここまで作業しましたら、Mercurialを実行する際のhg.pyが呼び出せるかどうかを確認しましょう。
もし表示されないのであれば、インストールされたMercurialに異常があります。
Windowsの場合、コマンドの検索パスが更新されていない事がありますので再起動してください。
Mercurialのインストール作業が完了しましたら、MercurialがWindowsコマンドプロンプトで正常に表示されるかどうかを確認しましょう。
Windowsコマンドプロンプトでhgと入力すれば、コマンドのサマリーが表示されます。
- $ hg
- Mercurial Distributed SCM
- basic commands (use “hg help” for the full list or option “-v” for details):
- add add the specified files on the next commit
- annotate show changeset information per file line
- clone make a copy of an existing repository
- (…)
Mercurialのどのバージョンが実行されるかどうかを確認するには、Windowsコマンドプロンプトで次の通り入力してください。
- $ hg version
- Mercurial Distributed SCM (version 0.7)
- Copyright (C) 2005 Matt Mackall <mpm@selenic.com>
- This is free software; see the source for copying conditions. There is NO
- warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
ここまで全ての作業を終え、インストールが完全にできていることが確認されたら、インストール作業は終了です。
Mercurialの使い方
Mercurialのインストールができたら、Mercurialを使うための作業を行います。ここではMercurialの使い方や作業方法について説明します。
それぞれのコマンドの使用用途
Mercurialで主によく使われるコマンドの説明です。
Clone
任意のホストのリポジトリからファイルを複製する時に使われるコマンドです。
commit
リポジトリの変更をコミットする時に使われます。
merge
再び任意のホストのリポジトリと共有したい時に行うコマンドです。
pull
任意のホストのリポジトリから取得したい時に使うコマンド。
リポジトリの初期化
まずはリポジトリの初期化を行います。Mercurialでは、リポジトリ内で全ての作業を行うのです。
書き込み権限のある作業ディレクトリにリポジトリを作成しましょう。
リポジトリを初期化する事で.hgサブディレクトリが作成され、いくつかのファイルがリポジトリに追加されます。
リポジトリの初期化を行う時、initというコマンドを使います。
まず、ファイルシステムに、「hello、world」リポジトリを初期化してください。
- (telephoto: /tmp) mkdir repo
- (telephoto: /tmp) cd repo
- /tmp/repo
- (telephoto: /tmp/repo) ls
- (telephoto: /tmp/repo) hg init
初期化後、新しく作成されたリポジトリに.hgディレクトリがあります。
- (telephoto: /tmp/repo) ls -a
- ./ ../ .hg/
いくつかのファイルをMercurialに追加を行えるようになります。
Mercurialは「hg add」を使い、ファイルバージョン管理下に置くことが可能です。
- (telephoto: /tmp/repo) touch hello.txt
- (telephoto: /tmp/repo) ls
- hello.txt
- (telephoto: /tmp/repo) ls -a
- ./ ../ hello.txt .hg/
- (telephoto: /tmp/repo) hg add hello.txt
いくつかのファイルをMercurialに追加した後、全てのファイルをコミットしてください。
- (telephoto: /tmp/repo) hg commit -m “adding initial version of hello.txt”
- (telephoto: /tmp/repo) ls -a
- ./ ../ hello.txt .hg/
- (telephoto: /tmp/repo)
コミットされた全てのファイルは、リポジトリに保存されます。
既存のリポジトリを複製することが可能
「clone」というコマンドを使用し、既存のいくつかのファイルと履歴が含まれたリポジトリを使い、複製します。
リポジトリのクローンが作成され、別のリポジトリからコピーを作成し、ローカルにあるプライベートリポジトリを使えるようにするのです。
まず、任意のホストにある「hello、world」のリポジトリをクローンします。
- $ hg clone 任意のホスト先 my-hello
クローンが作成できたかどうかは、cloneコマンドで表示されるもので確認してください。
- requesting all changes
- adding changesets
- adding manifests
- adding file changes
- added 2 changesets with 2 changes to 2 files
- updating to branch default
- 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
クローンで作成されたものは、複製を行った現在のディレクトリにあります。
- $ ls
- 任意のホストファイル名
任意のホストのディレクトリ内には、Mercurialのプライベートデータが入っています。
- $ ls -a
- . .. .hg Makefile hello.c
全てのファイルは、クローンしたリポジトリのデフォルトブランチにあるリビジョンからのファイルが、正確にコピーされたものです。
hg cloneのデフォルトは、リポジトリのデフォルトブランチの最新リビジョンを、リポジトリの作業ディレクトリにチェックアウトされます。
現在、チェックアウトされたリビジョンを確認するコマンドは「summary」を使います。
- $ cd 任意のホストファイル名
- $ hg summary
- parent: 1:任意のファイル名 tip
- Create a makefile
- branch: default
- commit: (clean)
- update: (current)
リポジトリ履歴の調査を行う方法
リポジトリの複製が終わり、正確にコピーできたことを確認した後、複製されたリポジトリの履歴を調べましょう。
調査するのに必要なコマンドは「log」です。リポジトリの過去の履歴から、最新の履歴がまとめられたものを見ることができます。
- $ hg log
- changeset: 1:任意のセット
- tag: tip
- user: 任意のメールアドレス
- date: Fri Aug 26 01:20:50 2005 -0700
- summary: Create a makefile
- changeset: 0:任意のセット
- user: 任意のメールアドレス
- date: Fri Aug 26 01:20:50 2005 -0700
- summary: Create a standard “hello, world” program
その他に詳細の履歴情報を引き出すには、グローバルオプションで出力してみましょう。
- $ hg log -v
- changeset: 1:任意のセット
- tag: tip
- user: 任意のメールアドレス
- date: Fri Aug 26 01:21:28 2005 -0700
- files: Makefile
- description:
- Create a makefile
- (…)
- $ hg log –debug
- changeset: 1:任意のセット
- tag: tip
- parent: 0:任意のファイル
- parent: -1:任意のファイル
- manifest: 1:任意のマニフェスト
- user: 任意のメールアドレス
- date: Fri Aug 26 01:21:28 2005 -0700
- files+: Makefile
- extra: branch=default
- description:
- Create a makefile
- (…)
Mercurialでの最初の変更を行う方法
クローンで作成されたリポジトリに変更を行い、リポジトリの作業ディレクトリに移動します。
- $ cd 任意のファイル
- $ vi hello.c
よく使われるエディタを起動し、hello.cのソースコードを変更してください。
- Toggle line numbers
- /*
- * 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の編集を行い、追加の出力を入力します。
- Toggle line numbers
- (…)
- int main(int argc, char **argv)
- {
- printf(“hello, world!\n”);
- printf(“sure am glad I’m using Mercurial!\n”);
- return 0;
- }
これでソースコードの変更は完了できたので、エディタを終了します。
変更セットの作成を行う時は「commit」というコマンドを使い、実行しましょう。
- $ hg ci
エディタが起動され、いくつかのテキストが表示されます。
- HG: Enter commit message. Lines beginning with ‘HG:’ are removed.
- HG: —
- HG: user: 任意のメールアドレス
- HG: branch ‘default’
- HG: changed hello.c
変更セットをコミットするために、次の入力をしてみましょう。
- Express great joy at existence of Mercurial
- HG: Enter commit message. Lines beginning with ‘HG:’ are removed.
- HG: —
- HG: 任意のメールアドレス
- HG: branch ‘default’
- HG: changed hello.c
入力が終わったらテキストを保存し、エディタを終了してください。問題がなければ、commitコマンドは終了します。
リポジトリの作業ディレクトリには、2つの親が存在し、このような表示になります。
- $ hg par
- changeset: 2:任意のセット
- tag: tip
- user: 任意のメールアドレス
- date: Mon May 05 01:20:46 2008 +0200
- summary: Express great joy at existence of Mercurial
変更されたファイルを他の方と共有できる
コミットを行った後ファイルにエクスポートし、任意の変更ファイルを電子メールで添付ファイルとして、他の方にメールで送ることが可能です。
変更したものをエクスポートするには、「export」というコマンドを使います。
エクスポートには、タグ、リビジョン番号もしくはチェンジセットIDをMercurialに提供しなくてはなりません。
リポジトリの作業ディレクトリから、任意のtipファイルをエクスポートしてください。
- $ hg export tip
- # HG changeset patch
- # User 任意のメールアドレス
- # Date 1209943246 -7200
- # Node ID 任意のID番号
- # Parent 任意の親
- Express great joy at existence of Mercurial
- diff -r 任意のコード -r 任意のコード hello.c
- — a/hello.c Fri Aug 26 01:21:28 2005 -0700
- +++ b/hello.c Mon May 05 01:20:46 2008 +0200
- @@ -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;
- }
このファイルは総合diff形式のパッチファイルです。そのため、Mercurialにインポートする方法を教える追加情報が入っています。
変更されたものをマージする方法
マージする時に、前述したクローンする方法で任意のホストのリポジトリを再度クローンします。
- $ cd ..
- $ hg clone 任意のリポジトリ
- updating working directory
- 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
提供された任意のリポジトリのコメント欄に説明を入力します。
- $ cd 任意のファイル名
- $ vi hello.c
2行目の部分を変更します。
- * hello.c
その後に「- hello, world」を追加してください。
- * hello.c – hello, world
入力が終わったら、保存します。変更をコミットし、任意のホストのリポジトリからプルします。
- $ hg pull ../任意のファイル
- pulling from ../任意のファイル
- searching for changes
- adding changesets
- adding manifests
- adding file changes
- added 1 changesets with 1 changes to 1 files (+1 heads)
- (run ‘hg heads’ to see heads, ‘hg merge’ to merge)
マージを行う前に、どのチェンジセットに同期しているかを「parents」というコマンドを使って確認しましょう。
- $ hg parents
- changeset: 2:任意のセット
- user: 任意のメールアドレス
- date: Tue May 06 20:10:35 2008 +0200
- summary: Add description of hello.c
同期されていることが確認できたら、マージを行います。
- $ hg merge
- merging hello.c
- 0 files updated, 1 files merged, 0 files removed, 0 files unresolved
- (branch merge, don’t forget to commit)
マージするファイルをコミットします。マージ作業を完了させるには、ローカル変更をコミットすることを忘れないようにしてください。
マージされたものは、リポジトリのストアにマージチェンジセットとして保存されています。
このマージを確認するには、hg log –graphを使ってください。
- $ hg log –graph
- @ changeset: 4:任意のセット
- |\ tag: tip
- | | parent: 2:任意の親
- | | parent: 3:任意の親
- | | user: 任意のメールアドレス
- | | date: Tue May 06 23:44:19 2008 +0200
- | | summary: Merged changes from 任意のホスト名
- | |
- | o changeset: 3:任意のセット
- | | parent: 1:任意の親
- | | user: 任意のメールアドレス
- | | date: Mon May 05 01:20:46 2008 +0200
- | | summary: Express great joy at existence of Mercurial
- | |
- o | changeset: 2:任意のセット
- |/ user: 任意のメールアドレス
- | date: Tue May 06 20:10:35 2008 +0200
- | summary: Add description of hello.c
- |
- o changeset: 1:任意のセット
- | user: 任意のメールアドレス
- | date: Fri Aug 26 01:21:28 2005 -0700
- | summary: Create a makefile
- |
- o changeset: 0:任意のセット
- user: 任意のメールアドレス
- date: Fri Aug 26 01:20:50 2005 -0700
- summary: Create a standard “hello, world” program
これでマージの確認は終了です。Mercurialの使い方は以上となります。
Mercurialを使ってみよう
現在の分散型バージョン管理システムには、BitKeeper、GNU arch、DarcsをはじめにGit、Mercurial、Bazaar、Fossilなどがあります。
その中でもMercurialは常に様々な機能を取り入れ、更新を続けています。
Gitは現代の代表的なバージョン管理システムになっていますが、Mercurialも優秀なシステムです。
サーバも必要がありませんので、他の方と共有したい時に使える共同開発環境といえます。
共同開発環境に、Mercurialを使ってみてはいかがでしょうか。
また、Bitbucketは2020年6月にMercurialのサポートが終了しました。
Mercurialを使う時はご注意ください。
以降もMercurialリポジトリシステムを継続する場合、Mercurial公式が提供する無料または、有料のホスティングサービスをご利用ください。
toiroフリーランスは、SHIFTグループがプライムとして参画している独自案件をフリーランスエンジニア向けに紹介する唯一のプラットフォームサービスです。
エージェントによるサポートもありますので、ご利用を検討してみてはいかがでしょうか。