SVN:代碼回滾問題與switch

第一種情況:當代碼還未提交時


這種情況下,使用 svn revert 就能取消之前的修改。

# svn revert [-R] somefile

其中somefile可以是(目錄或文件的)相對路徑也可以是絕對路徑。

當somefile爲單個文件時,直接svn revert somefile就行了;

當somefile爲目錄時,需要加上參數-R(Recursive,遞歸),否則只會將somefile這個目錄改動。

在這種情況下也可以使用svn update命令來取消對之前的修改,但不建議使用。因爲svn update會去連接倉庫服務器,耗費時間。

注意:svn revert本身有固有的危險,因爲它的目的是放棄未提交的修改。一旦你選擇了恢復,Subversion沒有方法找回未提交的修改。


第二種情況:改動已經被提交


這種情況下,用svn merge命令來進行回滾,回滾的操作過程如下:
1、保證我們拿到的是最新代碼:
svn update

假設最新版本號是28。

2、然後找出要回滾的確切版本號:

svn log [somefile]

如果log很多,可以使用參數--limit

svn log --limit 10 [somefile]

假設根據svn log日誌查出要回滾的版本號是25,此處的somefile可以是文件、目錄或整個項目

如果想要更詳細的瞭解情況,可以使用

svn diff -r 28:25 [somefile]

3、回滾到版本號25:

svn merge -r 28:25 [somefile]
爲了保險起見,再次確認回滾的結果:
svn diff [somefile]
發現正確無誤,提交。
4、提交回滾:
svn commit -m "Revert revision from r28 to r25,because of ..."

提交後版本變成了29。


將以上操作總結爲三條如下:
1. svn update,svn log,找到最新版本(latest revision)
2. 找到自己想要回滾的版本號(rollback revision)
3. 用svn merge來回滾: svn merge -r 28:25 somefile

注意:雖然 svn up -r 25 somefile 也可以使文件回滾,但是當提交時由於不是最新版本而無法提交,還需要先更新,拷貝,再提交,所以不建議使用。


補充:

svn忽略文件或文件夾

svn propset svn:ignore '*' template_c/


三、switch的理解

switch用於在同一個版本庫內不同分支之間的切換
relocate用於版本庫訪問地址變更時,重新定位版本庫

比如,由於SVN服務器更換到另一臺主機上,這是SVN服務器的地址改變了,那麼各客戶端就無法連接SVN服務器了,這時各客戶端就需要執行relocate,將本地工作區的連接到新的服務器上去

而如果同一個版本庫內,如果有多個分支,比如你現在正在trunk上開發,但需要切換到某個分支上開發,那麼你可以用switch來進行這個切換操作,這時SVN會比較trunk和這個分支之間的差異,將差異部分傳送到你的本地工作區,而不用將整個分支傳送給你,從而避免巨量數據的傳輸。switch操作之後,你所進行的update、commit操作都變成了針對那個分支,當你在分支上的工作完成後,還可以再次switch回trunk。

switch還有另外一些用途,比如希望讓分支中的某個文件夾保持和trunk同步,因爲有人正在trunk的這個文件夾中進行開發,在分支中想用到開發的最新成果,那麼就可以在分支的這個文件夾上設置swtich到trunk,這時update整個分支的話,就會把trunk上的這個文件夾取下來了。但是,當然你如果修改了這個文件夾的內容,commit後也是提交到了主幹而不是提交到了分支。



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章