## Mercurial 一個不同 Git 管理工具 前幾天有在社群上看到一個議題是 [為什麼Meta不使用Git](https://www.youtube.com/watch?v=lYSJo36KYZk),所以有去了解一下另一個不同的Git冷門工具 [**Mercurial(水銀)**](https:// "title")。 ### Mercurial - 開發者:Mercurial 是由 Matt Mackall 在 2005 年開發的。 - 開發動機:Mercurial 的開發是為了解決 BitKeeper 停止對 Linux 社區提供免費版本控制工具的問題。當時,BitKeeper 是 Linux 內核的主要版本控制系統,但因為許可問題,開發者需要找到一個新的分散式版本控制系統。Mercurial 被設計成一個易於使用且高效的替代品。 - 開發語言:Mercurial 主要使用 Python 開發,這使得它在編寫和維護上相對簡單。 - 設計哲學:簡單性和性能是 Mercurial 的核心設計理念,旨在提供一個易於上手且功能強大的版本控制系統。 ### 歷史背景對比 * Mercurial: > 開發初期目標是提供一個簡單、易用且高效的版本控制系統。 主要用於一些中小型專案,但也能夠處理大型專案。 開發者社區相對較小,但非常活躍。 * Git: >從一開始就針對大型專案和複雜的開發流程設計。 被廣泛應用於各種規模的專案,特別是在開源社區和大型企業中非常受歡迎。 擁有龐大的開發者社區和豐富的資源(如 GitHub、GitLab 等)。 ### 使用差異 * Git:通常使用分支(branch)來進行特性開發,並通過拉取請求(pull request)進行代碼審查和合併。 * Mercurial:使用分支(branch)或書籤(bookmark)來進行開發,並通過合併操作來將變更整合到主要分支。 ### 儲存空間和效率比較 #### 硬碟空間使用 * Git:因為使用了高效的 delta 壓縮技術,Git 通常在處理大型版本庫時硬碟空間使用效率較高。例如,頻繁變更的文件會以增量方式存儲,只保存變更部分。 * Mercurial:雖然也使用 delta 技術,但在某些情況下(特別是大量小變更的情況下)可能會比 Git 使用更多的空間。例如,每個文件的變更記錄會累積在 revlog 中,可能導致**一些冗餘**。 #### 性能 * Git:在處理大型版本庫和大量文件變更時,Git 的性能通常更優越。例如,查詢歷史記錄和合併分支時,Git 的效率較高。 * Mercurial:在中小型版本庫的操作中,Mercurial 的性能也非常出色。例如: Clone一個中型專案時,Mercurial 可能會比 Git 更快。 ### Mercurial 的設計哲學 * 不可變性:Mercurial 將版本庫視為不可變的數據結構。這意味著一旦提交,提交記錄就無法被更改或刪除(雖然可以進行歷史修改,但這通常不是常規操作)。 * 前進而非回退:在 Mercurial 中,**修改歷史記錄(例如重新編寫歷史)是不可取的**,這是為了保持版本歷史的完整性。因此,通常的操作是通過新增提交來修正錯誤,而不是回退到先前的狀態。 總體來說,Mercurial 的設計是為了保護歷史記錄的完整性,避免直接修改已經提交的內容。如果需要回到之前的狀態,通常會通過新增提交來進行修正,而不是直接修改或刪除歷史記錄。 > 所以理念上 Mercurial 開發的點只會不斷往前長。 ### 相關新聞 * [誰在使用 mercurial - www.mercurial-scm](https://www.mercurial-scm.org/who) * [Meta 早期文章 Scaling Mercurial at Facebook(2014)](https://engineering.fb.com/2014/01/07/core-infra/scaling-mercurial-at-facebook/) * [用 Git 而放弃 Mercurial,浏览器 Firefox 宣布六个月后迁移主存储库 (2023)](https://36kr.com/p/2508107664900356)