mercurial簡單使用說明
開始
這份文件是紀錄了mercurial 一些指令的簡單說明.幫助工程師可以簡單的上手使用mercurial.我們假設看文件的人已經有了一點點版本控制系統的概念
- 安裝:想要在windows作業系統安裝mercurial ,可以前往mercurial 的官方下載網頁http://mercurial.selenic.com/downloads/ 下載最新版本的mercurial for windows.下載的檔案是標準的windows 安裝檔(.msi),雙擊下載檔案便可step by step 安裝mercurial.
想要在*unix 系統安裝mercurial , 請聯絡系統管理員安裝mercurial.如果是debian and ubuntu ,可以用APT安裝
#apt-get install mercurial
如果是RedHat, fedora,CentOS,則可以用
#yum install mercurial
目前還有更方便的mercurial GUI工具:TortoiseHg . TortoiseHg提供GUI化的操作,直覺化的滑鼠右鍵選單.不過這份文件主要還是以說明命令列式的操作為主
- 新開始一個版本控制專案:
假設在E:\Project\code\中我們有一個a.c.那麼我們需要下指令以新增一個受mercurial 管理的專案.指令如下 :
hg init
指令完成後,/Project/code/目錄下 多了一個目錄 ".hg".這個.hg就是檔案庫 (Repository ).裡面放置了mercurial 管理版本控制的任何資料,像是目前狀態,版本號, 更新紀錄,所有的分支,所有的合併紀錄等.原來的E:\Project\code\則稱為工作複本(work copy).任何時候,寫程式的人都是在修改工作副本的檔案.
目前檔案庫裡是空的
- 開發者的身份:
首先要設定開發者的身份.身份資料會在mercurial 更新檔案庫時被紀錄.用途是紀錄異動是由誰提交的.所以身份資料至關重要.沒有人希望在查詢某年某個修改時卻不知道元兇是誰.在*unix 環境如果不紀錄身份,Mercurial 會使用目前登入這個shell的user 作為身份.如果在windows 環境,沒有紀錄身份則不准提交異動.
要設定身份得要前往檔案庫目錄(這邊的例子是 E:\Project\code\.hg).在檔案庫目錄新增一個hgrc檔案,新增如下內容
[ui]
username = your_name
然後存檔,就可以了
- 新增/刪除檔案:指明要加入mercurial 管理的檔案,指令如下
hg add [檔名]
指明要從檔案庫移除的檔案,指令如下
hg remove [檔名]
如果只想把xx.c納入管理,可以用 hg add xx.c ,如果想把所有目錄下的檔案納入管理,可以使用 hg add * 或 hg add 就可以了.刪除檔案也是一樣的.然後,使用新增/刪除指令只是打個標記,檔案庫裡的資料庫沒有被更動,所以請記得接著下 hg commit 指令上傳異動. - 提交:
專案往前進到一個段落後,可以通知mercurial 把工作複本中的異動記錄到檔案庫,這個動作,叫做提交(commit).指令如下
hg commit
mercurial 會開啟文字編輯器,你必須輸入此次修改的備忘.然後存檔,關閉文字編輯器.不過,也可以使用較方便的方法,直接在指令列寫明修改的原因,指令如下
hg commit -m "備忘文字"
這樣mercurial 就不會開啟文字編輯器
- 查看歷史紀錄:指令如下
hg log
mercurial 會顯示所有從第一次hg commit 以來所有的更動資料.包含了標記,commit 的時間,由誰commit,以及commit 的理由.
- 查看目前工作副本的狀況:這是用來查看工作副本的檔案的狀況,指令如下
hg status
mercurial 會在檔案的前頭用字母標記來顯示檔案的狀況.ex
#hg status
A a.cpp
M b.cpp
M c.cpp
#
標記字母的意義如下:
M = 被修改(相較於檔案庫的相同名稱檔案)
A = 新增
R = 移除
! = 遺失 (檔案庫仍紀錄這個檔案的存在,可是工作副本中這個檔案已經不見了!!)
- 比對檔案的差異:指令如下
hg diff
mercurial 會用diff工具顯示目前工作副本跟檔案庫的檔案中修改了哪些地方.如果想察知版本3跟版本4的差異,可以使用
hg diff -r3:4
- 程式改壞了,想回復回去:
指令如下
hg revert [檔名]
如果程式員修改a.c 這個檔案,改壞了,想回復成檔案庫裡的a.c的內容,可以用
#hg revert a.c
a.c就會回復成檔案庫裡a.c的內容.當然也可以回復全部的檔案,可以用下面的方法
#hg revert -all
分支與合併
分支與合併是版本控制最有威力的功能,尤其是在多人參與的大型專案.分支與合併功能更顯得重要.mercurial 提供了相對於集中式版本控制系統更為優越的分支合併功能,以下是常用的分支/合併指令
- 建立分支:
要建立分支,指令如下:
hg branch [分支名稱]
ex.#hg branch fixbugNo222
這樣便完成了新建立分支的功能
如果指令參數沒有指明分支名稱的話,mercurial 會認為你想知道目前是工作於哪個分支.ex.#hg branch
fixbugNo222
#
- 查看目前所有分支:
可以查看目前檔案庫裡所有的分支,指令如下:
hg branches
ex.#hg branches
fixbugNo222 1:xxxx
default 0:xxxx
- 切換分支:
知道了目前檔案庫中分支的表列之後,可以隨意的在分支中切換
指令如下:
hg update 分支名稱
執行了此指令,mercurial 會幫助你把工作複本的內容更改成分支所紀錄的狀態
ex.#hg update default
1 files 已更新, 0 files 已合併, 0 files 已移除, 0 files unresolved
#
# hg update fixbugNo222
1 files 已更新, 0 files 已合併, 0 files 已移除, 0 files unresolved
#
- 合併分支:
合併分支的指令如下:
hg merge 分支名稱
需要瞭解的部份是:當我們說』我要把A分支合併到B分支去』,這樣實際上是把A分支的修改資料送往B分支,合併後A分支的檔案不會被改變,而B分支的檔案被改變了.以mercurial 的操作邏輯,施行合併作業,必須在下合併指令之前,先切換到B分支去
#hg update B
1 files 已更新, 0 files 已合併, 0 files 已移除, 0 files unresolved
#
接著再執行合併指令,合併A分支的修改
#hg merge A
0 files 已更新, 1 files 已合併, 0 files 已移除, 0 files unresolved
(branch merge, don't forget to commit)
#
合併後,目前工作複本以經有A分支的修改資料了,不過這些修改還沒有commit .這是為了讓程式員作最後的驗證動作,如果有衝突,也必須先解決衝突,確認合併作業沒有任何問題,才可以commit.
- 取消合併:
如果合併後的資料在還沒有commit 之前,改變心意想要放棄合併,可以用以下指令回復到原本的分支狀況
hg update -C -r .
衝突(conflict)
只要有兩個人以上共同開發專案,就可能會發生衝突.當兩個成員修改了同一個地方的時候,mercurial不知道該保留誰的版本.mercurial 會提示有conflict,並且在檔案中標示衝突的位置,以便程式員手動移除衝突
- 列出衝突:
可以使用以下指令得知這次的merge作業,哪些檔案有衝突
hg resolve --list
ex.#hg resolve --list
U A.txt
U B.txt
#
U代表 衝突還沒解決
R代表 充除已經解決
- 將衝突檔案標示成已解決:
有衝突的檔案經過手動修改衝突的部份後,就可以標記"已解決".指令如下:
hg resolve -m 檔案名稱
ex.#hg resolve -m A.txt
#hg resolve --list
R A.txt
U B.txt
#
與其他成員交流
- 從另一個地方完整複製一份專案回來:
除了可以自己建立新的mercurial專案以外,也可以從別的地方把專案複製一份到你的本機
只要使用以下指令
hg clone [來源位置]
這樣就會把來源位置的mercurial專案複製一份到目前的目錄.hg clone 並不是只複製檔案庫的檔案,他是複製全部.換句話說,不只取得了檔案,也完全的取得了專案的歷史紀錄,分支,修改過程
來源位置這個參數支援了檔案路徑,SSH存取,HTTP存取.你可以複製同一顆硬碟裡的mercurial專案,也可以透過SSH複製一份檔案伺服器上的專案,也可以用HTTP取得其他開發團隊開放給全世界的程式碼
ex.
#hg clone http://code.google.com/hg/python
or
#hg clone ssh://192.168.4.90/project
or
#hg clone ../snmpV2/
- 把自己的修改分享出去:
可以用以下指令將自己的修改"主動推"給另一個成員
hg push [目的位置]
目的位置參數一樣的支援普通檔案路徑,SSH存取,HTTP存取
- 把別人的修改抓回來:
可以用以下指令將其他成員的修改"主動抓取"回來
hg pull [來源位置]
來源位置參數一樣的支援普通檔案路徑,SSH存取,HTTP存取
留言