2013-07-17 64 views
0

我試圖合併一個樹幹到一個分支,但結束了很多樹衝突,沒有任何文件合併。爲了解決這些衝突,我只是打開文件並手工複製內容,這就違背了合併操作的目的。 將樹幹合併到分支(在subclipse中)的正確方法是什麼?Subclipse樹衝突

回答

0

那個分支是如何創建的?它是使用svn cp創建的,還是手動將這些文件複製到該分支中?

讓我們來看看下面的例子:

$ svn mkdir trunk 
$ vi trunk/foo trunk/bar 
$ svn add trunk/foo trunk/bar 
$ svn commit -m"Added foo and bar to trunk" 

你現在有主幹兩個文件。

$ svn mkdir --parents branches/1.0 
$ cp trunk/* branches/1.0/ 
$ svn add branches/1.0/* 
$ svn commit -m"Duplicated files onto branch" 

我所做的是創建在1.0分支兩個完全不同的foobar。根據Subversion,這兩個文件完全沒有關係。如果您在1.0分支上進行了更改,並嘗試將這些更改合併回主幹,則會與諸如「本地添加,傳入添加」之類的消息產生很多衝突。

什麼上面的用戶應該做的是:

$ svn cp --parents trunk branches/1.0 
$ svn commit -m"Branched trunk and not merely duplicate files" 

現在,有這麼顛覆樹幹上的文件之間並在1.0分支理解的關係。合併將順利進行。

這裏的另一種方式,打破了合併:

$ svn delete trunk/foo 
$ svn commit -"deleted foo" 
$ svn cat -rPREV trunk/[email protected] > foo 
$ svn add foo 
$ svn commit -m"Added foo back in. Shouldn't have deleted it. 

據顛覆,現在有在後備箱命名foo兩個完全不同的文件。有你刪除的文件,還有你添加的文件。這兩個文件沒有任何關係。想象一下,如果我將分支(使用svn cp的正確方法)分支到1.0分支,那麼我的刪除和複製foo。由於分支上的foo與trunk上的foo沒有任何關係,因此1.0分支與主幹的合併將會產生衝突。

要恢復文件,您需要複製已刪除的修訂(或使用svn merge -c)。

$ svn cp -rPREV http://svn.repo/svn/trunk/[email protected] . 
$ svn commit -m"Actually old foo now has been restored! Merges will work" 

如果分支不正確或刪除並將文件重新添加回主幹,將會發生衝突。您可以嘗試使用--ignore-ancestory參數,並且可以在運行實際合併之前使用--dry-run來測試您的合併。

如果您手動合併,則可以使用svn merge --record-only僅記錄您進行合併而不實際執行合併的事實。這可能有助於您下次進行合併,因爲您至少可以重新編碼您手動完成的操作。

+0

如果分支不是使用svn cp創建的,它的歷史是否也包含主幹歷史記錄,直到這一點?因爲我可以看到分支歷史記錄中的主幹日誌。無論如何,現在我知道正確的分支方式來避免合併錯誤,謝謝你的詳細答案。 – Rnet