バージョン管理のすゝめ ~その2
こんにちは、エンジニアの藤野です。
前回、システム開発の旅のお供としてバージョン管理「Mercurial」を軽くご紹介させていただきました。
バージョン管理のすゝめ ~その1(仮)
前回は概要のご紹介だけで終わってしまったので、
今回はもうちょっと詳しく使い方などをご紹介してみようと思います。
Mercurialの準備
Windows環境用には「TortoiseHg」というGUIのツールがありますので弊社では各自ローカルPCにこちらをインストールしています。
LinuxサーバやMac環境では「hg」コマンドで使用しています。
(Mac用にも一応「TortoiseHg」はあります。)
リポジトリの作成
まずは、作業したいディレクトリに「リポジトリ」(ファイルの原本と更新履歴を管理する「貯蔵庫」の意)を作成します。
TortoiseHgをインストールすると右クリックのメニューに「TortoiseHg」のコマンド群が追加されていますので、
リポジトリを作成したいフォルダで右クリックから[TortoiseHg]-[Create Repository Here]をクリックします。
確認用ポップアップが出ますので「作成」ボタンをクリックします。
その場に「.hg」というフォルダができましたでしょうか?
これにてMercurialを使用する準備は完了です。簡単ですね!
ちなみにLinuxサーバ内で直接Mercurialの準備をしたい場合は、
同様に作業したいディレクトリで
# hg init
コマンドを打つだけです。簡単ですよね!!
さて、「.hg」フォルダができましたらその場で再度右クリックから[Hg Workbench]というのをクリックしてみてください。
このような画面が開いて今後作業していくファイルのバージョン情報をグラフィカルに確認、作業していくことができます。
左サイドバーにはフォルダを作ったりしてリポジトリを一覧で管理することも可能です。
既存のリポジトリをコピー(クローン)する
さて、上記は新規にリポジトリを作成する場合をご紹介しましたが、
以下では既に作成されているリポジトリを使用する場合を ご紹介します。
複数人で作業を進める場合、上記のようにローカルPC上でリポジトリを作成しただけでは他の作業者とファイルを共有することが難しくなるためWeb上にリポジトリを作成します。
弊社ではテストサーバを作ってそこにリポジトリを作成し、
作業者はそこからリポジトリを「クローン」します。
(弊社ではこのHgリポジトリサーバに認証をかけています。)
Hgリポジトリサーバの立て方はここでは省略しますが、
今回仮にhttp://testhgserver.com/というドメインで立てたとします。
ブラウザでこのURLにアクセスすると以下のように作成されたリポジトリの一覧を見ることができます。
リポジトリをクローンしたいフォルダで右クリックから[TortoiseHg]-[Clone…]をクリックすると
下記のポップアップが出ます。
リポジトリサーバの/testディレクトリにリポジトリを作成した場合、
「ソース」の欄にクローンしたいリポジトリのURL(http://testhgserver.com/test)を入力して「クローン」ボタンをクリックします。
そうすると(サーバに認証をかけている場合には認証のフローが入って)サーバ上からソースファイル一式がダウンロードされます。
とても簡単ですね!!!
ちなみにLinuxサーバ内から直接リポジトリのクローンをしたい場合は、
同様に作業したいディレクトリで
# hg clone http://testhgserver.com/test
コマンドを打つだけです。とても簡単ですよね!!
ファイルの追加
さて、バージョン管理の準備ができましたので実際に作業に入っていきましょう。
先ほど作成したリポジトリ内に以下のようにファイル一式を作成したとします。
ここで先ほどの「Hg Workbench」の画面左上部にあります「現在のリポジトリを再読み込み」ボタンをクリックして、
リビジョン履歴の一覧の「★ 作業領域 ★」の行をクリックして選択状態にしますと下の部分に新たに追加したファイルがピンク色で表示されます。
コミット
ファイルの追加・修正・削除などの作業内容をリポジトリに作業履歴として記録することを「コミット」といいます。
先ほどピンクで表示された追加ファイルの左のチェックボックスにチェックを入れてファイルを追加します。
ファイル一覧の右の欄にコメントを記入して「コミット」ボタンを押してみましょう。
リビジョン履歴に「初めてのコミット」が追加されましたでしょうか?
これにてリビジョン番号0として作業内容が履歴として記録されました。
初回コミット時には「Mercurialにあなた自身の情報を入力してください」といったエラーが出る場合があるかも知れません。
そのポップアップの「OK」をクリックするとTortoiseHgの設定画面が開き(メニューの[ファイル]-[設定]からも開けます)
ユーザ設定で「ユーザ名」を入力してください。
ちなみにLinuxサーバ内から直接コミットをしたい場合は、
# hg add <特定のファイルのみ追加したい時はここにファイル名を追加>
でファイルを追加し、
# hg commit -m "初回のコミット" -u <ユーザ名>
でコミットできます。
プッシュ&プル
上記の「コミット」はあくまでローカルPC上で作業履歴を記録したにすぎません。
ひとりで開発するだけならそれでも十分なのですが、複数人で開発を進めている場合などは最初にクローンしてきたリポジトリ用サーバに変更を反映させないと他の作業者に変更を伝えることができません。
コミットした内容をサーバに送信することを「プッシュ」といいます。
Workbenchの右上部にあるこれらのボタンがその役割となります。
1番右のボタンがローカルのコミット内容をサーバへプッシュするボタンです。
右から2番目はプッシュする内容があるかどうか確認するためのボタンとなります。
また、プッシュとは逆に他のユーザが作業した内容をローカルに取り込むことを「プル」といいます。
こちらも同様に、左から2番目のボタンが サーバからプルするボタン、
1番左のボタンがプルする内容がサーバ上にあるかどうか確認するためのボタンとなります。
ちなみにLinuxサーバ内から直接push/pullをしたい場合は、
# hg push # hg pull -u ※「-u」オプション:プルした上でローカルの作業領域を更新
でOKです。
ファイルの更新・削除
さて、初回のコミット&プッシュの手順ができました。
さらに作業を進めていきましょう。
作業を進めていき、適度なところで一度作業履歴として記録しておきたいと思います。
Workbenchの左上部の「現在のリポジトリを再読み込み」ボタンをクリックしてみましょう。
ファイル一覧のエリアに、変更したファイルは青字で、削除したファイルは頭に「!」マークが付いた赤字で表示されます。
また、変更ファイルをクリックすると右のエリアに変更内容が、削除した行が赤字で、追加した行が緑字で表示されます。
削除したファイルはデフォルトで選択されていないので削除して問題ないものであれば左のチェックボックスにチェックを入れてください。
変更内容を確認して、問題なければコミット&プッシュをしましょう。
コミットの取り消し
作業を進めていくと、「あ~、今のコミットは取り消してこの修正まで含めてコミットし直したいな~」という時があるかも知れません。
その時にはメニューから[リポジトリ]-[元に戻す]をクリックしてください。
直前のコミットを取り消すことができます。
hgrcの設定
さて、ここでMercurialの動作設定について軽く触れておきます。
Mercurialの動作設定は.hgフォルダ内にある「hgrc」ファイルに記述します。
設定は膨大なパターンを 設定できるので詳細を知りたい方はこちらのページなどを参考にしていただければと思いますが、
普段よく使用しているものなどいくつかご紹介しておきます。
ユーザインタフェースに関する設定
[ui] username = s.fujino editor = C:\Program Files\Hidemaru\Hidemaru.exe merge = winmergeu
使用するユーザ名、テキストエディターとして「秀丸」、マージツールとして「WinMerge」などを設定しています。
「WinMerge」はご存知の方も多いかと思いますが、ファイルの差分を見比べたりマージしたりするのに手放せない超絶便利ツールです!!
認証に関する設定
弊社ではリポジトリサーバに認証をかけているので認証情報をここに設定しておきます。
ここに設定しておけば、push/pullの度に認証情報を聞かれなくてすみます。
[auth] foo.prefix = testhgserver.com ※例 foo.username = <USER> foo.password = <PASSWORD> foo.schemes = http
外部マージツールの設定
先ほどマージツールとして「WinMerge」を設定しましたのでこちらでその詳細を設定しておきます。
[merge-tools] winmergeu.executable = C:\Program Files\WinMerge\WinMergeU.exe winmergeu.priority= 1 winmergeu.checkchanged=True winmergeu.args= /e /ub /dl other /dr local $other $local $output winmergeu.gui=False
変更の衝突
さて、複数人で作業していると同じファイルを同じタイミングで作業していた、ということもよくあります。
そんな時こそ、このバージョン管理ツールの本領発揮です。
バージョン管理を使わずに各々サーバに同じファイルをアップロードしてしまうと
先に作業した人の努力がすべて水泡と化してしまう危険性があります。
バージョン管理ツールはそんな悲劇を未然に防いでくれるのです!!
さて、作業も一段落、自分の作業はコミットしたし、プッシュする前に誰か更新してないかプルしてみよう。。。
すると、、、
「!!!」
こんなポップアップが出てしまうことがあります。
では「OK」ボタンを押してみましょう。
はじめは訳がわかりませんが慣れると怖くありません。
まず、「衝突未解消」の欄に表示されているファイルをひとつクリックして選択状態にして、
右にある「Mercurialで解消」ボタンを押してみましょう。
同じファイルでも、特に影響のない箇所をそれぞれいじっていた場合には
Mercurialが自動でそれぞれの更新分を反映したかたちでマージしてくれます…!
Mercurialによる解消が成功した場合には選択したファイルは下の「衝突解消済み」欄に移動します。
ただ、どうしても全く同じ行を各々いじっていた場合などはさすがに自動判定による解消はできません。
ファイルが「衝突解消済み」に移動しない場合はその次の「ツールで解消」ボタンを押してみましょう。
ここで先ほどマージツールに「WinMerge」を設定したのでWinMergeが開きます。
左の「other」と書いてあるのがサーバからプルしてきた他の作業者が編集したファイル、
中央の「index.html.orig」と なっているのは自分が編集したファイルのバックアップです。
衝突した時点で自分のファイルは「.orig」の付いたファイルが出来てバックアップされます。
右の「local」が自分のローカルファイルとなりますので、最終的にここが正しい状態になるように
左の他の作業者が編集した内容を見ながら手動で取り込んでいきます。
ここでは先に他の作業者が
Add This Line2.
という1行を追加して、同時に自分が
Add This Line3.
という1行を追加したようです。
Add This Line2.
の行を残したいのであればコピーして右のlocalに取り込みましょう。
編集が終わったら保存してWinMergeを閉じます。
該当ファイルが「衝突解消済み」エリアに移動しましたでしょうか?
ちなみに「ローカルを使う」ボタンは他バージョンの更新を無視してローカルのファイルを使う、
「他バージョンを使う」はローカルの更新を無視して他バージョンのファイルを使うことになります。
上記のように、無事衝突を解消できたら先ほどバックアップ用の「.orig」ファイルが出来ていることがあります。
このファイルはもう 不要なので随時削除していきましょう。
枝分かれの解消
また、プルをした時などに「グラフ」欄の線が図のように枝分かれしてしまうことがあります。
この場合枝分かれした方の更新はローカルに反映されていませんので、
取り込みたいリビジョンの行をクリックして選択状態にし右クリックから「ローカルとマージ」をクリックしてください。
この際、やはり衝突が起こることがありますので上記の方法で衝突を解消してください。
ローカルを特定のリビジョンに戻す
作業をしているとある時点での状態に戻したい場合などあるかと思います。
その場合にもバージョン管理はとても便利です。
戻したいリビジョンで右クリックから「作業領域を更新」をクリックしてください。
ワンタッチでその時点の状態に戻すことができます。
これで更新後バグが見つかった時にもすぐ状態を戻すことができますね!
まとめ
以上、今回はMercurialの基本的な使い方をざっくり説明してみました。
まだまだ奥が深いのでさらに詳しいことはまた機会があれば。。
まだ使ったことがないという方は是非使ってみてはいかがですか?