Mercurial 版本管理工具的使用方法

Mercurial 的指令

Mercurial 的中文意思如下:

n. (名詞 noun)
1. [藥] 汞(製)劑

adj. (形容詞 adjective)
1. (含)汞(劑)的
2. 機敏的,富於機智的;輕鬆的,活潑的,快活地;易變的;反覆無常的
3. 水星的
4. [羅神] 莫丘利神(Mercury)的

因此,Mercurial 的主要指令就採用了水銀 (汞) 的化學式 hg,當您想在命令列中執行 Mercurial 的指令時,所有指令前面都必須使用 hg 這個指令,因為 Mercurial 的主要程式就是 hg.exe 這個執行檔,您可以在 c:\Program Files\Mercurial\ 這個資料夾中找到 Hg.exe 這個檔案。

Mercurial 的主要指令如下所示,您只要熟悉了這幾個就可以很方便的使用 Mercurial 進行版本管理了。

hg init: 建立新的儲藏庫 (repository)
hg commit: 儲存檔案到儲藏庫中
hg log: 看所有的 log 記錄
hg pull: 拉出某檔案 (與改變記錄) 後儲存到你的工作資料夾中。
hg push: 將你改變過的檔案與記錄存入到儲藏庫。
hg serve: 創建一個網站,讓大家可以存取你的儲藏庫。
hg merge: 進行版本合併,將兩個不同的版本合併在一起。
hg clone: 複製並建立一個新的專案。

Mercurial 實務操作

當您安裝完 Mercurial 之後,可以用不加參數的 hg 指令,查看指令的用法,如下所示。

D:\hg>hg
Mercurial Distributed SCM

basic commands:

 add        add the specified files on the next commit
 annotate   show changeset information by line for each file
 clone      make a copy of an existing repository
 commit     commit the specified files or all outstanding changes
 diff       diff repository (or selected files)
 export     dump the header and diffs for one or more changesets
 forget     forget the specified files on the next commit
 init       create a new repository in the given directory
 log        show revision history of entire repository or files
 merge      merge working directory with another revision
 pull       pull changes from the specified source
 push       push changes to the specified destination
 remove     remove the specified files on the next commit
 serve      start stand-alone webserver
 status     show changed files in the working directory
 summary    summarize working directory state
 update     update working directory (or switch revisions)

use "hg help" for the full list of commands or "hg -v" for details

hg version 指令可以查看 Mercurial 的版本。

D:\hg>hg version
Mercurial Distributed SCM (version 1.6.2)

Copyright (C) 2005-2010 Matt Mackall <mpm@selenic.com> 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.
D:\>md hg

D:\>cd hg

D:\hg>dir
 磁碟區 D 中的磁碟沒有標籤。
 磁碟區序號:  AC7E-23A4

 D:\hg 的目錄

2010/08/18  上午 10:22    <DIR>          .
2010/08/18  上午 10:22    <DIR>          ..
               0 個檔案               0 位元組
               2 個目錄   6,611,124,224 位元組可用

D:\hg>hg init ss0

D:\hg>dir
 磁碟區 D 中的磁碟沒有標籤。
 磁碟區序號:  AC7E-23A4

 D:\hg 的目錄

2010/08/18  上午 10:22    <DIR>          .
2010/08/18  上午 10:22    <DIR>          ..
2010/08/18  上午 10:22    <DIR>          ss0
               0 個檔案               0 位元組
               3 個目錄   6,611,124,224 位元組可用

...將 ss0 專案的所有檔案複製到 ss0 資料夾中...

D:\hg>cd ss0

D:\hg\ss0>hg add
adding Array.c
adding Array.h
...
adding test1.asm0
adding vm0.exe

但是,在剛安裝完後直接進行 commit 動作是會失敗的,在 Linux 下您必須設定 .hgrc 這個檔案,但在 Windows 下由於檔名的第一個字不能是 .,因此您必須改為設定 Mercurial.ini 這個檔案,方法是在 %HOME% 目錄下,或者 %USERPROFILE% 目錄下,建立一個 Mercurial.ini 檔案,然在該檔案中加入下列設定段落。

[ui]
username = firstname lastname <email>

其中 [ui] 是指 User interface controls 的意思,舉例而言,我所加入的設定段落為

[ui]
username = ccc kmit <ccc@kmit.edu.tw>

然後,您才能進行 commit 動作,其操作範例如下所示 (由於筆者第一次使用,因此嘗試了一些錯誤的情形,但是錯誤是最好的老師,我們在此將錯誤情形也列入。

D:\hg>hg commit
abort: There is no Mercurial repository here (.hg not found)!

D:\hg>cd ss0

D:\hg\ss0>hg commit
abort: empty commit message

D:\hg\ss0>
D:\hg\ss0>hg commit -m 'ss0_initial'

D:\hg\ss0>

如此,就完成了 commit 的動作了。

然而,當筆者按照教學文件 http://mercurial.selenic.com/wiki/TutorialClone 的指示,想要進行 clone 動作時,卻發生了失敗的情況,其操作狀況如下。

D:\hg\ss0>cd ..

D:\hg>hg clone http://www.selenic.com/repo/hello my-hello
abort: error: 連線嘗試失敗,因為連線對象有一段時間並未正確回應,或是連線建立失敗
,因為連線的主機無法回應。

據筆者推測,這個錯誤的原因應該是設定檔 Mercurial.ini 中沒有設定 proxy,於是參考 http://www.selenic.com/mercurial/hgrc.5.html#http-proxy 當中的說明,在 Mercurial.ini 當中加入下列段落。

[http_proxy]
host = proxy.internal:3128

結果就可以進行 clone 的動作了,執行情況如下。

D:\hg>hg clone http://www.selenic.com/repo/hello my-hello
requesting all changes
adding changesets
adding manifests
adding file changes
added 2 changesets with 2 changes to 2 files
updating to branch default
2 files updated, 0 files merged, 0 files removed, 0 files unresolved

D:\hg>cd my-hello

D:\hg\my-hello>dir
 磁碟區 D 中的磁碟沒有標籤。
 磁碟區序號:  AC7E-23A4

 D:\hg\my-hello 的目錄

2010/08/18  上午 11:42    <DIR>          .
2010/08/18  上午 11:42    <DIR>          ..
2010/08/18  上午 11:42    <DIR>          .hg
2010/08/18  上午 11:42               257 hello.c
2010/08/18  上午 11:42                11 Makefile
               2 個檔案             268 位元組
               3 個目錄   6,609,588,224 位元組可用

D:\hg\my-hello>hg parents
changeset:   1:82e55d328c8c
tag:         tip
user:        mpm@selenic.com
date:        Fri Aug 26 01:21:28 2005 -0700
summary:     Create a makefile
Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License