mercurialでコミットをまとめる方法

gitではできてたけど、mercurialでよくわからなかったので調べた。

目的としては、区切りのいいところで適当にコミットしたものを、pushする前にまとめて、ちゃんとしたコメットコメントをつけたい、といったところ。


histeditがよさそうだったので試してみる。

mercurialのバージョンは2.6.2

$ hg --version
Mercurial Distributed SCM (version 2.6.2)
(see http://mercurial.selenic.com for more information)

Copyright (C) 2005-2012 Matt Mackall and others
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.


~/.hgrcに設定

[extensions]
histedit = 


リポジトリはこのような状態を作成

$ hg glog --style=compact
@  5[tip]   402aa1b6e745   2013-08-19 21:16 +0900   brainstorm
|    add d.txt
|
o  4   261ba91ff77c   2013-08-19 21:16 +0900   brainstorm
|    add c.txt
|
o  3   c9e85b1d5b08   2013-08-19 21:16 +0900   brainstorm
|    add b.txt
|
o  2   b7d44126e998   2013-08-19 21:16 +0900   brainstorm
|    add a.txt
|
o  1   5a16139f8200   2013-08-19 21:16 +0900   brainstorm
|    create branch ticket9999
|
o  0   ef682b76f9f3   2013-08-19 21:16 +0900   brainstorm
     add README.txt


hg histedit 1を実行してみる
エディタが起動して、指定したリビジョンから昇順でtipまでコミットが表示される。

pick 5a16139f8200 1 create branch ticket9999
pick b7d44126e998 2 add a.txt
pick c9e85b1d5b08 3 add b.txt
pick 261ba91ff77c 4 add c.txt
pick 402aa1b6e745 5 add d.txt

# Edit history between 5a16139f8200 and 402aa1b6e745
#
# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  f, fold = use commit, but fold into previous commit (combines N and N-1)
#  d, drop = remove commit from history
#  m, mess = edit message without changing commit content
#


リビジョンの1-5までをひとつのコミットにしたい
2-5を全部foldにしてみる

pick 5a16139f8200 1 create branch ticket9999
f b7d44126e998 2 add a.txt
f c9e85b1d5b08 3 add b.txt
f 261ba91ff77c 4 add c.txt
f 402aa1b6e745 5 add d.txt

# Edit history between 5a16139f8200 and 402aa1b6e745
#
# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  f, fold = use commit, but fold into previous commit (combines N and N-1)
#  d, drop = remove commit from history
#  m, mess = edit message without changing commit content
#


保存すると以下の状態で再度エディタが開くのでコメントを適当に直して保存する。

create branch ticket9999
***
add a.txt



HG: Enter commit message.  Lines beginning with 'HG:' are removed.
HG: Leave message empty to abort commit.
HG: --
HG: user: Brainstorm <brainstorm@example.com>
HG: branch 'ticket9999'
HG: changed a.txt

するとfoldしたコミットの数だけ何度もエディタが開く。
今回の例の場合は4回開く。

2回目はこんな感じ。foldするコミット毎に、コミットコメントを修正するチャンスがある。
もともとのコミットコメントを見て、最終的なコミットコメントをちゃんと直せということか。

「***」とか、もともとのコミットコメント「add b.txt」は消さないと、そのまま使われるので注意

refs #9999 xxxx xxxx xxxx.
***
add b.txt



HG: Enter commit message.  Lines beginning with 'HG:' are removed.
HG: Leave message empty to abort commit.
HG: --
HG: user: Brainstorm <brainstorm@example.com>
HG: branch 'ticket9999'
HG: changed a.txt
HG: changed b.txt


エディタを全て保存すると終了。

ログを見るとコミットが一つになっていることがわかる

$ hg glog --style=compact
@  1[tip]   c752da0cffe9   2013-08-19 21:32 +0900   brainstorm
|    refs #9999 xxxx xxxx xxxx.
|
o  0   e3d6997f2419   2013-08-19 21:32 +0900   brainstorm
     add README.txt

HisteditExtension - Mercurial