2010-06-17 70 views
1

我剛剛閱讀了關於分佈式版本控制系統的Joel的blogpost,並且無法理解主要思想。他說,SVN根據版本進行思考,而Mercurial根據變化進行思考。據Joel稱,它解決了合併問題。分佈式版本控制系統合併易用性細節

我幾次聽到這個想法,但仍然沒有想到它。據我所知,SVN的合併機制也是基於變化(差異)。那麼區別是什麼呢?我沒有使用分佈式版本控制系統的經驗,但我主動使用SVN分支/合併,並沒有出現嚴重問題。當然,有時會合並衝突(當兩個分支中的一段代碼被更改時)。但我看不出如何通過某種控制版本系統自動解決這個問題。

+1

不同之處在於現代DVCS記錄完整DAG的變化,而afaik svn只記錄線性歷史記錄(或樹)並且沒有正確記錄合併。 – tonfa 2010-06-17 08:41:35

+1

請參閱http://stackoverflow.com/questions/2613525/what-makes-merging-in-dvcs-easy,以及http://stackoverflow.com/questions/2850996/mercurial-vs-subversion-其性能更好/ 2851020#2851020 – VonC 2010-06-17 09:09:06

+0

喬爾的解釋是不正確的。正如Tonfa所說,這裏的主要想法是使用現代DVCS中的修訂版DAG。 – bialix 2010-06-18 04:49:20

回答

1

你正在談論的與SVN的事情是某種樹衝突不能由Subversion處理,合併將失敗。與git,hg和bzr比較,這是真的,gg,hg或bzr可以處理這些情況。我建議閱讀已經完成的bachelor study,當然,其中一些問題已經解決。

0

我會將SVN與Mercurial進行比較,因爲這是迄今爲止唯一使用的DVCS。 SVN使用文件併爲每個下一個版本創建每個文件的副本,而Mercurial組裝更改集。您在SVN中擁有完整的文件版本1.0,並且您擁有完整文件版本1.1的另一個副本。在Mercurial中,您在1.0版中擁有完整的文件。然後你有一條規則,例如「在這裏添加兩行並在那裏刪除三行」來生成1.1版本。 Mercurial會經歷整個歷史並在更新過程中將更改應用到本地副本,但它不會存儲您的完整文件版本1.1的任何位置。

但是,您描述的問題在Mercurial中也沒有技術上解決。我嘗試了一個非常簡單的例子:讓兩個人同時在同一個文件的末尾添加一行。第一個承諾並推動沒有問題。第二個需要先取得和更新,以便採取最新的變化。這是一個合併衝突,這是令人討厭的! Mercurial不知道第二個人是否想添加一行或想修改該行,只是由第一個人添加。它和SVN在這裏一樣 - 你必須手動合併...所以,沒有魔法:)

你可以閱讀http://hginit.com/瞭解更多信息。

+1

你的答案的第一部分在技術上是不正確的。就像Mercurial一樣,SVN只存儲差異(「在這裏添加2行並刪除3行)」。 SVN存儲非常高效。這實際上是Mercurial和SVN共同的事情之一。 – 2010-06-17 09:35:52