2015-05-11 143 views
0

我剛開始使用SVN。 我只爲自己創建了一個開發分支,這樣我可以在將我的更改合併到主幹之前做任何我想做的事情。SVN:分支問題

不幸的是,當我不得不合並時,這是一場噩夢。 我的樹看起來就像是:

trunk : A-B 
      \ 
dev :  C-D-E 

我只是想帶回我的變化E到軀幹。 一切正在編譯並在E上正常工作。 但是當我合併時,我無法再編譯。 我有衝突,我不明白:

  • 一些函數添加他們的身體改變,但參數列表仍然是舊的。

對於前:

void func(int paramA) // from rev B 
{ 
    paramB++; // from rev E and causing compilation error 
} 
  • 一些新的文件被添加,但其他一些則沒有。 SVN抱怨說因爲它們不存在於主幹中而衝突的文件。但我不明白如何創建一些文件和其他文件不能。

我已經嘗試了很多不同的選項與烏龜SVN(我恢復了十幾次)。 我也讀過很多關於使用SVN分支的內容。但我找不到解決我的簡單問題。大部分答案都很老舊(超過5年)。

我習慣用Git來分支。而一切似乎都是合乎邏輯的。但現在與SVN,我完全失去了! 有些人可以給我一些建議。 我的意思是關於分支的日常使用,而不是關於整個項目的分支策略。 我只是尋找建議,以避免合併衝突時,他們不應該發生的痛苦!

任何幫助真的很感激! 謝謝:)

回答

0

對於你的第一個問題,參數行顯然是在B中修改的。如果你沒有修改你的分支上的那一行,SVN不能把它看作衝突。順便說一下,Git也無法看到。

通常這是一件好事。如果在主幹上的某些內容發生了變化,但是不會在分支上發生變化,通常希望合併功能將樹幹上發生的事件與分支上​​發生的事件結合起來。但在你的情況下,主幹上的變化與你的分支有衝突(不是行方向的文本衝突)語義。您將始終需要手動解決此類語義衝突;基於行的文本差異,比如我聽說過的每個版本控制系統都使用它,不能自動檢測或解決這些衝突。

如果你確實也修改你的分支上的那一行,svn應該標記該文件爲衝突。當您解決衝突時(例如雙擊TortoiseSVN的「檢查修改」對話框中的「衝突」狀態),您將有機會選擇需要哪一行版本,或者手動修改該行。

對於您的第二個問題,新的文件在分支上引入,並且不存在於主幹上,應始終添加,不會發生衝突。但是,如果之前存在於主幹上的文件在開始分支後的某個時候被刪除,則會出現「樹狀衝突」。如果某人在主幹上添加了一個與新分支文件具有相同名稱的文件,或者如果對某人從中繼中刪除的某個文件進行了更改,則還會得到「樹衝突」。

處理樹木衝突是痛苦的;我對這些並不清楚,但我認爲您只需將其標記爲已解決,並使用完整的文件URL將您想要的文件標記爲svn copy即可。

+0

這在我的描述中並不明顯,但我也改變了分支中的參數行。這就是爲什麼我不明白爲什麼在合併期間參數行沒有更新。關於新文件,我可能有一個與我過去刪除的名稱相似的文件。但是,既然它在分支上很有用,我不明白爲什麼SVN在合併時會抱怨它。最後,我幾乎做了你所說的話:我將樹幹合併到我的分支中,然後手動將整個項目目錄複製回樹幹!但我期待的是更清潔的東西:( – Plouff

+0

不,我只是想複製當你合併時說「樹衝突」的特定文件。對於參數行,你應該看到svn說文件有衝突,並允許你帶你需要告訴svn要使用哪個版本的行,svn不知道你的版本取代了rev B的版本,因爲B也改變了它。 – Ben

+0

我得到了一個diff窗口,但是其他的衝突,不是爲了這個,這就是爲什麼我在合併過程中迷路了,就好像SVN解決了差異,我的一個隱含的問題是,「我誤解了什麼?」。告訴我,我對合並的期望是正確的,我可能做錯了,但SVN沒有幫助,趕上!謝謝你的幫助! – Plouff