2011-02-24 54 views
2

我剛開始使用水銀,我想我試圖做一些很簡單的東西,應該是比較典型的,但我難倒,爲什麼它是如此複雜,爲什麼它不只是工作的方式,應該(IMO)。合併時爲什麼會變得笨拙?我怎樣才能使拉/合併更改變得更簡單?

我分享一些與朋友的倉庫,他做了一些變更,並檢查在幾個文件中,並推動他們。現在在svn我習慣於更新我的工作副本並獲得他的更改,沒有麻煩。但與mercurial顯然我必須合併。我不明白的是:mercurial是否應該足夠聰明以便弄清楚,如果我的朋友做出了最近的更改,而且我沒有觸及這些文件,那麼應該只使用他的文件版本?顯然,它不能明白這一點,相反,它試圖合併其徹底失敗的文件(其實我已經安裝了無法比擬的,其自動打開,所以我不能壞合併怪善變完全)。

無論如何,我不知道爲什麼它甚至有可能「合併」的文件時,很明顯(我),它應該只是採取遠程(即最近)的變化。難道我做錯了什麼在我如何使用工具,或者是有什麼我可以做,使之以更簡單的方式(我已經習慣了它只是在Subversion工作的方式)工作...有什麼配置設置,關於命令行標誌的任何提示,我可以用它來使它更好地工作?

+1

你能更具體地說「完全失敗嗎?」他只改變了文件失敗,還是其他文件?你有任何分支?你以什麼順序專門使用了哪些命令?你們是否都在同一個操作系統上?你得到了什麼具體的錯誤信息? – 2011-02-24 05:46:38

+2

執行'hg pull'後執行'hg update'嗎?使用'hg pull'時,任何可用的變更集都會被拉入您的本地存儲庫。然後您必須執行「hg update」將變更集引入您的工作項目中。 – 2011-02-24 06:54:47

+1

或更好,如果你想在一個命令中使用「hg pull -u」來進行SVN等效更新。 – Serkan 2011-02-24 07:21:50

回答

9

你只需要合併,如果你已經在你的倉庫致力於爲好。如果你和你的朋友共享知識庫,那麼當你沒有做任何事情時,他會犯一次或多次,當他完成所有你需要做的事情時,就是拉和更新,而不是合併。

如果你做了本地提交,這裏的情況如何展開:

local: 1---2---3---4 
central: 1---2---3---4 
friend: 1---2---3---4 

他承諾:

local: 1---2---3---4 
central: 1---2---3---4 
friend: 1---2---3---4---5---6 

您承諾:

local: 1---2---3---4---X---Y 
central: 1---2---3---4 
friend: 1---2---3---4---5---6 

他推:

local: 1---2---3---4---X---Y 
central: 1---2---3---4---5---6 
friend: 1---2---3---4---5---6 

你拉:

local: 1---2---3---4---X---Y 
         \ 
         +-5---6 

central: 1---2---3---4---5---6 
friend: 1---2---3---4---5---6 

您合併:

local: 1---2---3---4---X---Y---7 
         \  /
         +-5---6-+ 

central: 1---2---3---4---5---6 
friend: 1---2---3---4---5---6 

然後你推和他拉,所有的倉庫都是相同的。

但是,如果當他對項目的工作,你什麼也沒做,下面的情況如何展開:

local: 1---2---3---4 
central: 1---2---3---4 
friend: 1---2---3---4 

他承諾:

local: 1---2---3---4 
central: 1---2---3---4 
friend: 1---2---3---4---5---6 

他推:

local: 1---2---3---4 
central: 1---2---3---4---5---6 
friend: 1---2---3---4---5---6 

您拉動並更新:


其原因,這是從Subversion是如何做到的是與顛覆你有集中式存儲庫,每個人都不得不談不同。因此,當你開始提交你的本地修改時,Subversion客戶端會說「對不起,你需要更新才能提交」,並且你必須執行那個更新。

如果在那時您更改了在中央存儲庫中也發生更改的文件,Subversion會將您的本地更改與服務器更改合併,並將您的修訂點更新爲提示。如果沒有衝突,這將是一個無聲的合併,否則你會得到合併衝突。

Mercurial完全一樣,除了合併不是沉默的。您既可以在自己的本地存儲庫中單獨提交,也不需要彼此交談,但是當您嘗試將所有更改集成到一個公共存儲庫時,則需要合併。 Mercurial從不改變現有的變更集(除非你使用一些擴展名進行歷史編輯),所以它不能自動找出你的並行變更集如何協同工作。

如果你們兩個都沒有處理過相同的文件,或者你們對相同文件所做的更改沒有相互衝突,那麼只需點擊幾下鼠標就可以完成合並。

在任何情況下,Mercurial都有很多選擇,但分佈式部分確實改變了您需要考慮歷史的方式。

+0

好的,你回答我明白了很多。問題是我不知道需要更新hg(我認爲pull命令已經做到了這一點)。所以hg輸出的信息之一讓我覺得我需要做「hg merge」,所以我這樣做了,我認爲這是錯誤的做法。我想或許hg應該給出更好的提示,如果在拉動之後會給出一個提示「你現在可能需要運行hg update」,那麼我會知道該怎麼做。 – Otto 2011-02-24 18:05:43

+0

ps.s.我在我的項目中進行了修改,我只是沒有碰到與我的朋友相同的文件,所以我們不應該有任何衝突的變化。 – Otto 2011-02-24 18:11:02

相關問題