Mercurial チートシート

Table of Contents

1 はじめに

mercurialのチートシートがgithubに上がっていることに疑問を覚えないこと。

2 Mercurialとは

TODO:

3 最初の設定

3.1 設定ファイルの場所

WindowsLinux/MacOSX/Cygwin
%USERPROFILE%\Mercurial.ini$HOME/.hgrc

3.2 ユーザ名の設定

設定ファイルに次の項目を追加します。

[ui]
username=Takumi IINO <takumi@timedia.co.jp>

4 helpの参照

4.1 help(hg help)

% hg help

4.2 サブコマンドのhelp(hg help [COMMAND])

% hg help [コマンド]
% hg help help           # helpのhelpを表示

4.3 グローバルオプションを表示

hgのオプションに-vを追加する

% hg -v help log

5 リポジトリを用意する

5.1 リポジトリの新規作成(hg init)

% mkdir hello
% cd hello
% hg init

5.2 リポジトリのクローン(hg clone)

% hg clone http://selenic.com/hg mercurial-repo
requesting all changes
adding changesets
adding manifests
adding file changes
added 13537 changesets with 26617 changes to 1971 files
updating to branch default
872 files updated, 0 files merged, 0 files removed, 0 files unresolved
$

6 確認を行う

6.1 コミットログを確認する(hg log)

% hg log       # 全てのログを表示
% hg log -l 10 # 最新10個のログを表示
% hg log -l 10 --branch default # ブランチを指定してログを表示

6.2 サマリー(hg summary)

% hg summary
parent: 13536:fac040b7e822 tip
 merge: drop resolve state for mergers with identical contents (issue2680)
branch: default
commit: (clean)
update: (current)
%

6.3 現在のリビジョン(hg parents)

% hg parents
changeset:   13536:fac040b7e822
tag:         tip
user:        Matt Mackall <mpm@selenic.com>
date:        Sat Mar 05 16:34:59 2011 -0600
summary:     merge: drop resolve state for mergers with identical contents (issue2680)

%

6.4 最新のリビジョン(hg tip)

% hg tip
changeset:   13536:fac040b7e822
tag:         tip
user:        Matt Mackall <mpm@selenic.com>
date:        Sat Mar 05 16:34:59 2011 -0600
summary:     merge: drop resolve state for mergers with identical contents (issue2680)

%

6.5 現在のブランチ(hg branch)

% hg branch
default
%

6.6 ブランチの一覧とブランチ毎の最新のリビジョン(hg branches)

% hg branches
default                    13536:fac040b7e822
stable                     13534:4ec34de8bbb1 (inactive)
%

7 移動を行う

7.1 指定したリビジョンに移動(hg update [REV])

% hg update [リビジョン]
% hg parent --template "{rev}\n"
13536
% hg update 13524 # リビジョン 13520に移動
10 files updated, 0 files merged, 0 files removed, 0 files unresolved
% hg parent --template "{rev}\n"
13524
%

7.2 最新のリビジョンに移動(hg update)

% hg update
% hg parent --template "{rev}\n"
13524
% hg update # 最新のリビジョンに移動
10 files updated, 0 files merged, 0 files removed, 0 files unresolved
% hg parent --template "{rev}\n"
13536
%

7.3 ブランチの移動(hg update [BRANCH])

% hg update [ブランチ名]
% hg branch
default
% hg update stable
22 files updated, 0 files merged, 0 files removed, 0 files unresolved
% hg branch
stable

8 ファイルの操作

操作のための新しいリポジトリを作りましょう

% mkdir hello-repo
% cd hello-repo
% hg init

8.1 ファイルを追加する(hg add)

% echo 'puts "Hello, mercurial."' > hello.rb
% hg add hello.rb
%

8.2 コミットする(hg commit)

% hg tip
changeset:   -1:000000000000
tag:         tip
user:
date:        Thu Jan 01 00:00:00 1970 +0000

% hg commit -m "add hello.rb"
% hg tip
changeset:   0:c0d1b673238b
tag:         tip
user:        Takumi IINO <takumi@timedia.co.jp>
date:        Sun Mar 06 22:27:01 2011 +0900
summary:     add hello.rb

%

8.3 変更を確認する(hg diff)

% sed -i -e s/m/M/ hello.rb
% hg diff
diff -r c0d1b673238b hello.rb
--- a/hello.rb  Sun Mar 06 22:27:01 2011 +0900
+++ b/hello.rb  Sun Mar 06 22:34:35 2011 +0900
@@ -1,1 +1,1 @@
p-puts "Hello, mercurial."
+puts "Hello, Mercurial."
% echo 'print "Hello, Mercurial.\n";' > hello.pl
% hg add hello.pl
% hg diff
diff -r c0d1b673238b hello.pl
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/hello.pl  Sun Mar 06 22:36:56 2011 +0900
@@ -0,0 +1,1 @@
+print "Hello, Mercurial.\n";
%

8.4 変更されたファイル一覧(hg status)

% hg status
M hello.rb
A hello.pl
%

8.5 変更を取り消す(hg revert)

% hg revert hello.pl
% hg status
M hello.rb
? hello.pl
%
% hg add hello.pl # またaddしておこう

8.6 コミットを取り消す(hg rollback)

% hg commit -m "add perl sample" # 二つの変更をコミットしてしまった
% hg diff -c 1
diff -r c0d1b673238b -r 30b4e1e501a3 hello.pl
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/hello.pl  Sun Mar 06 22:42:41 2011 +0900
@@ -0,0 +1,1 @@
+print "Hello, Mercurial.\n";
diff -r c0d1b673238b -r 30b4e1e501a3 hello.rb
--- a/hello.rb  Sun Mar 06 22:27:01 2011 +0900
+++ b/hello.rb  Sun Mar 06 22:42:41 2011 +0900
@@ -1,1 +1,1 @@
-puts "Hello, mercurial."
+puts "Hello, Mercurial."
%
% hg rollback
repository tip rolled back to revision 0 (undo commit)
working directory now based on revision 0
%
% hg commit -m "camelize" hello.rb
% hg commit -m "add perl sample"
%

最新のコミットのみrollback可能

% hg log --template "{rev}:{node}: {desc}\n"
2:c0266fae871b5783d4f4a50faf0694d41df01418: add perl sample
1:f491ca2a61140034ed906d7d45893838493246c8: camelize
0:c0d1b673238bd257f79a7c2779f1e0d8e24d3524: add hello.rb
%
% hg rollback
repository tip rolled back to revision 1 (undo commit)
working directory now based on revision 1
%
% hg rollback
no rollback information available
%
% hg log --template "{rev}:{node}: {desc}\n"
1:f491ca2a61140034ed906d7d45893838493246c8: camelize
0:c0d1b673238bd257f79a7c2779f1e0d8e24d3524: add hello.rb
%
% hg commit -m "add perl sample"
% hg log --template "{rev}:{node}: {desc}\n"
2:c0266fae871b5783d4f4a50faf0694d41df01418: add perl sample
1:f491ca2a61140034ed906d7d45893838493246c8: camelize
0:c0d1b673238bd257f79a7c2779f1e0d8e24d3524: add hello.rb
%

9 multiple headsに関わる操作

multiple headsとは名前無しブランチが複数ある状態の事である。

9.1 multiple headsを作る(hg update [REV] & hg commit)

% hg log --template "{rev}:{node}: {desc}\n"
2:c0266fae871b5783d4f4a50faf0694d41df01418: add perl sample
1:f491ca2a61140034ed906d7d45893838493246c8: camelize
0:c0d1b673238bd257f79a7c2779f1e0d8e24d3524: add hello.rb
%
% # 一つ前に戻る
% hg update 1
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
% hg parents --template "{rev}:{node}\n"
1:f491ca2a61140034ed906d7d45893838493246c8
%
% # 二つ目のheadsを作る
% echo 'print "Hello, Mercurial."' > hello.py
% hg add hello.py
% hg commit -m "add python sample"
created new head
%

9.2 multiple headsの確認(hg heads)

% hg heads
changeset:   3:980f8866917a
tag:         tip
parent:      1:f491ca2a6114
user:        Takumi IINO <takumi@timedia.co.jp>
date:        Mon Mar 07 00:10:18 2011 +0900
summary:     add python sample

changeset:   2:46f0166b17d8
user:        Takumi IINO <takumi@timedia.co.jp>
date:        Sun Mar 06 22:53:57 2011 +0900
summary:     add perl sample

%

9.3 2つのmultiple headsの統合(hg merge)

% hg merge
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
% hg status
M hello.pl
%
% # この状態でparentsを確認すると二つあることがわかる。
% hg parents --template "{rev}:{node}\n"
3:980f8866917a1098d08f1e1b85dc396fecbc83ad
2:46f0166b17d886637c30e6f486b23043be56b22e
%
% hg commit -m "merge changeset: 2:46f0166b17d8"
% hg heads
changeset:   4:4b83e608a7d0
tag:         tip
parent:      3:980f8866917a
parent:      2:46f0166b17d8
user:        Takumi IINO <takumi@timedia.co.jp>
date:        Mon Mar 07 00:17:50 2011 +0900
summary:     merge changeset: 2:46f0166b17d8

% ls
hello.pl  hello.py  hello.rb
%

9.4 3つのmultiple headsの統合(hg merge -r [REV])

9.4.1 3つheadの作成

% # 二つ目のheadを作る
% hg update 3
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
% echo '(display "Hello, Mercurial.")(newline)' > hello.scm
% hg add hello.scm
% hg commit -m "add scheme sample"
created new head
%
% # 三つ目のheadを作る
% hg update 3
0 files updated, 0 files merged, 1 files removed, 0 files unresolved
% echo '(princ (format nil "Hello, Mercurial.~%"))' > hello.cl
% hg add hello.cl
% hg commit -m "add common lisp sample"
created new head
%
% hg heads
changeset:   6:6a0eac3064c9
tag:         tip
parent:      3:980f8866917a
user:        Takumi IINO <takumi@timedia.co.jp>
date:        Mon Mar 07 00:34:33 2011 +0900
summary:     add common lisp sample

changeset:   5:bcb5dec879f9
parent:      3:980f8866917a
user:        Takumi IINO <takumi@timedia.co.jp>
date:        Mon Mar 07 00:22:44 2011 +0900
summary:     add scheme sample

changeset:   4:4b83e608a7d0
parent:      3:980f8866917a
parent:      2:46f0166b17d8
user:        Takumi IINO <takumi@timedia.co.jp>
date:        Mon Mar 07 00:17:50 2011 +0900
summary:     merge changeset: 2:46f0166b17d8

%

9.4.2 統合

単純なmergeは失敗する

% hg merge
abort: branch 'default' has 3 heads - please merge with an explicit rev
(run 'hg heads .' to see heads)

リビジョンを指定してmergeを行う

% hg parents --template "{rev}:{node}\n"
6:6a0eac3064c9543384538a5f3ce8e28ad21f5db1
%
% # 一つ目のmerge
% hg merge -r 4
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
%
% # いっぺんに複数のマージは行えない
% hg merge -r 5
abort: outstanding uncommitted merges
%
% # 一つ目をコミット
% hg commit -m "Merged changes"
%
% # 二つ目のmergeとコミット
% hg merge -r 5
1 files updated, 0 files merged, 0 files removed, 0 files unresolved
(branch merge, don't forget to commit)
% hg commit -m "Merged changes"
%
% # headの統合が完了
% hg heads
changeset:   8:48d139b4230f
tag:         tip
parent:      7:89f3c6e6d974
parent:      5:bcb5dec879f9
user:        Takumi IINO <takumi@timedia.co.jp>
date:        Mon Mar 07 00:47:37 2011 +0900
summary:     Merged changes

%

9.5 衝突の解決(hg resolve)

9.5.1 衝突するシュチュエーション

9.5.2 衝突の発生

9.5.3 衝突の解決

10 ブランチの操作

10.1 ブランチの作成(hg branch [NAME])

10.2 "別のブランチ"の変更の取り込み(hg merge)

10.3 "別のリポジトリの同じブランチ"の変更の取り込み(hg pull -U)

10.4 "別のリポジトリの同じブランチ"へ変更の送信(hg push)

10.5 ブランチを閉じる(hg commit –close-branch)

11 タグの操作

11.1 タグをつける(hg tag)

12 用語

tip
最新のリビジョンの事
defaultブランチ
svnのtrunk、gitのmasterの事
multiple heads
名前無しブランチが複数できている状態の事

13 参考文献

Author: Takumi IINO (troter) <takumi@timedia.co.jp> <trot.thunder@gmail.com>

Date: 2011-03-07 12:43:02

HTML generated by org-mode 6.33x in emacs 23