Mercurial中的hg 命令及註釋大全

用了3年的hg,突然要切換到git,最近兩天被git折磨的吐血,可是擦擦乾淨還得幹活不是~
趁着對hg的瞭解還新鮮,總結下來,過幾天git熟了再來個對比說明哈~~

hg和svn最大的區別就是remote repo和working copy之間多了個local repo,還有就是強大的Queue功能。經驗之談就是,一定要發揮queue的強大優勢,否則hg就白用了!

這裏列了一下常用的hg命令,最後還總結了幾個常用的場景。

圖解 hg 命令 - 晶晶 - 曬太陽的地方
自己畫的圖圖,有點醜。供快速參考。更詳細說明如下:
 

基本命令

hg help [command]  //eg: hg help qnew

hg st // 查看working copy與local repository之間的的所有更改

hg diff // 查看working copy與local repository之間的的所有更改的詳細內容

hg in // 查看remote repository 上可更新的changeset

hg out // 查看local repository上 可push的changeset

hg ci -m "comment" // 提交本地修改到local repository,ci = commit

hg update // 應用local repository的更新到本地

hg heads // 查看head的數量,如果多於一個則需要merge

hg merge // merge多個heads

hg push // 提交本地更新到remote repository

hg log -l 5 // 查看最新的5個changeset

hg revert . // 最常用的revert命令,"."表示當前repository中的所有修改。如果只想revert某個文件,把"."換成文件路徑即可。刪除working copy中所有修改。revert之後,會在被revert文件旁邊創建備份文件,後綴名是.orig,所以可以放心大膽的revert,不用害怕修改找不回來。

hg revert -r 12345 --all // revert版本12345之後所有的修改,注:版本12345本身的修改不會被revert

hg strip 12345 // 從local repo及working copy上刪掉12345及之後所有的版本,hg in又能看見remote repo上12345之後的修改

隊列命令(Queue)

hg qnew "comment" patch_name.diff // 創建一個patch。創建patch之後,就千萬不要再執行hg ci -m "" 命令,血淚的教訓啊!!

hg qref // 把當前working copy裏的修改更新到最新的patch裏

hg qref not_existing_file_name // 把最新的queue裏的內容置換回working copy裏,即hg st可見。此命令之後,最新的queue還存在,只是裏面不包含沒有任何更改了。

hg qpop // 把最上面的的patch移出隊列

hg qpush // 應用一個patch

hg qremove patch_name //刪除一個patch,只有被pop出來的patch才能被刪除

hg qser // 查看所有已有的patch

hg qapp // 查看所有被應用的patch

hg qfinish -a // finish 之後的patch才能被提交

hg qimport "C:\test.diff" // 導入指定patch文件,之後需要執行qpush才能把新導入的queue應用上

hg qimport -r 12345 // 把已經finish的changeset再變回queue,-r後的參數爲changeset的版本號

其他命令

hg purge // 刪除所有新增的文件

hg pull --rebase // 非常常用而且重要的命令!本地有q的時候使用,從center repository上得到最新更新,並在更新的代碼上應用本地的queues。如果有queue的情況下,忘了使用--rebase,而是執行了hg pull -u,解決辦法見下面場景5。

 

擴展(Extension)

如果使用上面命令的時候hg說沒有這些命令,那麼就要加一些extension。

常用的extensiongs, 包括q, purge, pull rebase等, 修改.hg文件夾中的hgrc文件,如下:

[paths]
default = [repository path]

[extensions]
hgext.mq=
hgext.purge=
rebase=

一些可能的場景

場景0:使用hg管理代碼的基本步驟

1, 假設我們現在本地沒有任何修改(即hg st,hg out都沒有內容)
2, 修改代碼,階段性完成一部分功能。這時使用hg st可以看到修改了哪些文件,hg diff看詳細修改內容。
3, 如果有需要增加或刪除的文件(執行hg st,看到的前面帶?或!的文件),執行hg addrem進行添加刪除
4, 創建queue: hg qnew -m "task A"  A.diff。這樣就保證這些修改被保存起來,之後的修改如果需要revert,也不會影響已經進入queue的這部分。這步之後hg st裏應當沒有任何內容了,可以使用hg qser和hg qdiff來查看修改。
5, 繼續做後面的功能
6, 如果開發不順利,需要重寫5中的部分,就使用下面命令revert所有5的修改:“hg revert .”。
7, 如果第5步開發順利,想把5中的修改添加到4中創建的queue裏:hg qref。
8, 如果第5步開發順利,想把5中的修改添加到一個新的queue裏:hg qnew -m "task B"  B.diff。
9, 更新remote的修改:hg pull --rebase,如果有衝突,hg會自動彈出merge窗口
10, 如果還需要繼續修改,回到第5步。
11, 提交修改:hg qfinish -a,之後hg push,完成。回到第1步。

場景1: 把機器A上的修改轉移到機器B上

1, 在A上: hg qnew -m "blah..." q.diff
2, 打開文件夾:[項目目錄]/.hg/patches,把 q.diff 拷貝到B機器,例如,放到c盤根目錄下
3, 在B上,hg qimport C:\q.diff
4, hg qpush。
5, 回到A上,彈出q.diff:hg qpop
6, 把A上的這個queue刪除:hg qremove q.diff。
完成~ 

場景2: 後做的修改要先提交

這種情況經常發生,比如正在做一個功能A,尚未完成,突然要先修一個bug B。

1,修復B之前,先把功能A的修改queue起來: hg qnew -m "comment" a.diff
2,把A的代碼彈出隊列:hg qpop
3,修改B
4,提交B:hg qnew -m "fix bug B" b.diff; hg pull --reb; hg qfinish -a; hg push;
5,把A的修改應用回來:hg qpush
完成~ 可以繼續開發功能A了

場景3:在Local Repo和Remote Repo之間再搭一個hg server
這種情況發生在一個小組內部互相之間需要頻繁提交,卻不適合直接提交到remote repo的情況。
1,在某臺電腦上(如A上),複製一份代碼。
2,修改.hg文件夾中的hgrc文件,根據自己的需要修改提交權限,例如:


 

[web]
allow_push = *
push_ssl = false

3,在新創建的代碼庫上,運行如下命令: hg serve -p 2222 -d (-p後面是端口號,-d表示後臺運行)
4,把其他電腦的hg的remote repo都指向電腦A: 修改.hg文件夾中的hgrc文件,把repo地址指向電腦A的地址,端口如上面-p所設
5,server搭建完成,其他電腦的提交會提交到電腦A上,在A上的操作如下
6,A更新其他電腦的修改:hg update
7,A更新remote repo的修改: hg fetch
8,A提交到remote repo:hg push

場景4:創建及合併分支

場景:需要創建一個分支,來滿足trunk上可以繼續開發新功能,branch上要進行bugfix。branch上的修改要經常更新到trunk上。

1,創建分支,我常用的方法是到remote server上覆制一個trunk repository文件夾。假設這個文件夾叫branch,在這個文件夾下執行 “hg serve -p [port] -d” 命令,這樣在開發機上就可以使用 hg clone 命令checkout代碼了。
2,在branch上進行修改。
3,如果要把branch的修改更新到trunk上:在開發機trunk文件夾下,執行 hg pull http://[branch-address]:[port]。中間如果有衝突,hg會自動提示merge。之後使用hg st命令能看到merge的修改。再用hg ci + hg push命令提交就可以了。

場景5:在已經創建了queue的情況下,又執行了hg pull -u命令
前面說過,在執行過qnew之後,一定要使用hg pull --rebase命令,不能使用-u。否則會出現這種情況下
執行hg st會顯示有修改。這些都是pull下來的內容。
執行hg qpop會顯示有本地更新,無法qpop。
執行hg revert會顯示有未提交的merge。
好像陷入了一個死循環。
這時候如果希望刪掉本地修改,重新執行hg pull --rebase命令,可以這樣做:
1,hg log -l 5 // 看最近的5個changesets,不夠的話就多看幾個。找到你要回滾到的version號,比如1111。
2,hg strip [version number] -f // 刪掉version number之後的changesets,可以重新執行hg pull --rebase了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章