概述
* mercurial可以使異地開發進行統一的版本管理,比如乙個專案有一部分人在銀行內部開發無法用外網,另一部分人在公司開發,這兩部分人需要乙個統一的版本管理工具,mercurial這時候可以發揮作用
* mercurial 同subversion很多命令相同,所以學習曲線不陡峭,可以比較快的掌握使用。add,commit,branch,tag等命令都是相似的操作方 式。mercurial也是管理乙個全域性的版本號,同時每個版本號有乙個唯一的id識別,版本號只是順序號,不同版本庫的相同的版本號並沒有可比較的意 義,版本id相同才說明這個版本是相同的
* mercurial對linux,windows,mac平台都有比較好的支援。在windows平台上有基於命令列的mercurial.exe和基於圖形介面的tortoisehg
* dvcs同集中式版本管理的最大不同點是,每個人機器上都有乙個版本庫,乙個版本庫如同乙個svn branch,所以如何使用branch,並進行合理的合併,同其他人的版本合併也變得異常重要,不然會形成非常的heads,將會形成混亂。
* mercurial通過匯出changeset到檔案中,可以方便的通過郵件附件的形式來傳送到另外乙個專案組成員,繼而進行匯入,從而實現版本同步
* 在當前最火的兩個dvcs中,google code選擇了mercurial,但git有它的一些優勢,比如版本庫儲存、多個parents方便merge
基本使用
以下使用大多基於命令列形式,版本是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:
* 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來生成新的版本號。
o 合併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
"o 在windows下,如果安裝了beyond compare,會自動被呼叫出來。
顯示三個視窗:本地檔案、基檔案((在分支分開前的最後乙個版本))、其他檔案(外來的檔案)。這種合併模式同svn是一樣的。
merge做完之後,需要hg ci提交修改,這時可以看到tip 資訊中的parent有兩個,表明是從兩個版本中merge過來的。
beyond compare對於衝突有三個基本選項:take left, take center, take right,分別對應以上三個檔案的內容。還有其他幾個選項也很容易明白。有衝突時還可能需要手工輸入內容。
另外,如果我們沒有安裝圖形合併程式, 我們就會開啟文字編輯器來訪問需要合併的檔案。用手工來做這些事情是非常容易出錯並且繁瑣的。 最好是退出編輯器並用hg rollback指令來清除["pull"]帶來的改變,然後安裝合併程式,再做一次。
* hg heads head 指的是沒有兒子chaneset的changeset,也就是版本樹的葉子節點,多個葉子節點可以進行合併為乙個葉子, branch heads指那些給了tag但還沒有兒子changeset的changeset。 用hg heads顯示當前庫所有的heads , 如果存在多個heads則說明有多條並行開發的路徑,這時需要考慮是否需要合併。
* hg export 匯出changeset,預設匯出tip,需要用重定向來匯出到檔案中,之後這個檔案可以通過郵件附件發出,這樣可以實現無網路連線狀態下的版本同步
* hg import 匯入changeset
Mercurial使用簡單介紹zz
以下使用大多基於命令列形式,版本是1.2.11 hg headshead指的是沒有兒子chaneset的changeset,也就是版本樹的葉子節點,多個葉子節點可以進行合併為乙個葉子,branch heads指那些給了tag但還沒有兒子changeset的changeset。用hg heads顯示當...
Mercurial 使用教程
本教程是介紹如何使用 mercurial 我們不假定你有使用 源 控制管理 scm 軟體的背景。本教程有法文 frenchtutorial 西班牙文 spanishtutorial 日文 japanesetutorial 和中文 chinesetutorial 當研究完本教程後,你應該對以下幾點有所...
Mercurial的使用心得
在很久很久以前,我們是怎麼進行版本控制的呢,當我們工作到某個階段後,就把此時的專案存為乙個資料夾 a 然後再從這兒複製出乙份 b 接著修改,而儲存的那個資料夾 a 就是我們打的版本號,當我們把b改動到某個階段後再打乙個版本,然後從這個版本裡衍生出乙個c,一直衍生下去 如果我們在某個版本改壞了的話,我...