mercurialのリポジトリの使い方
agenda
- 設定
- 個人利用(commit,log,revert)
- branchの利用(branchのmergeも服務)
- リモートリポジトリの作成
設定
.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もちょっとくせがある。