Setting Up for a Team
使用水銀的好處之一是可以使一個團隊協同工作。水銀使得你們可以單獨地工作,然后把你們的更改合并到一起。
使用水銀來協同工作的最普遍的方法就是在我們的個人計算機之外,再建立一個中央倉庫。我們可以把中央倉庫作為一個交換區,從而來得知大家都作了哪些更改。
建立中央倉庫的最簡單粗暴的辦法就是在服務器上,用hg init命令。并且使用hg serve命令使之成為web服務端。默認地,該服務的端口號為8000.
由于這臺電腦的名字叫做joel.example.com,因此可以通過網址http://joel.example.com:8000/來登錄。
中央web服務端運行之后,我就可以從將這個倉庫從服務器端拷貝到我的電腦上為我所用了。這個倉庫現在是空著的,因此我也只拷貝到了空的倉庫。
現在我要建立一個叫做guac的文件。
我添加這個文件,然后提交,以作為第一個官方版本。
我會提供一個提交注釋:
我快快地做些許改變,使得我們的倉庫也有些歷史:
現在提交變更:
看,我提交的時候用了-m這個參數。這是在命令行直接寫提交信息的方法。
OK。現在我們到哪里了呢?我們建立了中心倉庫,并且復制到了本地電腦上。然后做了兩個變更并且提交了。然而那些變更只是在我的本機上——它們還沒有出現于中心倉庫呢。因此,現在水銀的世界看上去是這樣的:
現在,我們要使用hg push這個命令,來把我的變更推到中心倉庫中:
很好。然而似乎不行。這里有一個安全性的考量,看看是不是要讓全世界的人都可以把它們的變更推送到中心倉庫中。可以通過編輯服務端的.hg\hgrc來配置。
當然,這樣做是不安全的。然而如果你的工作環境是一個被保護的比較好的局域網,并且該局域網中的同事是值得信賴的,那么這樣做也是可以的。否則的話,你需要去讀一下有關安全的章節。
好了,現在重啟服務。
現在就可以推送了:
現在,水銀的世界看起來就是這樣:
我知道你在想什么,你在想,“很奇怪啊,為什么這些倉庫中只有變更信息而沒有文件?guac文件在哪里?”
是的,很奇怪。然而分布式版本控制器就是這么工作的。倉庫中只包含了變更棧。
我們可以使用網頁瀏覽器來一瞥現在的中心倉庫:
現在我想要Rose來幫忙我的工作。Rose在測試組。
Rose使用hg clone命令來獲得她自己的完整的倉庫拷貝。hg clone命令帶兩個參數。一個是倉庫的源地址,一個是目標文件夾的名字。她現在構建了她自己的recipes文件夾。
利用hg log命令,她看到了所有的歷史。她實際上下載了整個倉庫,包含了在這個倉庫發生的所有歷史。
Rose將要完成一個變更,并且提交到中心倉庫:
她現在進行提交。注意,即使服務器沒有運行,提交的過程也能在她的機器上完成。
當Rose在進行她的變更之時,我也可以在同時進行我的變更。
當我提交的時候,你會發現我的變更集#2與Rose的變更集#2并不相同。
我們的歷史開始分離。
不用擔心……過一會兒我們就會看到如何將這些分離的變更合到一起。
Rose可以在離線狀態繼續她的工作。只要愿意,她可以作出任意多的變更,然后提交也可以,revert也可以。直到在某一時刻,她想要與外界分享她提交的內容。她可以輸入hg outgoing來顯示她可以上傳到中心倉庫的所有變更集。如果她再輸入hg push,則這些變更集會全部上傳到中心倉庫中。
可以這樣來認識hg outgoing:它就是簡單地列出當前倉庫有,而中心倉庫沒有的。
OK,Rose推送了她的變更。
現在水銀的世界變成了這樣:
當我從當天的第四個拿鐵休息中回來,我也準備要推送我的變更了。
啊……失敗了!順便要說的是,看到那條信息了嗎?就是那條說要用push -f to force的那條。那是一條很糟糕的建議。永遠永遠不要使用push -f來強制推送。否則你會后悔的。請暫時相信我。
Rose能推送成功而我卻失敗了的原因是,我們兩個人都做出了變更,而她先我一步推送了。現在需要先進行合并。而水銀知道這一點。
我現在要做的是獲取那些在中心倉庫中有的,而我沒有的。從而我可以合并它們。
上面有一個+1heads。這個意思是我之前就一條主線,現在變成有兩條線了,變成了有兩個頭的怪物。就像這樣:
現在在我的倉庫里面有兩個版本了……我有我的版本:
還有Rose的版本:
現在要我來合并它們。幸運的是,這很簡單。
看,hg merge命令將我的兩個頭合并到了一起。在當前的情況下,由于我們是分別編輯的文件的不同部分,因此根本沒有任何沖突。
我還需要提交一下。這很重要。如果合并失敗了,我也總能回滾并且再次嘗試。由于合并很成功,我打算提交它。然后我就可以將我的變更推送到中心倉庫了。
現在中心倉庫的內容就和我做的同步了:
OK,現在我有了Rose的變更,以及我的變更,然而Rose卻還沒有我的變更。
Rose這時需要拉下倉庫中的最新版本。
然后你會感到有一點奇怪。因為即使Rose將新的變更都拉到了她的倉庫中,它們竟然沒有出現在她的工作目錄中。
然而在她的倉庫中其實是有新的變更的……
它們不再她的工作目錄中是因為她仍然在變更集#2上工作。你可以通過“parent”命令來看到。
水銀總是對我們很友好。它保證我們拉的很安全;它所做的就是給我們其他人做的最新的變更。我們可以在自己方便的時候再轉換過去。
記住,不帶任何參數的hg up命令會將工作目錄更新到最高的變更集。在此例中為數字4:
當一個團隊在工作時,你的工作流看起來大概是這樣的:
- 如果你一段時間沒搞了,那么就先去獲得最新的版本:
- hg pull
- hg up
- 做一些變更
- 提交它們(本地)
- 重復步驟2-3直到你滿意了并且想要與他人的工作合并
- 當你準備好要分享時:
- hg pull來獲得別人的變更(如果有的話)
- hg merge來將它們合并到你的里面
- 測試!保證合并沒有把什么事情變糟
- hg push
自測
以下是你學完這篇教程后應該會做的:
- 建立中心倉庫并且讓團隊成員從此處拷貝。
- 把變更推到中心倉庫中。
- 從中心倉庫拉取變更。
- 從不同的貢獻者處合并變更。