注: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可以使用索引,如果它被認爲是有價值的,實際上mq
或shelve
已經做了一部分。
哦,男孩。再來一次。
首先,我不是在這裏使一個工具看起來比另一個好。我覺得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 add
或git add -u
驗證每個小步驟。
- 允許合併衝突的優秀管理:
git diff --base
,git diff --ours
,git diff --theirs
。
- 允許如果索引尚未在此期間
我個人認爲這種行爲不應該是默認的修改git commit --amend
修改僅日誌消息,你希望人們犯一些測試或至少編譯
雖然你是對的,一般(有關「測試或編譯」部分),Git的,您可以拆分和合並(櫻桃採摘或重定基)的方法可以讓你承諾在一個臨時的私人分支中(只推送到遠程「備份」存儲庫),同時在公共分支上重新執行這些「醜陋的提交」,並進行所有正確的測試。
我會好奇地看到一個表格,顯示至少流行的DVCS之間的所有等價命令,如果有人在一邊發生,而在這裏想出答案。我沒有在Google搜索中找到一個。 –