其實這兩年,能夠采用mercurial的項目我都盡量用,甚至有些上游是git的,或者需要托管到公司內gitlab上與別人協作的,我都裝上hg-git。無它,只是因為mercurial易用性比git好得多——比如我一直記不清git reset[那么多神奇的功能](http://git-scm.com/2011/07/11/reset.html)
下面是幾個小技巧,可以讓易用性進一步改善
輸出自動自動分頁
hg log缺省會一口氣輸出所有commit記錄,這很可能不是你想要的,所以你不得不自己加pager: hg log | less。
另一個辦法是啟用pager這個擴展,實現跟git log一樣的行為:自動調用less顯示輸出(這樣也可以用上less的搜索功能了)
在 ~/.hgrc添加如下配置
[extensions]
pager =
[pager]
pager = less
然后hg log就會自動調用less來分頁了
補充說明:
hg diff,hg annotate等命令也會。詳細列表可用hg help pager查看[pager]attend設置的默認值,這個配置項決定了哪些命令的輸出會用pager。也可以通過在~/.hgrc中設置這個值,比如hg help命令默認就沒有啟用pager,所以可以修改為:
[pager]
attend = annotate, cat, diff, export, glog, log, qdiff, help
- 如果設置了環境變量
PAGER,則會優先采用環境變量指定的pager,忽略.hgrc的值 - 如果使用
less為pager的話,推薦設置為:
[pager]
pager = 'LESS=FRX' less
或者設置環境變量LESS='FRX'。less的選項-R是為了支持ansi color的(參看下面的color擴展說明),其它參數的具體含義可查看explainshell網站的解釋或者參看less的manpage
詳細說明: http://mercurial.selenic.com/wiki/PagerExtension
加點色彩
Color這個擴展 可以給hg status和hg diff的輸出加上顏色,使得輸出看起來更清楚。
啟用方法:編輯~/.hgrc
[extensions]
color =
效果圖:


詳細說明:http://mercurial.selenic.com/wiki/ColorExtension
查看分支/合並關系
如果你的hg庫里面有分支(有名或者匿名的),很難從hg log的輸出里看出關系來(從哪里分支的,在哪里合並的)。
方法一: 用hg serve在web瀏覽器上查看分支關系
hg比git好的一點是,如果你工作在一個沒有裝X window的服務器,沒法運行一些GUI的hg前端時,你可以簡單地用hg serve起一個web 服務,然后在瀏覽器查看。那里面可以看到分支關系(點擊左邊的Graph進入)

方法二: 用GraphLog擴展
另一個辦法更簡單:啟用graphlog extension,然后用hg glog命令查看。
啟用方法是編輯 ~/.hgrc:
[extensions]
graphlog =
hg glog的效果如下:

參考: Stay Sane with Graphlog / hg tip
為pull/push設置不同的遠端地址
我常用的一個操作是:在家里推送到bitbucket網站,到公司后從bitbucket網站將內容拉下來,推到公司內的一個Kallithea 實例上。
[paths]
default = http://bitbucket.org/bamanzi/misc-utils
rhodecode = http://rhodecode.example.com/yang.guilong/misc-utils
然后我用如下命令完成代碼的同步
hg pull -u
hg push rhodecode
其實hg支持對pull/push設置不同的地址 :
[paths]
default = http://bitbucket.org/bamanzi/misc-utils
default-push = http://rhodecode.example.com/yang.guilong/misc-utils
於是我可以簡單地執行下面的命令完成兩個庫的同步
hg pull -u
hg push
當然,采用這個技巧,只是少敲了幾個字符而已,不過至少可以少記憶一個別名。
用外部比較工具查看差異
很多時候我們想用其它工具來比較整個文件的前后差異(有的時候是因為不熟悉hg diff的輸出格式(阮一峰有篇博客文章讀懂diff講解得比較清楚),有的時候是前后差異的確有點復雜以至於diff的輸出不能正確反映代碼在邏輯上的差異)。
方法一
這種情況下DiffUse很值得推薦,它有個不錯的功能是能感知文件夾內的版本控制系統(比如mercurial, git, subversion...),並支持比較兩個revision的差異:
# compare revision 123 of foo.C and revision 321 of foo.C
diffuse -r 123 -r 321 foo.C
# display a 3-way merge between revision MERGE_HEAD of foo.C,
# the local foo.C file, and revision HEAD of foo.C
diffuse -r MERGE_HEAD foo.C foo.C -r HEAD foo.C
### 方法二:啟動ExtDiff擴展
[extensions]
hgext.extdiff =
[extdiff]
cmd.vimdiff = vimdiff
# add new command called vimdiff, runs gvimdiff with DirDiff plugin
#(see http://www.vim.org/scripts/script.php?script_id=102)
# Non english user, be sure to put "let g:DirDiffDynamicDiffText = 1" in
# your .vimrc
cmd.vimdiff2 = gvim
opts.vimdiff2 = -f '+next' '+execute "DirDiff" fnameescape(argv(0)) fnameescape(argv(1))'
# add new command called vdiff, runs kdiff3
cmd.vdiff = kdiff3
# add new command called ediff, runs emacs ediff
cmd.ediff = sh
opts.ediff = -c 'if [ -d $0 ]; then emacs --eval "(ediff-directories \"$0\" \"$1\" \"\")"; else emacs --eval "(ediff-files \"$0\" \"$1\")"; fi'
然后就可以用如下命令來對比文件了
hg vimdiff rope/base/fscommands.py
hg vimdiff2 -r 31 -r 32 rope/base/fscommands.py
hg ediff rope/base/fscommands.py
詳細說明: ExtDiffExtension
