常用的svn命令:
首先你可以通過svn help/h來查看協助資訊。
開始工作
檢出(checkout)伺服器資料到本地
你剛入職一家公司,或新加入某個團隊,立馬參與到一個項目中,那麼就得擷取項目代碼,開始你的項目生涯。這個時候一般你需要檢出項目代碼:
svn checkout/co [directory] project(本地目錄名,可選) // 檢出版本3 svn checkout/co –revision/r 3 [directory] project(本地目錄名,可選)
接著你就可以通過svn info來查看版本資訊了。
匯入(import)項目
有時候項目尚未建立,你需要將本地的目錄放到SVN版本倉庫中:
svn import project(本地目錄名) [directory]
然後可以通過svn list/ls確認已經在版本倉庫中了。
更新
每次你開始編碼前,你都最好先更新下本地的工作目錄:
cd project svn update/up // 更新到版本3 svn update/up –revision/r 3
這樣你就可以在新的項目代碼基礎上工作了。
修改
可能你寫了一個新的模組,增加了一些新的檔案,需要納入項目的版本控制:
svn add index.html list.html ...
可能你發現某個模組已經陳舊了,不再使用了:
svn delete/del/remove/rm hello.html
可能你發現一個模組的命名不太合理,需要改名:
svn move/mv main.css common.css
可能你要建立一個新的較大的模組,需要新增目錄:
svn mkdir list
可能你發現要寫的模組代碼似於舊的模組,直接複製整個代碼:
svn copy/cp users/list.js list/list.js
檢查
忙碌的一天過去了,或者一個任務完成了,這個時候一般會將你的工作成果,也就是代碼更新到版本倉庫。
習慣上會先檢查下修改狀態:
svn status/stat/st
看到一些SVN狀態位資訊,確認是修改了哪些檔案,之後一般會自己code review一下代碼的改動,可能有的人會習慣直接用SVN方式來查看:
svn diff/di folder(本地目錄名,可選,預設目前的目錄) // 查看index.html目前的版本和版本3的差別 svn diff/di –revision/r 3 index.html // 查看index.html版本3和版本4的差別 svn diff/di –revision/r 3:4 index.html
一般來說這個時候,沒有什麼特殊情況,就直接進入“提交”階段了,然後結束一個工作日或工作周期,但難免會有些特殊情況出現。
取消修改
當你code review完後,發現有些改動不滿意,你可能又會取消這些修改:
svn revert index.html // 復原整個目錄 svn revert . -R/--recursive
分支操作
建立分支
建立一個分支
svn copy/cp svn://xxx.com/repo/trunk svn://xxx.com/repo/branches/test -m 'make branch test'
把工作目錄轉到分支
svn switch/sw svn://xxx.com/repo/branches/test
當然,也可以再轉到主幹svn switch/sw svn://xxx.com/repo/trunk。
給分支打標籤
複製最新的發布分支為標籤:
svn copy/cp svn://xxx.com/repo/branches/test svn://xxx.com/repo/tags/test_tag
合并一個分支到主幹
尋找到分支版本
cd branches/test(分支目錄) svn log –stop-on-copy
最後一個r11340就是建立分支時的reversion,也可:
cd trunk(主幹目錄) svn -q –stop-on-copy svn://xxx.com/repo/branches/test(分支url)
這條命令會查詢出自建立分支以後分支上的所有修改,最下面的那個版本號碼就是我們要找的版本號碼。
合并到主幹
cd trunk(主幹目錄) svn merge -r 11340(分支版本):HEAD svn://xxx.com/repo/branches/test(分支url)
兩個分支合并
假設99是從舊主幹引出,100打完tag,表示是新主幹。
合并最新代碼的意思是:將新主幹與舊主幹比對,並添加到99中。這樣99既有自己的新增的代碼,也同時有最新線上的代碼。
cd 99_Branch svn merge svn://xxx.com/repo/tags/project_Old_BL svn://xxx.com/repo/tags/project_New_BL svn ci -m 'merge 100 trunk'
但是後來,其他人又向100提了代碼,所以還需要將100分支(即打了tag後的100,打了tag前的100已是主幹)合并至99中。
合并辦法:找出100分支,比對與新主幹之間的差別,並添加到99中。這樣99就有最新的全部代碼了。
cd 99_Branch svn merge svn://xxx.com/repo/tags/project_New_BL svn:/xxx.com/repo/branches/100_Branch svn ci -m 'merge 100 branch'
發布
給當前主幹打個標籤,並且這個標籤不再改動了,但是實際上標籤和分支是一個意思,你可以在標籤上繼續做改動,但這不推薦。
svn copy/cp svn://xxx.com/repo/trunk svn://xxx.com/repo/tags/RB-1.0
合并主幹到分支
svn merge -r LastRevisionMergedFromTrunkToBranch:HEAD svn:/xxx.com/repo/branches/99_Branch
解決衝突
當發生衝突的時候,會提示如下資訊:
Conflict discovered in ‘index.html’.
Select: (p) postpone, (df) diff-full, (e) edit,
(mc) mine-conflict, (tc) theirs-conflict,
(s) show all options:
svn detects that theres a conflict here and require you to take some kind of action.
如果你輸入s選項,則會列出所有svn解決衝突的選項,如下所示:
(e) edit - change merged file in an editor #直接進入編輯
(df) diff-full -show all changes made to merged file #顯示更改至目標檔案的所有變化
(r) resolved -accept merged version of file
(dc) display-conflict -show all conflicts(ignoring merged version) #顯示所有衝突
(mc) mine-conflict -accept my version for all conflicts (same) #衝突以本地為準
(tc) theirs-conflict -accept their version for all conflicts (same) #衝突以伺服器為準
(mf) mine-full -accept my version of entire file (even non-conflicts) #完全以本地為準
(tf) theirs-full -accept their version of entire file (same) #完全以伺服器為準
(p) postpone -mark the conflict to be resolved later #標記衝突,稍後解決
(l) launch -launch external tool to resolve conflict
(s) show all -show this list
一般我們會選擇p稍後解決衝突,這樣會產生三個檔案:.mine, .rOLDREV, .rNEWREV。比如:
index.html index.html.mine index.html.r1 index.html.r2
解決衝突方法大致有一下幾種:
手工修改index.html檔案,然後將當前index.html作為最後提交的版本
svn resolve index.html –-accept working
選擇base版本,即index.html.rOLDREV作為最後提交的版本
svn resolve index.html –-accept base
使用index.html.rNEWREV作為最後提交的版本
svn resolve index.html –-accept theirs-full
使用index.html.mine作為最後提交的版本
svn resolve index.html –-accept mine-full // 或者用下面這條命令也可以 // svn resolve index.html –-accept theirs-conflict
提交代碼
最後,一切確認沒問題了:code review完畢,自己覺得代碼滿意了;然後也合并完別人的修改並且沒有衝突了。那麼就提交代碼吧:
svn commit/ci -m 'message'
匯出代碼
你想把你的代碼匯出,不包含svn版本資訊,那麼你可以:
svn export svn://xxx.com/repo/branches/test folder(本地目錄)