Mercurial[輕量級分散式版本控制系統]

Mercurial[輕量級分散式版本控制系統]

Mercurial 是一種輕量級分散式版本控制系統,採用 Python 語言實現,易於學習和使用,擴展性強。其是基於 GNU General Public License (GPL) 授權的開源項目。

控制系統

特點

相對於傳統的版本控制,具有如下優點:

更輕鬆的管理。傳統的版本控制系統使用集中式的 repository,一些和 repository相關的管理就只能由管理員一個人進行。由於採用了分散式的模型,Mercurial 中就沒有這樣的困擾,每個用戶管理自己的 repository,管理員只需協調同步這些repository。 更健壯的系統。分散式系統比集中式的單伺服器系統更健壯,單伺服器系統一旦伺服器出現問題整個系統就不能運行了,分散式系統通常不會因為一兩個節點而受到影響。 對網路的依賴性更低。由於同步可以放在任意時刻進行,Mercurial 甚至可以離線進行管理,只需在有網路連線時同步。

元素

Revision

在使用 Mercurial 的系統中每個改動隔離在各自的 repository 里,既避免把不相關的代碼混雜起來, 又便於一個接一個的測試每一部分工作,用戶做的每個改動稱為一個 revision。一般會有一個所有用戶都可以訪問得到的 repository 保存了項目的“主要”版本,工作repository 是用戶自己做事情的地方,實現新的特性,修改漏洞,重構,實驗等,當完成改變後,你可以 push 到共用的 repositor y中,即完成了一個 revision。

Changeset

一個或多個檔案的改變集合在一起形成一個邏輯單元,稱為 changeset。每一個 changeset由兩部分內容描述,版本號和 changeset 標識,例如:changeset: 207:58e4906e69e3

冒號前面的數字代表版本號,它用來標識本地 changeset。這個版本號只有在用戶的本地repository 中才有意義。冒號後面的那個很長的十六進制串是 changeset標識, 它是確定changeset的全局唯一標識符, 在所有包含這個 changese 的 repository 中都相同。多個用戶之間討論changeset,一般使用這個 changeset 標識,而不是上面說的版本號,因為完全有可能每個用戶的 repository 中同樣的 changeset 版本號不同。

Head

Head 表示 repository 中每個分支最新的 revision,通常在合併幾個分支時會用到這個概念。

Tip

Tip 是最新的一個 changeset 的版本號的一個別名。在命令中任何使用版本號的地方都可以使用 tip 來代替最新的 changeset的版本號。Tip在各個repository中是不同的,同時一個repository 中只有一個 tip。

Log

Log 命令按時間順序從近到遠的記錄著在 repository 中發生的每一次事件。可以通過指定-v診斷輸出選項來獲得更多更詳細的歷史信息,或者指定—debug選項來獲得歷史信息中的一切細節。

操作

Mercurial通過hg命令加上關鍵字來進行操作,可以遠程同步、上傳代碼。

用法

拷貝(同步)源碼並提交修改:

$ hg clone repository (這裡repository是源碼的地址)

$ cd hello

$ (edit files)

$ hg add (new files)

$ hg commit -m 'My changes'

$ hg push

創建新的hg項目,並提交:

$ hg init (project-directory)

$ cd (project-directory)

$ (add some files)

$ hg add

$ hg commit -m 'Initial commit'

Spectre

Mercurial - Spectre

最近更新: 6.43b

基本操作

以下使用大多基於命令行形式,版本是1.2.11

因為本地即是版本庫的服務端也是版本庫的客戶端,所以首先得區分好版本庫和工作目錄兩個概念,版本庫存放了所有的版本,工作目錄只是某個特定的版本,這個概念同svn是一致的,只是svn的版本庫不在本地,而在集中的一台伺服器上。

hg init創建新倉庫,版本庫的檔案放在一個.hg的資料夾下面

hg add添加未版本化的檔案

hg commit提交修改,使用-m 填寫comments,同svn是一樣的

hg tip查看當前版本庫的最新版本,注意:不是當前工作目錄的最新版本。tip是版本庫最新版本的意思

hg parents查看當前工作目錄的最新版本,如果這個版本有多個parent,會顯示出來,如果沒有則不顯示。parent是指某個版本的前一個版本,如果某個版本通過 兩個版本merge而來,則會出現多個parents。mercurial還不支持超過兩個的parents,也就是說只能將版本兩個兩個的合併,合併3 個版本需要操作2次,合併4個版本需要操作3次,依次類推,如果碰到8個版本需要合併,則需要合併7次...

hg clone克隆一個版本庫到本地,當項目開始的時候,建議在一台電腦上init項目後,然後大家從他那clone出來,而不是各自init。

hg pull從另一個版本庫更新版本到本地

hg push將本地版本庫更新到其他版本庫中,其他版本庫需要開通ssh服務,Windows下需要cygwin來啟動ssh,linux下用openssh實現。Windows客戶端連線ssh伺服器時,需要在mercurial.ini的ui段配置,如下

[ui]

ssh = "C:\Program Files\TortoiseHg\TortoisePlink.exe"

putty.exe 無法配合hg使用。

TortoisePlink.exe對於 ssh://xx/ 之後的路徑需要再加一個"/" 以示根路徑,如下:

ssh://192.168.107.129//home/arthur/hg/hello

hg incoming將本地版本庫同其他版本庫進行比較,看看有哪些changeset在其他版本庫中可以pull過來

hg outgoing將本地版本庫同其他版本庫進行比較,看看有哪些changeset可以push到其他版本庫中

hg update更新工作目錄,默認參數是tip,參數也可以是版本號、tag名字、branch名字。svn中的切換branch/tag通過這個命令來實現

hg tag制定一個永久的版本號,tag存放在.hgtags檔案中,這個檔案也需要版本化

hg branch顯示當前branch,或者新建一個branch,默認的branch名字是default。

hg diff對比版本間的差異

hg merge合併版本到當前工作目錄,hg pull之後會提示hg update,hg update之後如果提示hg merge,這時候的merge是在最新版本的基礎上進行的merge,merge之後所作的修改需要通過commit來生成新的版本號。

合併branch : hg merge branchname ,先確認hg branch是什麼再執行這個命令。

當一個branch的歷史使命完成的時候,這時候需要決定是基於這個branch新開一個branch,還是在某個之前的版本開立branch. default是一個沒有創立任何branch時的默認branch名字。

如果希望繼續工作在default branch下,則需要先hg update default,然後再考慮需要合併哪些版本到default裡面,之後就可以在default下一直工作了。

對於開了多個branch需要合併到default時,需要一個個branch來合併,諸如這樣:

hg merge foo

hg merge bar

hg ci -m "merge foo and bar to default

"

在windows下,如果安裝了beyond compare,會自動被調用出來。

顯示三個視窗:本地檔案、基檔案((在分支分開前的最後一個版本))、其他檔案(外來的檔案)。這種合併模式同svn是一樣的。

merge做完之後,需要hg ci提交修改,這時可以看到tip 信息中的parent有兩個,表明是從兩個版本中merge過來的。

beyond compare對於衝突有三個基本選項:Take left, take center, take right,分別對應以上三個檔案的內容。還有其他幾個選項也很容易明白。有衝突時還可能需要手工輸入內容。

另外,如果我們沒有安裝圖形合併程式, 我們就會開啟文本編輯器來訪問需要合併的檔案。用手工來做這些事情是非常容易出錯並且繁瑣的。 最好是退出編輯器並用hg rollback指令來清除["Pull"]帶來的改變,然後安裝合併程式,再做一次。

hg headshead指的是沒有兒子chaneset的changeset,也就是版本樹的葉子節點,多個葉子節點可以進行合併為一個葉子, branch heads指那些給了tag但還沒有兒子changeset的changeset。 用hg heads顯示當前庫所有的heads , 如果存在多個heads則說明有多條並行開發的路徑,這時需要考慮是否需要合併。

hg serve -n "hellohg" -p 80運行網路服務。之後可以通過hg pull http://localhost/hellohg 來下載這個版本庫。這是一個臨時性的便捷的提供pull版本庫服務的方法

hg export導出changeset,默認導出tip,需要用重定向來導出到檔案中,之後這個檔案可以通過郵件附屬檔案發出,這樣可以實現無網路連線狀態下的版本同步

hg import導入changeset

相關詞條

熱門詞條

聯絡我們