持續更新中安全
前言:工做也有一年多了,涉及到寫代碼的小項目也作了若干個,看着Code文件夾裏的一個個項目文件夾,以爲真是得趕忙採用版本控制工具了,否則之後項目越作越多、越作越大,到時候再用版本控制工具的話,會多花費不少功夫。考慮到所在公司的實際狀況,決定採用TortoiseSVN。其實迅速找到一個比較靠譜的工具就行,更重要的還在於人,工具只是一個輔助,不能捨本逐末。服務器
TortoiseSVN的學習和使用是根據官方教程的流程一步步進行的。svn
代碼庫,在本機上的話,就是用於存放全部本身的代碼的地方。在服務器上的話,就是用於保存團隊全部代碼。若是隻想備份一個地方的代碼,那就備份這裏的吧。工具
這是實際寫代碼的地方,好比開發者將代碼從服務器上拖到本機,而後在本機寫代碼,編寫完成後再提交到服務器上。在這個過程當中,存在於本機上的代碼即爲「Working Copy」。學習
由於TortoiseSVN只是將本身集成到了系統右鍵菜單中,因此若是沒有再安裝加強TortoiseSVN功能的軟件的話,直接在Windows資源管理器中經過右鍵菜單進行代碼管理便可。this
這裏咱們先迅速瞭解一下TortoiseSVN的基本功能。.net
在實際開發環境中,代碼庫應當放在一個合適的位置,並用Subversion服務來進行管理。不過TortoiseSVN也支持直接訪問本機的代碼庫所在目錄。版本控制
在這裏,咱們先在D盤Code目錄下新建一個Repository
文件夾,在該文件夾上點擊右鍵,選擇TortoiseSVN
菜單中的Create Repository here...
這一項,在彈出的窗口中點擊Create folder structure
按鈕,這樣就在這個目錄下創建起空的代碼庫了。日誌
注意:若是有團隊合做編寫代碼的須要,建議儘可能使用Subversion server的方式進行管理,不要只是簡單地經過局域網來共享代碼,相信這條建議後面必定有許多慘痛的教訓。code
代碼庫雖然創建起來了,但裏面仍是空的,咱們先導入一個現有的項目試試看。
右鍵點擊現有項目HelloWorld的文件夾,選擇TortoiseSVN
菜單中的Import
這一項,在彈出窗口中的URL of repository
這一項中,指定該項目要導入到什麼目錄中,這裏咱們填寫file:///d:/Code/Repository/trunk/HelloWorld
。
此外,在彈出窗口的Import message
這一項中,能夠填寫所導入項目的信息。我的感受能夠寫得詳細一些,由於是導入現有的項目,那確定已經多多少少有一些功能了,在導入的時候把項目現有的功能詳細地列一下,後面再增長或者修改功能的時候也方便進行對照。無論作什麼工做,提早爲未來的需求考慮一下,是個很好的習慣。
導入了一個5G多的項目,可是查看
Repository
目錄,卻只有1G的大小,是否是說導入項目並非將項目整個目錄從原來的位置複製一份到Repository,而只是創建對原項目的索引?
項目已經導入到Repository裏面了,下面就須要再創建一份工做拷貝用於進一步的開發,要注意前面的導入項目這步操做並不會將導入後的項目文件夾自動轉換爲工做拷貝。在Subversion中,建立一份全新的工做拷貝的術語叫作Checkout
。
這裏咱們先新建D:/Code/Project/HelloWorld
這麼一個文件夾,在該文件夾上點擊右鍵,選擇TortoiseSVN
菜單中的Checkout…
,而後輸入file:///d:/Code/Repository/trunk/HelloWorld
便可。
此次檢出的時候又查看了一下,卻是把項目整個文件夾原樣地複製到
D:/Code/Project/HelloWorld
目錄下了。注意:在默認狀況下,
Checkout…
功能是直接顯示在右鍵菜單中的,而且有SVN
這個詞做爲前綴。是由於TortoiseSVN中的功能,若是直接顯示在右鍵菜單而不是做爲TortoiseSVN
的子菜單顯示的話,都會有SVN
這個前綴。
在檢出一份工做拷貝以後,就能夠開始修改代碼了。對比修改先後的不一樣之處,只須要在資源管理器中被修改的文件上點擊右鍵,選擇TortoiseSVN
菜單中的Diff
便可。若是修改後的代碼沒有問題,就能夠提交了,右鍵點擊工做拷貝文件夾,選擇TortoiseSVN
菜單中的Commit
,提交對話框列出了全部已被修改的文件,每一個文件前都有一個複選框,這樣能夠只提交部分文件的更改。在對話框中再補充本次修改的說明以後,就能夠提交了。
TortoiseSVN不只能夠對文件的修改作記錄,固然也能夠對文件的新增作記錄。右鍵點擊工做拷貝目錄中的某一文件夾,選擇TortoiseSVN
菜單中的Add
,便會顯示在本機上新增但未添加到TortoiseSVN中的文件。若是直接在某個或者某幾個在本機上新增的文件上點擊右鍵,選擇TortoiseSVN
菜單中的Add
,即可直接將這些文件添加到TortoiseSVN的記錄中。
TortoiseSVN的最經常使用的功能之一就是Log Dialog(日誌對話框),在這個窗口中會顯示每一次代碼提交的信息。
既然是版本控制工具,那麼既能提交新版的代碼,也應當可以恢復到舊版的代碼。是的,若是在最近一次提交以後對代碼作了更改,但又想恢復至提交時的版本,那麼右鍵點擊工做拷貝目錄中的某一文件,選擇TortoiseSVN
菜單中的Revert
便可,若是隻想撤銷文件中的部分更改,那就用TortoiseMerge吧,能夠對比每一處更改,並只對部分更改進行撤銷。
若是想將項目總體回退至某個已提交的版本以前的狀態,打開Log Dialog,點擊對應的版本,右鍵菜單中選擇「Revert changes from this revision」,這樣代碼就會回退至該版本以前的狀態了。
Repository不只以樹狀目錄結構保存文件,而且還會保存文件及文件夾的全部更改:增長/刪除/移動。想知道上週三某個目錄裏面有什麼?好說。
這就是版本控制工具的核心功能:記錄並追蹤對數據所作的全部更改。
假設服務器上有一份代碼 helloworld.c,須要小明和小黃來共同編輯維護,小明先寫完了本身的功能,把文件放到服務器上了,小黃後來也寫完了,也把文件放到服務器上了,問題來了,小明的文件被小黃直接覆蓋了!這該怎麼辦?這就須要版本控制來幫忙了。
這個方案比較簡單,就像是在圖書館借書:小明把一本書借走了,小黃這時候就無法借這本書了,這時候這本書就被「鎖定」了,只有等小明讀完了這本書,還到圖書館以後,這本書才被「解鎖」,這時候小黃才能再借這本書。這套方案有什麼缺點呢?
你拿走了,我就不能用了。好比小明把書借走了,可是一直沒想起來還回來,那小黃就只能乾等着,小明何時換回來,小黃何時才能借。
你只看前十頁,我只看後十頁,一塊兒看唄?——不行。好比小明只須要編輯某個代碼源文件的前面一部分,小黃只須要編輯後面一部分,這個時候,小黃依然只能乾等着,你說浪不浪費時間?
鎖越多越安全?那可未必。好比小明在修改文件A,小黃在修改文件B,而A、B之間有依賴關係,結果他倆一修改,最後兩個文件都不能用了!你說這可咋整。
Subversion,CVS以及其它的一些版本控制系統採用的則是這套方案。小明和小黃從服務器上覆制同一份文件,在各自的電腦上進行編輯,而後提交至服務器時,在版本控制系統和人工判斷的共同處理之下,對文件進行合併,最後兩我的的修改都能生效,而且還不會產生問題。在這個時候,起關鍵做用的是人之間的交流,怎樣處理兩份文件相沖突的地方,以保證已有功能的正常使用,還能確保新功能的成功上線,都是須要人的判斷的。