SVN 分支/合并/切換

本文無條理性,僅作自我參考。

花費了兩個半下午,走馬觀花的看了一下說明文檔,SVN設計的太復雜,對我這樣的,不在一個集體的的業余開發者,要理解起來真是太難了。。。。??


?

分支

Make branches as often as you want.(這是SVN官方說明中的一句話)

There's nothing special about this working copy; it simply mirrors a different directory in the repository.

版本控制系統的一個特性是能夠把各種修改分離出來放在開發品的一個分割線上。這條線被稱為分支。分支經常被用來試驗新的特性,而不會對開發有編譯錯誤的干擾。當新的特性足夠穩定之后,開發品的分支就可以混合回主分支里(主干線).

假設已經建立分支,如果其他人的?working?copy 在trunk上,當你提交分支的更改時,主干不會發生改變。

分支背后的關鍵概念:You should remember two important lessons.

First, Subversion has no internal concept of a branch—it knows only how to make copies.When you copy a directory, the resultant directory is only a “branch” because you attach that meaning to it. You may think of the directory differently,or treat it differently, but to Subversion it's just an ordinary directory that happens to carry some extra historical information.
在版本庫中的復制,都是“廉價復制”。

Second, because of this copy mechanism, Subversion's branches exist as normal filesystem directories in the repository. This is different from other version control systems, where branches are typically defined by adding extra-dimensional “labels” to collections of files. The location of your branch directory doesn't matter to Subversion. Most teams follow a convention of putting all branches into a /branches directory, but you're free to invent any policy you wish.

合并(保持分支同步)

  ------frequently keeping your branch in sync with the main development line helps prevent “surprise” conflicts when it comes time for you to fold your changes back into the trunk.

由于有眾多的人參與項目,大多數人擁有主干拷貝是很正常的,任何人如果進行一個長周期的修改會使得主干陷入混亂,所以通常的做法是建立一個私有分支,提交修改到自己的分支,直到這階段工作結束。所以,好消息就是你和Sally不會互相打擾,壞消息是有時候分離會太遠。

記住“閉門造車”策略的問題,當你完成你的分支后,可能因為太多沖突,已經無法輕易合并你的分支和主干的修改。

相反,在你工作的時候你和Sally仍然可以繼續分享修改,這依賴于你決定什么值得分享,Subversion給你在分支間選擇性“拷貝”修改的能力,當你完成了分支上的所有工作,所有的分支修改可以被拷貝回到主干。在Subversion術語里,這種從一個分支復制修改到另一個分支的活動稱為合并,它是使用svn merge命令執行。

?

svn merge另一個常用的做法

是取消已經做得提交,假設你愉快的在/calc/trunk工作,你發現303版本對integer.c的修改完全錯了,它不應該被提交,你可以使用svn merge來“取消”這個工作拷貝上所作的操作,然后提交本地修改到版本庫,你要做得只是指定一個相反的區別。(你可以通過指定--revision 303:302--change -303

svn merge與svn ?diff

......At this point, the wise thing to do is look at the changes carefully with svn diff, and then build and test your branch. Notice that the current working directory (“.”) has also been modified; the svn diff will show that its svn:mergeinfo property has been either created or modified. This is important mergerelated metadata(元數據) that you should not touch, since it will be needed by future svn merge commands.

但是svn merge沒有這樣的保證,會導致很多的混亂:用戶可以詢問服務器比較任何兩個樹,即使一個與工作拷貝毫不相關的!這意味著有潛在的人為錯誤,用戶有時候會比較兩個錯誤的樹,創建的增量數據不會干凈的應用,svn merge會盡力應用更多的增量數據,但是有一些部分也許會難以完成,就像Unix下patch命令有時候會報告“failed hunks”錯誤,svn merge會報告“skipped targets”:

指出svn diff和svn merge區別的重要性在于,前一個命令忽略祖先,如果你詢問svn diff來比較文件foo.c的版本99和102,你會看到行為基礎的區別,diff命令只是盲目的比較兩條路徑,但是如果你使用svn merge是比較同樣的兩個對象,它會注意到他們是不關聯的,而且首先嘗試刪除舊文件,然后添加新文件,輸出會是一個刪除緊接著一個增加。

如果你使用svn merge進行比較,你會看到第一個目錄樹被刪除,而第二個樹添加上!在這個情況下,你僅僅是希望svn merge以路徑為基礎比較兩棵樹,而忽略文件和目錄的不相關性,當為合并命令添加--ignoreancestry選項時,就會像svn diff一樣工作。

?

切換

“Switching” a working copy that has no local modifications to a different branch results in the working copy looking just as it would if you'd done a fresh checkout of the directory. It's usually more efficient to use this command, because often branches differ by only a small degree. The server sends only the minimal set of changes necessary to make your working copy reflect the branch directory.

?

svn switch命令改變存在的工作拷貝到另一個分支,然而這個命令在分支上工作時不是嚴格必要的,它只是提供了一個快捷方式。在前面的例子里,完成了私有分支的建立,你取出了新目錄的工作拷貝,相反,你也可以簡單的告訴Subversion改變你的/calc/trunk的工作拷貝到分支的路徑。

?

svn switch命令也可以帶--revision(-r)參數,所以你不需要一直移動你的工作拷貝到分支的HEAD。
當然,許多項目比我們的calc要復雜的多,有更多的子目錄,Subversion用戶通常用如下的法則使用分支:
1. 拷貝整個項目的“trunk”目錄到一個新的分支目錄。
2. 只是轉換工作拷貝的部分目錄到分支。

切換和更新

Have you noticed that the output of svn switch and svn update looks the same? The switch?command is actually a superset of the update command.

svn switch是svn update的一個變種,具有相同的行為,當新的數據到達時,任何工作拷貝的已經完成的本地修改會被保存。

?當你運行svn update時,你會告訴版本庫比較兩個目錄樹,版本庫這樣做,并且返回給客戶區別的描述,svn switch和svn update兩個命令唯一區別就是update會一直比較同一路徑。That is, if your working copy is a mirror of /calc/trunk, svn update will automatically?compare your working copy of /calc/trunk to /calc/trunk in the HEAD revision. If?you're switching your working copy to a branch, svn switch will compare your working copy of?/calc/trunk to some other branch directory in the HEAD revision.換句話說,一個更新通過時間移動你的工作拷貝,一個轉換通過時間和空間移動工作拷貝。

?If the working copy needs to reflect(映射) a new directory within the repository, use just svns witch.If the working copy still reflects the same repository directory, but the location of the?repository itself has changed, use svn switch with the --relocate option。


另一個Subversion模型的可愛特性是分支和標簽可以有有限的生命周期,就像其它的版本化的項目,舉個例子,假定你最終完成了calc項目你的個人分支上的所有工作,在合并了你的所有修改到/calc/trunk后,沒有必要繼續保留你的私有分支目錄。

在我們的例子里,你的個人分支只有一個相對短的生命周期:你會為修復一個Bug或實現一個小的特性來創建它,當任務完成,分支也該結束了。在軟件開發過程中,有兩個“主要的”分支一直存在很長的時間也是很常見的情況,舉個例子,假定我們是發布一個穩定
的calc項目的時候了,但我們仍會需要幾個月的時間來修復Bug,你不希望添加新的特性,但你不希望告訴開發者停止開發,所以作為替代,你為軟件創建了一個“穩定”分支...。

??


?

?

SVN可以為一個版本庫中的內容(主干)建立一個分支.分支和主干完全獨立,就相當于把代碼再復制(便宜復制)一份,重新添加到版本庫中。但SVN提供另一個功能,就是把主干做出的修改合并到分支中,以及把分支修改的內容合并到主干中。當然,我們也可以把主干的版本庫的路徑切換到分支上,然后更新,來實現把分支的修改更新到主干;以及修改分支路徑來同步主干的修改。但過程復雜,還容易出錯。

1.將一個整項目建一個分支.

選擇要復制的源位置有三個選項:

  版本庫中的最新版本
    新分支直接從倉庫中的最新版本里復制出來。不需要從你的工作副本中傳輸任何數據,這個分支的建立是非常快的。
  在版本庫中指定具體的版本
    在倉庫中直接復制建立一個新分支同時你也可以選擇一個舊版本。假如在你上周發布了項目時忘記了做標記,這將非常有用。如果你記不起來版本號,通過點擊鼠標右鍵來顯示版本日志,同時從這里選取版本號。和上次一樣不需要從你的工作副本中傳輸任何數據,這個分支建立起來是非常快的。
  工作副本
    新的分支是一個完全等同于你的本地工作副本的一個副本。如果你更新了一些文件到你的工作副本的某個舊版本里,或者你在本地做出了修改,這些改變將準確無誤的進入副本中。自然而然地這種綜合的標記會包含正在從工作副本傳輸到版本庫的數據,如果這些數據還不存在的話。

?

注意:是否把主干的路徑切換到新分支(把的工作副本自動切換到最新創建的分支)

  如果勾選了,建立分支后,在主干里做出的修改并提交后,更新會提交到分支上。主干的版本源內容不會變.

  但是如果你打算這么做,首先要確認你的工作副本沒有被修改。如果有修改的話,當你轉換后這些修改將會混合進你的工作副本分支里。按下確認提交新副本到版本庫中。別忘了提供一條日志信息。需要注意的是這個副本是在版本庫內部創建的。

?

為了避免產生困惑。以及失誤。建議在建立的時候不要勾上 "切換到分支" 的選項。如果勾上了,我們還是切換回去:

這時你便可以在 /calc/branches/my-calc-branch 分支上開發新的功能,且不會影響到其他成員開發或維護主干的內容。

切換操作起來就象更新,因為它沒有丟棄你在本地做的修改。在工作副本里當你進行切換的時候任何沒有提交過的修改都會被混合。如果你不想看到這樣的結果,那么你可以有兩種選擇,要么在切換前提交修改要么把工作副本恢復到一個已經提交過的版本(比如最新版本)。

?

?

?

2.合并主干的變更到分支上

經常將 開發主干 ( /calc/trunk ) 的變更透過 svn merge 合并至 分支 ( /calc/branches/my-calc-branch )是一個非常好的習慣,這樣才不會讓你脫離主干(trunk) 過久而導致將分支 ( /calc/branches/my-calc-branch) 合并回 主干 ( /calc/trunk ) 時發生許多沖突。?

?

?從主干 ( /calc/trunk ) 合并至分支 ( /calc/branches/my-calc-branch ) 通常選第 1 個,也就是 [Merge a?range of revisions]

注意.我們是在分支上使用的 Merge 功能.因為是要在分支上應用主干的更新.

?

?

在 Merge 的窗口有以下注意事項:

1.合并的來源,由于我們打算從主干 ( /calc/trunk ) 合并至分支 ( /calc/branches/my-calc-branch ),所以合并的來源要選 /calc/trunk 才對!
2.合并的結果會直接與目前「工作目錄」(Working Copy) 做比對,并修改目前工作目錄中的所有文件。因此建議在做合并之前可以將所有尚未 commit 的檔案先 commit 到版本庫,避免不必要的沖突事件發生。

?

在正式進行合并(Merge)之前,建議先執行 Test merge 看看是否會發生什么事!


若無異狀則可直接按下 [Merge] 按鈕進行合并動作,這時從 主干 ( /calc/trunk ) 分支出來的到目前工作目錄的版本就會做個比較,然后直接套用變更到你現有的文件、目錄或屬性里。

?

在合并之后如果沒有發生沖突,不代表真的沒沖突,所以必須再次對原始碼做出驗證后才能 commit 進版本庫,
建議可參考以下流程:
1.將項目進行建置(Build)
2.如果沒問題再對項目進行單元測試(Unit Testing)或手動測試(Manual Testing)
3.如果都沒問題再 commit 目前合并無誤的版本到版本庫!

?

If you encounter serious problems, you can always abort the local changes by running svn revert .

3.合并分支到主干

最后我們的 my-calc-branch 分支已經將新功能開發完成且測試無誤,所以要將 分支 ( calc/branches/mycalc-branch ) 的最終版本合并回 主干 ( /calc/trunk ),這時的手續如下:

?

??

?

從 分支 ( /calc/branches/my-calc-branch ) 合并回 主干 ( /calc/trunk ) 通常選第 2 個,而特別選擇[Reintegrate a branch] 這個選項是很重要的,因為這有以下好處:
1.讓 Subversion 能知道 主干 ( /calc/trunk ) 是從哪個分支、哪些版本合并進來的
2.有效節省 Subversion Repository (SVN儲存庫) 的空間,因為不用重復儲存分支的所有變更信息
3.可以產生 Revision graph 得知項目開發的分支狀況

?

一樣可以先 測試合并(Test merge) 再正式進行 合并(Merge)

?

?

4.合并完后再將變更 commit 到版本庫

?

?

4.刪除使用完畢的分支

當 分支 ( /calc/branches/my-calc-branch ) 合并回 主干 ( /calc/trunk ) 并 commit 了之后,該分支就沒
用了,該分支如果未來不再更新或繼續開發,Subversion 也不會繼續追蹤這個分支的變更 (因為之前已經
Reintegrate 過了),建議將該分支刪除。

?

?

沒有必要繼續保留你的私有分支目錄。刪除已經完成的分支避免其他人繼續使用該分支開發,減少版本庫的復雜程度。

?

?

另參考:http://www.cnblogs.com/dabaopku/archive/2011/05/21/2052820.html

?

?

轉載于:https://www.cnblogs.com/InspiringMind/p/4661093.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/258581.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/258581.shtml
英文地址,請注明出處:http://en.pswp.cn/news/258581.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

使用Firefox或Chrome的雇員表現更好不頻繁跳槽

一家銷售軟件幫助雇主招募雇員和留住雇員的公司Cornerstone OnDemand稱,使用非默認瀏覽器如Firefox或Chrome的雇員表現更好不頻繁跳槽。 這項研究旨在幫助那些跳槽率過高的行業,比如呼叫中心的年跳槽率高達45%。對50000名在線工作評估參與者的數據進行分…

關于FCN的數據集著色說明

前方我們講解了《 FCN-數據篇》。里面包含了如何制作類似pascal voc的label。很大篇幅在談如何著色,如何轉化為索引圖像。 由于一些內容參考網上的資料,所以對里面的一些操作含義也有些糊涂。 其實網上的東西也不都對,很多人云亦云。所以需要…

mongobd python_Python操作MongoDB數據庫PyMongo庫使用方法

引用PyMongo復制代碼 代碼如下:>>> import pymongo創建連接Connection復制代碼 代碼如下:>>> import pymongo>>> conn pymongo.Connection(localhost,27017)或復制代碼 代碼如下:>>> from pymongo import Connection>>> conn C…

Android Property Animation動畫

3.0以前,android支持兩種動畫模式,tween animation,frame animation,在android3.0中又引入了一個新的動畫系統:property animation,這三種動畫模式在SDK中被稱為property animation,view animation,drawable animation…

angular實現select的ng-options

ng實現簡單的select <div ng-controller"ngSelect"><select ng-model"vm.selectVal" ng-options"o.title for o in vm.optionsData"><option value"">請選擇</option></select> </div> var app …

Ubuntu14.04下Mongodb數據庫可視化工具安裝部署步驟(圖文詳解)(博主推薦)

不多說&#xff0c;直接上干貨&#xff01; 前期博客 Ubuntu14.04下Mongodb&#xff08;離線安裝方式|非apt-get&#xff09;安裝部署步驟&#xff08;圖文詳解&#xff09;&#xff08;博主推薦&#xff09; Ubuntu14.04下Mongodb官網安裝部署步驟&#xff08;圖文詳解&#x…

deeplab運行指南

以下僅僅為一個總結&#xff0c;參考了網上的眾多資料&#xff0c;僅備忘記。 主要鏈接 deeplab主頁&#xff1a;http://liangchiehchen.com/projects/DeepLab.html官方代碼&#xff1a;https://bitbucket.org/aquariusjay/deeplab-public-ver2python 版caffe實現&#xff1a…

tensorboard使用_colab打不開tensorboard的解決辦法

2020.4.1更新&#xff1a;colab現在自帶tensorboard的魔術方法了&#xff0c;用這個命令就能展示tensorboard%load_ext tensorboard %tensorboard --logdir ./log/train# 加載一次后&#xff0c;如果要重新加載&#xff0c;就需要使用reload方法 %reload_ext tensorboard %tens…

構造函數為什么不能是虛函數 ( 轉載自C/C++程序員之家)

從存儲空間角度&#xff0c;虛函數對應一個指向vtable虛函數表的指針&#xff0c;這大家都知道&#xff0c;可是這個指向vtable的指針其實是存儲在對象的內存空間的。問題出來了&#xff0c;如果構造函數是虛的&#xff0c;就需要通過 vtable來調用&#xff0c;可是對象還沒有實…

小程序“自定義關鍵詞”功能的常見問答

我們知道小程序可以通過線下掃碼、公眾號、好友分享、長按小程序碼、搜索小程序名稱來找到&#xff0c;現在又多了一個新方式——小程序后臺新增自定義關鍵詞功能&#xff1a;已發布小程序的開發者&#xff0c;可提交最多10個與小程序業務相關的關鍵詞&#xff0c;幫助你的小程…

語義分割深度學習方法集錦

轉載&#xff1a;https://github.com/handong1587/handong1587.github.io/edit/master/_posts/deep_learning/2015-10-09-segmentation.md Papers Deep Joint Task Learning for Generic Object Extraction intro: NIPS 2014homepage: http://vision.sysu.edu.cn/projects/d…

員工培訓與開發實訓心得體會_公司新員工培訓心得體會800字范文

點擊藍字關注我們培訓是一次能夠快速提升我們的機會&#xff0c;而每個新員工也是通過培訓盡快的融入公司的。因此&#xff0c;我們要更加重視培訓一些!下面是小編為大家整理的公司新員工培訓心得體會&#xff0c;希望對大家有幫助。公司新員工培訓心得體會800字為了讓我們新進…

Nginx ab壓力測試

20-ab壓力測試及nginx性能統計模塊 優化的啟發&#xff0c;打開的文件太多 Nginx 錯誤日志顯示&#xff0c;打開文件數太多 系統層面 more /proc/sys/net/core/somaxconn 單個Nginx 測試index.html 沒優化前 [root/home/www]#ab -c 4000 -n 100000 http://test.demo.com/inde…

Code First02---CodeFirst配置實體與數據庫映射的兩種方式

Code First有兩種配置數據庫映射的方式&#xff0c;一種是使用數據屬性DataAnnotation&#xff0c;另一種是Fluent API.這兩種方式分別是什么呢&#xff1f;下面進行一一解釋&#xff1a;DataAnnotation的配置方式需要你給定義實體和值對象的類和類中的屬性加上與數據庫映射相關…

sigmoid函數的數值穩定性

在深度學習中&#xff0c;我們常常選用sigmoid函數作為激活函數。sigmoid函數的具體形式如下&#xff1a; f(x)11e?xf(x)=\frac{1}{1+e^{-x}}曲線表示為&#xff1a; 再畫大一點&#xff0c;取x區間更大一些&#xff0c;則為&#xff1a; 顯然從圖像上看&#xff0c;sigmoid函…

查看CentOS版本方法

有以下命令可以查看&#xff1a; # lsb_release -a LSB Version: :core-3.1-ia32:core-3.1-noarch:graphics-3.1-ia32:graphics-3.1-noarchDistributor ID: CentOSDescription: CentOS release 5.4 (Final)Release: 5.4Codename: Final這個命令適用于所有的li…

windows遠程連接ubuntu 黑屏_Windows跟Windows遠程連接傳輸文件

關注奕奇科技&#xff0c;學習更多小妙招電腦小知識&#xff0c;值得收藏我們一般在使用windows遠程連接時需要傳輸文件該怎么辦&#xff1f;我們可以插入U盤導入導出&#xff0c;但這樣很是麻煩而且如果身邊暫時沒有U盤的情況就要通過社交工具傳播文件&#xff0c;大的文件也更…

思維導圖分析http之前端組成

思維導圖分析http前端組成全文總覽本文分為三個部分&#xff1a;前端組成&#xff0c;http協議&#xff0c;http服務器應用程序。http的應用按照我自己的理解分為前端應用以及后端應用&#xff0c;所以我分別寫了前端組成以及http服務器應用程序兩章&#xff0c;中間穿插了一章…

Linux命令工具基礎02 文件及目錄管理

文件及目錄管理 文件管理不外乎文件或目錄的創建、刪除、查詢、移動&#xff0c;有mkdir/rm/mv 文件查詢是重點&#xff0c;用find來進行查詢&#xff1b;find的參數豐富&#xff0c;也非常強大&#xff1b; 查看文件內容是個大的話題&#xff0c;文本的處理有太多的工具供我們…

caffe 關于Deconvolution的初始化注意事項

對于fcn&#xff0c;經常要使用到Deconvolution進行上采樣。對于caffe使用者&#xff0c;使用Deconvolution上采樣&#xff0c;其參數往往直接給定&#xff0c;不需要通過學習獲得。 給定參數的方式很有意思&#xff0c;可以通過兩種方式實現&#xff0c;但是這兩種方式并非完…