2012-04-04 41 views
3

如果兩個開發人員都從trunk中創建一個功能分支,他們是否安全地在其功能分支和主幹之間「同步合併」,然後仍然能夠將每個功能分支重新集成到主幹而沒有問題?通過「同步合併」我的意思是形式爲「svn merge ^/Project1/trunk」和「svn merge ^/Project1/branches/other-feature-branch」的命令,其中svn:mergeinfo屬性將保持跟蹤已經從每個位置合併的內容。在SVN中的功能分支之間合併安全嗎?

我問的原因是我已經閱讀過很多地方的文檔,這表明在相同的修訂版本中重新編譯會導致衝突問題(儘管我沒有在任何地方看到它解釋了爲什麼應該這樣做是這樣)。如果情況如此,那麼上述場景應該是有問題的,因爲每個功能分支將與主幹以及其他功能分支同步,因此,在主幹上進行的任何更改都將通過直接與主幹同步而得到接收,另一個功能分支(可能已經選擇了相同的主幹更改)。

但是在測試中,我已經完成了這個工作,看起來工作得非常好,但我希望有一些專家再次保證,我建議將其作爲我們團隊的工作流程。

@nosid:在此編輯中回覆nosid,因爲SO的荒謬字符限制可防止4個句子評論。這個Twitter是什麼?

我已閱讀文檔。問題在於它描述了一個非常簡單的場景,一次只能處理一個不穩定的功能,並且在功能分支中完成不穩定的工作,而在主幹中完成所有其他工作。在這種情況下,保持功能分支與中繼同步是微不足道的。

但是,在一個更現實的情況下,一個產品可能很容易一次完成幾個不穩定的工作。那麼保持這些作品同步的過程是什麼,以便它們可以根據需要與主幹和每個其他主體同步,但又不會對他們施加突如其來的變化?

+0

您可以同時擁有任意數量的功能分支。那沒問題。每個分支上的變化也可能很大 - 只要重疊很小。如果重疊很大,它不起作用,但我會盡量避免_cross-merging_。 – nosid 2012-04-08 12:30:31

回答

0

如果您將兩個特徵分支同步,那麼兩個特徵分支有什麼關係?

他們基本上是一樣的。

+1

不同之處在於,您可以在需要時抽取特徵,而不是在其他開發人員檢查時強制使用特徵。 – gbanfill 2012-04-04 17:07:47

+0

因此,這是手動拉動(而不是像您提到的那樣是「連續合併」),對吧? – 2012-04-05 01:15:32

+0

所需的工作流程與gbanfill狀態相同。我根本沒有提到「不斷合併」。 – Neutrino 2012-04-05 11:03:06

4

這不是方式,功能分支應該在Subversion中使用。一個簡單例子的測試表明,這種方法稍後會導致問題。請嘗試以下步驟:

  • 創建一個新的存儲庫。
  • 創建並提交初始結構(主幹,分支,標籤)。
  • 創建並提交svn cp -m 'new branch' ^/trunk ^/branches/a的(空)中繼的兩個新分支和相應的命令^/branches/b
  • 在分支b上添加並提交一個新文件。
  • 將分支b的更改合併到分支asvn merge ^/branches/b。我沒有改變主幹,所以沒有什麼可以合併的。
  • 在主幹上重新整合並提交分支asvn merge --reintegrate ^/branches/a
  • 合併從主幹到分支bsvn merge ^/trunk的更改。
  • 現在,您將在之前添加的文件中看到樹衝突。

Subversion的文檔詳細解釋了功能分支的建議用法。請參閱以下鏈接:Feature Branches。功能分支通常是從中繼線創建的。您可以在功能分支上進行自己的更改,並不斷將主幹中的更改合併到功能分支中(svn merge ^/trunk)。一旦你完成你的工作,你將分支重新整合到中繼線(svn merge --reintegrate ^/branches/name)。重新集成後,功能分支已過時,不應再使用。

+0

是的,我明白了,那確實是一個無賴。我的測試過於簡單,我只是測試對現有文件的更改,而不是添加新文件,所以我沒有碰到這個問題。 – Neutrino 2012-04-05 11:05:36

+0

由於SVN 1.8不再需要--reintegrate開關 - 您只需進行常規合併,並且SVN可以完成所有的魔法,不會產生樹衝突。看看這裏:http://stackoverflow.com/questions/18444634/tortoisesvn-subversion-1-8-merge-no-more-reintegrate-a-branch-option – 2016-12-14 14:37:25

0

這是我對OP的問題的看法。您可能會注意到與其他來源提出的用於確定問題答案的測試步驟有一些相似之處,但我得出了不同的結論。

這裏是我的攝製腳本:

#---------------------------------------------------------------------- 
# Test whether merging between feature branches in SVN results in 
# tree conflicts, as claimed elsewhere: 
# http://stackoverflow.com/questions/10015249 
#---------------------------------------------------------------------- 
export REPO=file:///tmp/merge-test/repo 

#---------------------------------------------------------------------- 
# Create a new repository. 
#---------------------------------------------------------------------- 
echo Creating a new repository ... 
cd /tmp 
rm -rf merge-test 
mkdir merge-test 
cd merge-test 
svnadmin create repo 

#---------------------------------------------------------------------- 
# Create and commit the initial structure (trunk, branches, tags). 
#---------------------------------------------------------------------- 
echo Creating initial structure ... 
svn mkdir $REPO/trunk -m "Initializing trunk" 
svn mkdir $REPO/branches -m "Initializing branches" 
svn mkdir $REPO/tags -m "Initializing tags" 

#---------------------------------------------------------------------- 
# Create and commit two new branches of the (empty) trunk. 
#---------------------------------------------------------------------- 
echo Creating two new branches of the empty trunk ... 
svn cp $REPO/trunk $REPO/branches/a -m "branch a" 
svn cp $REPO/trunk $REPO/branches/b -m "branch b" 
svn co $REPO/trunk 
svn co $REPO/branches/a 
svn co $REPO/branches/b 

#---------------------------------------------------------------------- 
# Add and commit a new file on branch b. 
#---------------------------------------------------------------------- 
echo Adding and committing a new file on branch b ... 
cd b 
echo testing > foo 
svn add foo 
svn ci -m "committing new file" 

#---------------------------------------------------------------------- 
# Merge the changes from branch b to branch a. 
#---------------------------------------------------------------------- 
echo Merging the changes from branch b to branch a ... 
cd ../a 
svn merge ^/branches/b 
svn commit -m "merged b into a" 

#---------------------------------------------------------------------- 
# Reintegrate and commit branch a on the trunk. 
#---------------------------------------------------------------------- 
echo Reintegrating and committing branch a back to the trunk ... 
cd ../trunk 
svn merge --reintegrate ^/branches/a 
svn ci -m "merged a back into trunk" 

#---------------------------------------------------------------------- 
# Merge the changes from the trunk to branch b. 
#---------------------------------------------------------------------- 
echo Merging the changes from the trunk to branch b ... 
cd ../b 
svn up 
svn merge ^/trunk 
svn ci -m "refreshing b from trunk" 

#---------------------------------------------------------------------- 
# Look for a tree conflict on the file added earlier. 
#---------------------------------------------------------------------- 
echo Looking for tree conflicts for the file added earlier ... 
svn status 

沒有從上次(SVN狀態)命令,輸出這大概意味着沒有樹衝突。據我所知,http://svnbook.red-bean.com/中沒有明確的聲明表明分支之間的合併會導致問題(超出任何合併可能遇到的正常衝突,包括分支和中繼之間的合併)。如果有人有證據表明交叉分支合併比一般合併更麻煩,我會對檢查證據非常感興趣。在此之前,我傾向於建議OP在實踐中沒有任何內在危險。

+0

這很奇怪。我一行一行通過你的例子,並且在步驟「合併從主幹到分支b的變化」的步驟中產生樹衝突。svn輸出是「svn merge ^^/trunk ---將r5到r8合併到'。'中。 : çfoo.txt的 ü ---記錄爲R5的合併合併信息通過R8成。「」: 摹 總結的衝突: 樹衝突:1" ,這是與SVN版本1.7.8 – Neutrino 2015-11-20 11:25:26

+0

我知道svn 1.7現在是幾個舊版本,但升級到1.9會導致任何嘗試從1.7服務器檢出一個大型存儲庫,並在Windows上出現客戶端異常,所以我在1.7版本之前就已經搞定了,直到我們升級了服務器。 – Neutrino 2015-11-20 11:28:26

相關問題