2011-01-06 77 views
5

作爲Subversion的前用戶,我們決定轉向Mercurial尋找SCM,這讓我們感到困惑。雖然Mercurial是一個分佈式SCM工具,但我們正在使用遠程repo來保持我們在服務器上備份的更改,但我們發現一些小問題。正確(最佳實踐?)過程與遠程Mercurial存儲庫保持同步?

例如,當我們兩個或三個人在我們的本地倉庫上工作時,我們承諾然後推送到遠程倉庫,我們發現創建了很多頭(?)。這讓我們感到困惑,我們不得不做一些合併等來整理。

什麼是最好的方法來避免這麼多頭,並保持一個遠程回購與許多開發人員同步?

今天,我一直是這樣的:

  1. 改變文件。
  2. 從遠程回購拉。
  3. 更新本地工作副本。
  4. 合併? (爲什麼?)
  5. 將我的更改提交到本地回購。
  6. 推送到遠程回購。

這是最好的方式嗎?

雖然今天工作得很好,但我忍不住覺得我做錯了!說實話,我不明白爲什麼合併甚至需要在拉動階段完成,因爲其他人正在處理不同的文件?

除了告訴我RTFM你有沒有關於使用Mercurial的提示是這樣的一種方式?有關我們爲什麼得到如此多頭的信息的任何良好的在線資源?

注意:我已經閱讀了手冊,但它並沒有提供太多細節,我不認爲我想在一分鐘內開始另一本書。

+1

http://hginit.com上的Joel Spolsky的教程是學習mercurial如何工作的好地方,據我所知,它包含關於多頭和無痛合併的良好解釋http://hginit.com/ 04.html – 2011-01-06 20:46:03

回答

11

你一定要找到一些學習資源。

我可以提出以下建議:

至於你的具體問題, 「這是最好的方法」,那麼我會說不。

這裏有一些提示。

首先,您不需要始終與中央存儲庫保持「同步」。相反,請遵循以下指導原則:

  • 當您對所做的更改感到滿意時,從本地存儲庫推送到中央存儲庫。請記住,這可以是幾個更改集
  • 如果您需要更改其他人馬上做的更改,例如。有一個錯誤修復,你的一個同事已經修復,你需要,以繼續自己的工作。
  • 拉前推
  • 合併,你用自己的變化拉低了任何額外的頭,你推前,或者繼續工作

換句話說,這裏是一個典型的一天。

當您在早上進來時,您會拉取最新的更改,以便獲得最新的本地克隆。如果你正處於昨天沒有完成的更大更改的過程中,你可能不會一直這樣做。

然後你開始工作。您提交了帶有孤立變化的小變更集不僅僅是因爲您修改了多個文件,而是嘗試避免一次修復多個缺陷,或者實現多個特性一次。儘量保持專注。

然後,當您對本地添加的所有變更集感到滿意時,您決定推送到服務器。當你嘗試這樣做時,你會得到一箇中止消息,說明額外的頭將被推送到服務器,這是不允許的,所以推送被中止。

反而你拉。這總是可以完成的,但是當然現在會在本地克隆中添加額外的頭部,而不是在服務器上。

然後,您將您從服務器獲得的額外頭部與您自己的頭部合併,這是您在白天將新變更集提交給您的副本時創建的頭部。您解決任何合併衝突。

然後你推,現在它應該成功。如果有人在您忙於合併時設法將更多變更集推送到中央存儲庫,您將會再次中止並且必須清洗並重復。

歷史將顯示多個並行的開發分支,但應該始終保持在中央存儲庫中的最多1個頭部。如果稍後開始使用命名分支,那麼每個命名分支可以有1個頭,但是要儘量避免這種情況,直到得到默認分支的掛起爲止。

至於爲什麼你需要合併?那麼,Mercurial總是使用作爲整個項目快照的修訂版本,這意味着兩個分支(即使它們包含對不同文件的更改)實際上被認爲是整個項目的兩個不同版本,並且您需要告訴Mercurial它應該結合他們回到一個版本。

4

首先,你可以在任何時候拉;拉只會將變更集添加到您的回購站,但不會更改您的本地工作文件(除非您已啓用後推更新)。

如果有人已將更改提交給您當前正在使用的同一分支,則合併是必要的。這創建了一個隱含的分支,合併只是將它們重新聚合在一起。您可以在存儲庫視圖中很好地看到「鐵路軌道」。基本上,只要你不合並,你就留在你自己的「私人」軌道上,當你想添加你的改變(可以是任何數量的改變集合)時,你將它合併回目標分支(通常是「默認」 )。這是無痛的 - 就像在較老的SVN版本中合併一樣!

因此,工作流程不像您顯示的那樣嚴格;它更像是這樣的:

  • 上拉,就像你喜歡
  • 進行更改,然後提交當地人稱爲往往你喜歡
  • 當你的變化應該進行整合,合併與目標分支(可以是低修訂版和最新版),提交併推送

此工作流程可以稍微調整,例如使用命名分支,有時使用rebase。但是,您和您的團隊應該決定要使用的工作流程; Mercurial在這方面非常靈活。

2

http://hginit.com有一個很好的教程。

特別是,你會發現的步驟列表你在這裏:http://hginit.com/02.html(在頁面的底部)

這些步驟之間的差異,你的是,你應該步驟1在事後提交在進入pull/merge/push步驟之前,您通常會在本地存儲庫上多次提交。您無需立即與其他開發人員分享每一次提交。做好幾個相關的變化然後推動整個事情通常是有意義的。