2009-08-13 65 views
3

幾個星期前,我開始對SVN存儲庫的主幹進行更改,我認爲這會發生很小的變化。如何避免將分支合併回主幹時出現SVN衝突

工作了幾個小時之後,意識到這種變化有較大的影響比我想象的,我決定這是太冒險了檢查我的變化到主幹向右走,所以我做了一個分支,像這樣:

svn copy . https://my_svn_server/svn/blah/branches/my-branch 

...然後做了一個svn開關,並且很高興地繼續在那個分支上工作。到目前爲止,這很好,直到我對所有變化感到滿意爲止,並希望將它們重新合併到主幹中。因此,我檢查所有更改到我的分支,然後仔細按照here所示的步驟進行操作......這就是我遇到麻煩的地方。因爲我從本地(客戶端)存儲庫創建了my-branch,而這個存儲庫中已經有大量未處理的(未簽入)更改,所以合併不包含與這些更改相對應的差異,因此在那裏在手工合併中有很多很多的衝突 - 我不想這麼做,因爲如果我把它搞砸了,就會給蟲子留下空間。

我試着通過減少我在合併過程中指定的版本號來減少差異。通過做

svn merge -r2818:2932 https://my_svn_server/svn/blah/branches/my-branch 

,而不是預期

svn merge -r2819:2932 https://my_svn_server/svn/blah/branches/my-branch 

...但沒有工作,因爲我的分支並沒有在修訂2818存在,所以我只是得到一個錯誤:

svn: Unable to find repository location for 'https://my_svn_server/svn/blah/branches/my-branch' in revision 2818 

這就是事情的立場。我可以手動整理這次的混亂,但我很好奇是否有辦法處理這個問題,這樣下次我的工作會更好。

我可以想到的一種方法是創建my-branch,而不是通過複製本地(客戶端)存儲庫,而是通過複製SVN trunk HEAD,然後將我的分支檢出到單獨的目錄,然後手動將本地(未簽到)更改從trunk目錄複製到my-branch目錄,然後直接恢復本地中繼...但這也非常繁瑣且容易出錯。

當然,有一種更好,更自動的方式來創建一個包含本地(未簽入)更改的分支,然後將其合併回主幹中?

回答

7

你最後的建議幾乎就在那裏。當你想分支時,複製樹幹HEAD。然後在您的工作副本中,

svn switch https://my_svn_server/svn/blah/branches/my-branch 

這將切換到分支,同時保留所有本地修改。然後,您可以隨時將您的更改提交到分支。

+0

很酷,我沒有意識到svn switch會保留我的本地編輯。這是我錯過的東西:^) – 2009-08-13 00:31:54

+0

嗯,它會*嘗試*保持您的本地編輯。 – 2009-08-13 08:51:35

+0

我的回答是在假設HEAD與新分支HEAD相同的假設下完成的。我不保證它會成功保留您的本地編輯,如果您有一些其他更改在主幹中發生衝突。 – bobDevil 2009-08-13 16:52:57

1

好吧,我想我已經弄清楚如何幹淨地合併(有趣的是,如何編寫問題經常會澄清問題,不是嗎?)。解決方案是進行兩次合併,一次是對主分支(原來是這樣)和我的分支開始之間的差異進行計算,然後進行第二次合併以解釋在my分支中進行的後續更改:

svn merge https://my_svn_server/svn/blah/trunk/[email protected] https://my_svn_server/svnblah/branches/[email protected] 
svn merge -r2819:2932 https://my_svn_server/svn/blah/branches/my-branch