mercurialのリポジトリの使い方

agenda

  1. 設定
  2. 個人利用(commit,log,revert)
  3. branchの利用(branchのmergeも服務)
  4. リモートリポジトリの作成

設定

.hgignoreと.hg/hgrcなどがある。
.hgignoreには、リポジトリに含めないファイルの情報を書く。
(表記方法はglobパターン、正規表現と幾つかの種類がある)

リポジトリの情報は、.hg/以下に格納される。
また、.hg/hgrcにはリポジトリ固有の設定、~/.hgrcには共有の設定を書く。
とりあえず、ユーザ名だけでもしてしいて置くと良い。

注意

ユーザ名を設定していないとコミットできない。~/.hgrcに以下の設定を追加する。
(これに関しては、man hgに書いてある。あるいはhg help config)

[ui]
username = Firstname Lastname <firstname.lastname@example.net>
verbose = True

verboseも付けておいた方が慣れないうちは安心。(たぶん)

基本的な操作

保存のwork flow
mkdir WORK && cd WORK #workingでぃ列折
hg init # リポジトリの作成

## なにかファイルを作ってみる。
touch foo
hg status # これで現在の状況を汁ことができる>
# > ? foo # ? はuntrackedFileの意味

## reopositoryへのtracking
hg add foo # 面倒なら hg add .でも

hg commit -m "first commit"

これらを使うことで保存はできるようになる。以前の状態に戻りたい場合には、revertを使う(詳細を後述)

logの確認

hg logでlogを調べられる。--statで統計情報を調べられるので便利

hg log 
# > チェンジセット:   0:50224423fa05
# > ユーザ:           podhmo podhmo <foo@bar.net>
# > 日付:             Sat Feb 26 00:52:51 2011 +0900
# > 要約:             first commit

## なんかてきとうに処理を追加
echo "hello hello" >> foo
hg add .
hg commit -m "foo: insert message"

hg log -l 1 --stat
チェンジセット:   1:94d1ac62d746
タグ:             tip
ユーザ:           podhmo podhmo <foo@bar.net>
日付:             Sat Feb 26 00:54:58 2011 +0900
要約:             foo: insert message

 foo |  1 +
1 ファイル変更、追加 1(+)、削除 0(-)

--limitで表字数を制限。--statで統計情報が得られるので便利。

過去の状態にアクセスする。

中身を取り出すのはcat。リビジョン番号を指定すると良い。

hg cat foo #現在のリビジョンの内容
# > hello world

hg log -q ## ひとつ前のリビジョンは0
# 1:94d1ac62d746
# 0:50224423fa05

hg cat -r 0 foo
# > 

-rでリビジョンを指定すると良い。そうすると過去のリビジョンのファイルを取り出すことができる。

過去の状態に復旧

revertを使うと良い。(全部戻したければ-allを付加)

ls 
# > foo

rm foo #fooを消すとディレクトリの中身は空。
hg revert foo 

ls 
# > foo

branchの作成とmerge

現在のbranchはbranchで見れる。また、引数としてbranch名を与えると新しいbranchがtrackingされる.
(gitと異なり、branchの作成がtrackingされるだけで、commitしなければ実際には作成されない)
tagを打っておくとcommitの代わりになるのでtagを打っておくと良い。

hg branches
# > default                        1:94d1ac62d746

hg branch WORK
hg branches 
# > default                        1:94d1ac62d746

hg tip WORK #WORKというタグを打った。
hg branches
WORK                           2:e1658932b509
default                        1:94d1ac62d746 (inactive)

## 現在はWORK branchにいる。

cat foo
# > hello world

echo "this is WORK branch" >> foo
hg add . && hg commit -m -
cat foo
# > hello world
# > this is WORK branch

## 別のbranchへの切り替えはupdate
hg update defaults
cat foo
# >hello world
複数のbranch通しのmergeとconflictの解消

ここがかなりgitと異なる。gitと違いaddとresolveが綿密に分かれている。

## 意図的にconflictを発生させる。(また空の状態から)
hg init 
touch foo 
hg add . && hg commit -m -

hg branch WORK0 && hg tag branch-WORK0
hg update default
hg branch WORK1 && hg tag branch-WORK1

hg update WORK0
echo "foo bar" >> foo
hg add . && hg commit -m "foo: insert foo bar"

hg update WORK1
echo "bar bar" >> foo
hg add . && hg commit -m "foo: insert bar bar"

hg barnch
# > WORK1

cat foo
# > bar bar
hg cat -r WORK0 foo
# > foo bar

###mergeで confilict発生!!
hg merge WORK0 ## WORK1 にWORK0をmerge

#hg update WORK0
#hg merge WORK1 ## WORK0に WORK1をmerge

# > 0 files updated, 0 files merged, 0 files removed, 2 files unresolved
# >use 'hg resolve' to retry unresolved file merges or 'hg update -C' to abandon


### conflictの化しよう。
hg resolve --all 
hg resolve -l  # resolve -lはconflictしているファイルのlist

cat foo
# > <<<<<<< local
# > bar bar
# > =======
# > foo bar
# > >>>>>>> other

vi foo # conflict解消

hg resolve -m foo #こういうように解消したことを教える必要がある。
hg commit -m "MERGED"
remote repository

push,pullもちょっとくせがある。