2009-09-20 89 views
85

我一直在使用Mercurial,但想做一個Git的快速演示。最常見的Mercurial命令的Git等價物?

什麼是Git的等價物:

hg init . # start a project in the current directory 
hg addremove # look for any added or deleted files 
hg commit -m "comment" # commit any uncomitted changes 
hg status # what have i changed since the last commit? 
+3

我會好奇地看到一個表格,顯示至少流行的DVCS之間的所有等價命令,如果有人在一邊發生,而在這裏想出答案。我沒有在Google搜索中找到一個。 –

回答

101

The Git-HG rosetta stone is not bad

目前不存在提到的兩個之間的一些其他陷阱。當我以另一種方式(git - > hg)時,這個列表被從我自己的博客文章中分離出來。

Hg .hgignore,語法:glob與git的.gitignore具有相同的行爲。

GIT中的.git /配置,〜/的.gitconfig,使用git-config來修改值
汞柱 .hg/hgrc〜/ .hgrc,使用hg help -c config

GIT中 GIT中提交-v
Hg hg diff |減;汞柱提交

GIT中 gitk
汞柱汞柱視圖,或從THG TortoiseHg

GIT中 GIT中的GUI
汞柱水銀不出貨GUI來選擇變更集,只有控制檯hg record命令。

混帳混帳變基
hg rebase。對於git rebase --interactivehg histedit或Mercurial隊列

Git git push URL; git遠程添加源URL
Hg hg push URL; $ EDITOR .hg/hgrc; [路徑]默認= URL

Git gitk,git log origin/master ..HEAD
汞柱汞傳出

混帳混帳格式補丁RANGE
汞柱汞電子郵件-m -o名

混帳混帳增加。 ;注意點
Hg hg add;不需要點。

的Git git的結帳修訂-KEY
汞柱汞柱更新變更


正好填補了這一空白,有的來自水銀的最有用的命令:

汞柱汞紀錄
Git git add -p; git的承諾

汞柱汞INC [URL]
的Git沒有真正的等價物。你只能做hg pull; hg log -r .:

汞柱汞柱出URL
的Git如果你知道如何請添加的等價物。

對於合併衝突的解決,在水銀的hg resolve命令有改變行爲的幾個選項:

汞柱汞柱解決-m FILE(文件標記爲手動固定了衝突問題已得到解決)
GIT中 GIT中添加FILE

汞柱hg resolve -u FILE文件標記爲已被懸而未決
的Gitgit reset HEAD FILE到unstage文件

汞柱汞決心-l(列出瞭解決/未解決衝突的文件)
混帳混帳狀態 - 即合併乾淨會自動添加到索引文件,那些沒有衝突

汞柱汞決心文件(合併後,嘗試重新合併文件)
混帳沒有相應的重新合併日據我所知。

+0

'git rebase'的實際等價物實際上是'hg rebase'。隊列是一件更復雜的事情(它們的作用不止是以用戶更多工作爲代價)。 Git有幾個外部工具可以做什麼隊列('guilt',堆疊Git等) – quark

+4

也許這應該是一個wiki。 – Keyo

+1

對於gitk,有一個Mercurial hgview的圖形化克隆(注意它與「hg view」命令不同) – tonicebrian

1

這是大致相同的,沒有addremove:

git init # Start a project in the current directory 
git status # Displays both changes and added/removed files 
git commit -m "comment" # commit any uncommited changes 

然而,這些都是單獨工作時要使用的命令。當您想要將更改與其他人的工作合併到git pullgit push以及相關命令時,您會進入整齊的

+0

並將它關閉,使用「git show」(與我相信的「git diff」相同)來查看自上次提交以來更改的內容。 – PHLAK

+2

「git show」(沒有參數)顯示了*上次提交中的更改*。 「git diff」顯示自上次提交以來的更改*。 – Dustin

11

水銀:

hg init . # start a project in the current directory 
hg addremove # look for any added or deleted files 
hg commit -m "comment" # commit any uncomitted changes 
hg status # what have i changed since the last commit? 

混帳等同於:

git init 
git add -A 
git commit -am "comment" # -a is not necessary along with the above add -A 
git status 
+1

我(我認爲大多數git用戶)使用'git add -u'多於'-A'; -u將對所有跟蹤文件進行更改,忽略新的未跟蹤文件。 – u0b34a0f6ae

+2

但addremove添加新的未跟蹤文件:) – tonfa

+2

我不同意'git status'相當於'hg status'。我是Hg的新手,並沒有設法讓Gg的狀態與Git類似。 –

47

注:Git和水銀的最大區別之一是指數臨時區域的明確存在。

Mercurial for Git User

Git是唯一DistributedSCM暴露指數或臨時區域的概念。其他人可能會實施並隱藏它,但在其他情況下,用戶意識到並且不必處理它。

Mercurial的粗略等價物是DirState,它控制工作副本狀態信息以確定要包含在下一次提交中的文件。但無論如何,這個文件是自動處理的。
此外,通過在命令行上指定要提交的文件或使用RecordExtension,可以在提交時更具選擇性。

如果處理索引覺得不舒服,要切換的更好;-)


的訣竅是,你真的需要了解充分利用Git的索引。由於這article from May 2006提醒我們,然後(並且現在仍然如此):

「如果您拒絕索引,你真的拒絕混帳本身」

現在,這篇文章包含現在更易於使用許多命令(所以不要太依賴其內容;)),但總的想法仍然是:

您正在開發一項新功能並開始對文件進行微小的修改。

# working, add a few lines 
$ git add myFile 
# working, another minor modification 
$ git add myFile 

在這一點上,你的下一個承諾將開始在當前分支

# working, making major modification for the new features 
# ... damn! I cannot commit all this in the current branch: nothing would work 

$ git commit 

2條小的修改只記錄在此時加入到臨時區域(指數)的變化,而不是大的變化目前在你的工作目錄中可見。

$ git branch newFeature_Branch 
$ git add myFile 

下一次提交將記錄新分支'newFrature_Branch'中的所有其他主要更改。

現在,交互式增加,甚至分裂提交可與水銀的功能,通過「hg record」命令或其他擴展:你需要安裝RecordExtension,或CrecordExtension
但這不是Mercurial正常工作流程的一部分。

Git將提交視爲一系列「文件內容更改」,並讓您逐個添加這些更改。
您應該研究該功能及其後果:大多數Git權力(如易於使用revert a merge (or bisect the problem, or revert a commit),contrary to Mercurial的能力)來自該「文件內容」範例。


tonfa(在個人資料: 「汞開發,pythonist」:人物...)遙相呼應,在註釋:

沒有什麼根本的 「混帳十歲上下」 的指數, hg可以使用索引,如果它被認爲是有價值的,實際上mqshelve已經做了一部分。

哦,男孩。再來一次。

首先,我不是在這裏使一個工具看起來比另一個好。我覺得Hg很棒,非常直觀,有很好的支持(特別是在Windows,我的主要平臺上,儘管我也在Linux和Solaris8或10上工作)。

該指數實際上是前沿和中心的方式Linus Torvalds works with a VCS

Git的使用明確的索引更新1天,甚至在它做的第一件合併。這只是我一直工作的方式。我往往有髒樹,在我的樹,我做要提交一些隨機的補丁,因爲它只是對指數的下一個版本現在

組合一個Makefile更新(這是不是只在Git中看到的一個概念),並「內容爲王」的模式使得它pretty unique and "git-ish"

Git是一個內容跟蹤,和文件名是沒有意義的,除非相關聯的內容。因此,git add filename的唯一理智行爲是將該文件的內容及其名稱添加到索引中。

注:"content", here, is defined as follows

Git的指數基本上是非常定義爲

  • 足以容納樹的總 「內容」(這包括所有元數據:文件名,模式和文件內容都是「內容」的部分,而且它們本身都沒有意義!
  • 額外的「stat」信息允許顯而易見(但極其重要的!)文件系統比較優化。

那麼你真的應該看到指數內容

內容不是作爲獨立部分的「文件名」或「文件內容」。你真的不能分開這兩個
文件名本身是沒有意義的(它們也必須有文件內容),文件內容本身也是無意義的(你必須知道如何達到它)。

我想說的是,git根本不會允許你看到一個沒有其內容的文件名。整個概念是瘋狂的,無效的。它與「現實」無關。

the FAQ,其主要優點是:

  • 犯了一個細粒度
  • 幫助您保持您的樹中的未提交修改了相當長的時間
  • 執行幾個小步驟對於一次提交,請檢查您對git diff所做的操作,並使用git addgit add -u驗證每個小步驟。
  • 允許合併衝突的優秀管理:git diff --base,git diff --ours,git diff --theirs
  • 允許如果索引尚未在此期間

我個人認爲這種行爲不應該是默認的修改git commit --amend修改僅日誌消息,你希望人們犯一些測試或至少編譯

雖然你是對的,一般(有關「測試或編譯」部分),Git的,您可以拆分和合並(櫻桃採摘或重定基)的方法可以讓你承諾在一個臨時的私人分支中(只推送到遠程「備份」存儲庫),同時在公共分支上重新執行這些「醜陋的提交」,並進行所有正確的測試。

+1

索引中根本沒有「git-ish」,如果它被認爲是有價值的,hg可以使用索引,事實上mq或shelve已經做了一部分。我personnaly認爲這種行爲不應該是默認的,你希望人們提交經過測試或至少編譯的東西。 – tonfa

+2

關於Git索引中的內容,請參閱http://stackoverflow.com/questions/4084921/what-does-the-git-index-exactly-contains/4086986#4086986 – VonC

+0

在Mercurial中,您最近一次提交(推送前)的行爲像git的索引。您可以修改它,回滾它,更改提交消息或通過將其階段更改爲公開來完成它。 –

相關問題