1. 程式人生 > >Subversion版本控制 — 分支和合並(三)

Subversion版本控制 — 分支和合並(三)

概要

一種專案開發流程:

(1)各開發成員建立自己的分支,並在此分支上開發。
(2)各開發成員把分支合併到主幹上,形成較為穩定的版本。
(3)各個成員重新從主幹上建立新的分支,回到第一步。
(4)迴圈,直到工程結束。

分支

(一)分支(branch)的定義

 A line of development that exists independently of another line, yet still shares a common history
if you look far enough back in time. A branch always begins life as a copy of someting, and moves
on from there, generating its own history. 

(二)為什麼要有分支

建立分支最大的目的是跟主線進行並行開發而不影響主線的開發。
This allows you to save your half-broken work frequently without interfering with others, yet you
can still selectively share information with your collaborators.
For projects that have a large number of contributors, it's common for most people to have working
copies of the trunk. Whenever someone needs to make a long-running change that is likely to
disrupt the trunk, a standard procedure is to create a private branch and commit changes there
until all the work is complete.
需要開發新的特性時,直接在主線trunk上開發可能導致其不穩定或不可用,這時可以建立分支來開發。 

(三)分支的生命週期

1. 何時建立?
For projects that have a large number of contributors, it's common for most people to have working
copies of the trunk. Whenever someone needs to make a long-running change that is likely to
disrupt the trunk, a standard procedure is to create a private branch and commit changes there
until all the work is complete.

2. 分支的維護
The good news it that you won't interfere with others. The bad news is that it's very easy to drift too
far apart. Remember that one of the problems with the "crawl in a hole" strategy is that by the time
you're finished with your branch, it may be near-impossible to merge your changes back into the
trunk without a huge number of conflicts.
Instead, you and other menbers can continue to share changes as you work. It's up to you to
decide which changes are worth sharing.Subversion gives you the ability to selective copy
changes between branches. And when you're completely finished with your branch, your entire
set of branch changes can be copied back into the trunk. 

(四)分支的建立

專案project1的檔案放在trunk目錄下,現在在branches目錄下建立分支zhangskd:
svn copy http://localhost/svn/project1/trunk http://localhost/svn/project1/branches/zhangskd \
-m "Creating a private branch of /project1/trunk."
顯示:Committed revision ***.
表示新建立的分支zhangskd的版本號為***。

合併

(一)合併(merge)的定義 

Instead of printing the differences to your terminal, it applies them directly to your working
copy as local modifications.

(二)合併的原理

A better name for the command might have been svn diff-and-apply, because that's all that
happens: two repository trees are compared, and the differences are applied to a working
copy. 

svn merge有三個引數:
1)An initial repository tree (often called the left side of the comparsion)
2)An final repository tree (often called the right side of the comparsion)
3)A working copy to accept the differences as local changes (often called the target)

所以合併的格式:svn merge leftside rightside target 

為什麼merge應該叫diff-and-apply?
leftside和rightside分別是兩個版本樹,對應於兩個不同的版本,即[email protected],如果它們的URL
相同,還可以表示為-r REV1:REV2 URL。可以用diff來檢視這兩個版本樹的區別:
svn diff [email protected] [email protected]
svn diff -r REV1 : REV2 URL
svn diff leftside rightside ,假設得到的修改集B。
target是要合併修改集B的分支。假設target在上次合併後,又產生了本地修改集A。
那麼本次合併要做的事情就是:把修改集B也當成本地修改集,應用到target上!

1)如果修改集A和修改集B不重疊,可以順利合併。此時target和上次合併時的版本相比,就有了
兩個本地修改集A和B,commit後可以得到新的版本。

2)如果修改集A和B有重疊,會產生衝突。這個時候就需要解決衝突後,才能順利合併。
這個時候會產生三個檔案:filename.working,filename.left,filename.right。這三個檔案
和svn update檢測到衝突後產生的三個檔案有著相同的作用。 

當本地修改集A為空的時候,不會有衝突出現。
To begin with, assume that your working copy has no local edits. When you svn update to a
particular revision, the changes set by the server will always apply "cleanly" to your working
copy. The server produces the delta by comparing two trees: a virtual snapshot of your
working copy, and the revision tree you're interested in. Because the lefthand side of the
comparision is exactly equal to what you already have, the delta is guaranteed to correctly
convert your working copy into the righthand tree. 

(三)分支的合併

合併分支的時候,需要指定要一個目標,用來接收這些修改集,如果沒有,則預設:
svn merge requires a working-copy path as a target, i.e. a place where it should apply the
tree-changes. If the target isn't specified, it assumes you are trying to perform one of the
following common operations:
1)You want to merge directory changes into your current working directory.
2)You want to merge the changes in a specific file into a file by the same name which
exists in your current working directory. 

和取消本地修改一樣,可以用svn revert來取消合併。
可以用svn delete來刪除分支。

(四)合併的最佳使用方式

1)手動記錄合併
主線和分支都在不斷的變化著,當我們要把主線的一些特性合併到分支上,應該從哪個版本開始合併?
假設分支的建立版本為10,且它已經合併主線版本10~20的變化了,這個時候應該從主線版本21開始
合併,才不會導致重複合併。
因為SVN並不會自動為我們記錄合併的資訊,所以我們需要手動記錄。
當每次提交合並時,可以在日誌中說明本次合併的範圍,比如此次分支合併了主線的哪些版本。
這樣,當下次分支要合併主線的變化時,就可以知道要從主線的哪個版本開始。

2)預覽合併
可以用--dry-run和svn status來預覽合併,提前知道本次合併是否會產生衝突。
例 svn merge --dry-run -r 10 : 20 http://192.168.1.1/svn/project/trunk
      svn status
      # nothing printed, working copy is still unchanged, no conflict will happen

The --dry-run option doesn't apply any local changes to the working copy. It only shows status
code that would be printed in a real merge.

3)常用分支模式
3.1) 釋出分支
釋出分支(Release Branch)指的是建立分支主要為了釋出新的版本,其過程如下:
開發者提交所有的新特性到主幹,在主幹上開發。
當小組認為軟體已經做好釋出準備(1.0版),主幹/trunk被拷貝到分支/branches/1.0。
專案組並行工作:一個小組對分支進行測試,另一小組在主幹上繼續新的工作(2.0)。如果一個bug
在任何位置被發現,錯誤修正則需來回合併。
當測試結束時,分支作為標籤釋出,/branches/1.0拷貝到/tags/1.0.0,這個標籤被打包釋出給客戶。
繼續在/trunk上為版本2.0工作,bug修正繼續從/trunk運送到/branches/1.0,如果積累了足夠的bug
修正,則可以釋出1.0.1版本:拷貝/branches/1.0到/tags/1.0.1,標籤被打包釋出。
當2.0完成時,重複上述測試、打標籤、釋出。

3.2) 特徵分支
特徵分支(Feature Branch)主要用於開發新的特性,同時不影響主線的穩定性和可用性。
Unlike release branches (which may need to be supported forever), feature branches are born,
used for a while, merged back to the trunk, then ultimately deleted. They have a finite span of
usefulness.
要注意保持特徵分支同步於主幹,因為在一個分支上工作數週或幾個月有很大風險,這個時候主幹
和分支可能會有大量的衝突!
This situation is best avoided by regularly merging trunk changes to the branch. Make up a
policy: once a week, merge the last week's worth of trunk changes to the branch.

Author

zhangskd @ csdn

Reference

svn book

相關推薦

Subversion版本控制分支和合

概要 一種專案開發流程: (1)各開發成員建立自己的分支,並在此分支上開發。 (2)各開發成員把分支合併到主幹上,形成較為穩定的版本。 (3)各個成員重新從主幹上建立新的分支,回到第一步。 (4)迴圈,直到工程結束。 分支 (一)分支(branch)的定義  A li

QT:控制元件精講單元元件 Item Widgets

    Qt Creator有3種Item Widgets。如下圖:     Item Widgets介紹     控制元件類     控制元件名   

Android自定義控制元件開發系列——仿支付寶六位支付密碼輸入頁面

        在移動互聯領域,有那麼幾家龍頭一直是我等學習和追求的目標,比如支付寶、微信、餓了麼、酷狗音樂等等,大神舉不勝舉,他們設計的介面、互動方式已經培養了中國(有可能會是世界)民眾的操作習慣:舉個小例子,對話方塊“確定”按鈕的左右位置就很有學問,如果大家都是左邊取消

Android 控制元件使用教程—— NineGridImageView 九宮格展示圖片

引子 上文降到RecyclerView的使用,確實非常方便易用,而且樣式多樣,很靈活。但在影象展示時,經常有朋友圈和微博等9張圖以內的圖片展示需求,這時候,不是一個可以無限下滑的RecyclerVew能解決的圖片顯示問題。那就需要一個類似於GridView的,

版本控制:集中式SVN vs 分散式GIT

Linus一直痛恨的CVS及SVN都是集中式的版本控制系統,而Git是分散式版本控制系統,集中式和分散式版本控制系統有什麼區別呢? 先說集中式版本控制系統,版本庫是集中存放在中央伺服器的,而幹活的時候,用的都是自己的電腦,所以要先從中央伺服器取得最新的版本,然後開始幹活,幹

C++ 控制結構和函式—— 函式IIFunctions II

引數按數值傳遞和按地址傳遞(Arguments passed by value and by reference) 到目前為止,我們看到的所有函式中,傳遞到函式中的引數全部是按數值傳遞的(by value)。也就是說,當我們呼叫一個帶有引數的函式時,我們傳遞到函式中的是變

unity3d學習筆記--不用一句程式碼快速載入控制人稱主角

本系列文章由Aimar_Johnny編寫,歡迎轉載,轉載請註明出處,謝謝。 http://blog.csdn.net/lzhq1982/article/details/12581957 我們的世界不能只有水流山川,花草樹木,讓我們的主角正式登場吧。這篇文章將介紹怎樣

svn branch and mergesvn切換分支和合詳解

先說說什麼是branch。按照Subversion的說法,一個branch是某個development line(通常是主線也即trunk)的一個拷貝,見下圖: branch存在的意義在於,在不干擾trunk的情況下,和trunk並行開發,待開發結束後合併回t

git的版本管理使用-拉取分支程式碼

git系列文章 參考文章 *之前2篇是在github上操作的git版本管理,這篇是在開源中國·碼雲 上面的git版本管理。使用下來都差不多,暫時沒有發現不一樣的內容。 關於分支內程式碼的拉取的問題: 問題詳述:看下圖,我們一般都是

svn分支和合實戰圖解

被svn分支和合並折騰了兩天了。適才終於搞定了分支和合並的問題,打包部署成功了。總結下,以防遺忘。專案前段時間因為要加入OSGi的blueprint方法釋出和獲取服務,從svn主幹上做了分支。如今分支的開發完成了,要求合併到主幹中。svn的目錄結構如下: 主幹trunk: https://192.168.0

C語言攻略指南流程控制

... cpp 流程控制 printf 循環結構 多重 -a 1-43 continue 流程控制語句,或者說控制流語句,是用於控制程序計算操作執行的次序,使我們能實現判斷,選擇,循環等操作。本篇將逐一描述 C語言中的流程控制語句。 選擇結構 if 語句 if(表達式

發編程:從AQS到CountDownLatch與ReentrantLock

splay public 繼續 for admin font 通信 html integer 一、目錄 1、AQS簡要分析 2、談CountDownLatch 3、談ReentrantLock 4、談消費者與生產者模式(not

log4j——如何控制不同級別的日誌信息的輸出?

erro basic man 所有 ack pan span 開關 eap 一:測試環境與log4j(一)——為什麽要使用log4j?一樣,這裏不再重述 1 老規矩,先來個栗子,然後再聊聊感受 package test.log4j.te

Dubbo框架應用之--Zookeeper註冊中心、管理控制臺的安裝及解說

root pan rda 查詢 bsp err 封裝 form keep 我是在linux下使用dubbo-2.3.3以上版本號的zookeeper註冊中心客戶端。Zookeeper是Apache Hadoop的子項目,強度相對較好,建議生產環境使用該註冊中

Git 教程:倉庫與分支

ide 不但 clas version span 右上角 director discard pre 遠程倉庫 到目前為止,我們已經掌握了如何在Git倉庫裏對一個文件進行時光穿梭,你再也不用擔心文件備份或者丟失的問題了。 可是有用過集中式版本控制系統SVN的童鞋會站出來說,這

java發基礎

線程生命周期 over out 處理請求 生命 inter 方式 希望 stat 第6章開始是第二部分,講解結構化並發應用程序,大多數並發應用程序都是圍繞“任務執行”構造的,任務通常是一些抽象的且離散的工作單元。 一、線程池 大多數服務器應用程序都提供了一種自然的任務邊界:

圖解ARP協議ARP防禦篇-如何揪出"內鬼""優雅的還手"

負責任 text 介紹 成功 過濾器 現在 導致 打開 是個 一、ARP防禦概述 通過之前的文章,我們已經了解了ARP攻擊的危害,黑客采用ARP軟件進行掃描並發送欺騙應答,同處一個局域網的普通用戶就可能遭受斷網攻擊、流量被限、賬號被竊的危險。由於攻擊門檻非常低,普通人只要拿

Java發程序設計 Java內存模型和線程安全

-h static tar -a 順序 語義 ret public font Java內存模型和線程安全 一 、原子性 原子性是指一個操作是不可中斷的。即使是在多個線程一起執行的時候,一個操作一旦開始,就不會被其它線程幹擾。 思考:i++是原子操作嗎? 二、有序性

USGS-EROS項目espa-surface-reflectance中的LaSRC Version 1.3.0模塊利用vs2010編譯出windows64位版本的使用

合成 ast mage files 關系 分享 一周 com window Landsat8大氣校正程序LaSRC是目前最好的,使用方式也夠傻瓜,輸入文件輸出結果。 但有一個限制,就是程序需要預先下載好的MODIS輔助文件來確定水汽、壓強等大氣參數。 如果待大氣校正的l

rup rand print div 每次 trace time () executor 本篇就是個小的demo,看到了覺得有意思就敲了敲代碼 問題描述: a,b,c,d四個盤,分別統計出大小,最後要求得四個盤總的大小的值。 首先想到的是CountDownLatch