天天看點

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後也是送出到了主幹而不是送出到了分支。

本文轉自shayang8851CTO部落格,原文連結:http://blog.51cto.com/janephp/1300561,如需轉載請自行聯系原作者

繼續閱讀