在每次提交版本之前,我們都需要先update一下本地的版本,檢查本地文件是否已經版本過低(out-of-date)。這時我們通常會發現:
A.有些本地修改和版本庫的修改發生了沖突,且必須以版本庫的為準
B.有些本地修改是不必要的
面對這些問題,我們的第一想法就是把被修改的文件恢復到修改前的樣子。但是如果被修改的文件修改點很分散,或者數量眾多,甚至我們忘記了備份原有的文件....那么應該怎么辦?有沒有一種方法可以幫我們一次性地將對某個文件所做的全部修改都復原?有!這就是svn revert命令。
svn revert命令用于回滾本地尚未提交的任何操作(例如add, delete操作),文件或目錄的內容,甚至屬性的修改。
實際上svn revert命令是一把“雙刃劍”。它有幾個需要特別小心的地方:
A.回滾是不可恢復的。由于svn revert回滾的是任何未提交的操作,內容,屬性。所以意味著SVN不會為你保存任何回滾前的歷史版本
B.回滾是不止于一點而是一段時間的。只要你沒有提交版本,那么不論你多久之前所做的修改都會被回滾,而不僅僅是最近一次的修改
C.鑒于svn revert命令如此危險的特性,所以svn revert命令強制使用者必須給出一個明確的路徑參數,不允許svn revert這樣的命令執行。
下面我們逐個來看revert是如何進行的:
●回滾文件的內容
假設現在我們的ECoupon項目下有文件如下






我們修改read-from-wc.txt文件,在其末尾增加一句話:Will revert by "svn revert" command。現在我們來看本地的差異比較











我們看到svn status命令顯示本地的文件已經被改變(M),而且svn diff命令展示了這次改變的內容就是增加了(+)了“Will revert by "svn revert" command。”這句話(關于svn diff命令的使用會在后面講解)。現在我們來回滾這個文件的內容




可以看到svn revert確實把本地修改的內容回滾了。那么它是如何知道應該回滾到那個版本的呢?答案就是靠本地工作副本每個目錄下的那個.svn目錄。在這個目錄下存儲了我們每次的本地修改,執行svn revert后SVN會從這里取得上一個版本的信息,然后回滾。
那么svn revert命令能夠一次性回滾多個文件內容的修改嗎?











事實證明一次回滾多個文件也是可以的。那么對于整個目錄呢?像上面的要求我們還有更簡便的做法,請看下面











這次的操作有兩個不同的地方:
A.我們不是指定到具體的兩個文件,而是指定到文件所在的目錄
B.我們增加了一個--depth=infinity參數
這就是svn revet命令的簡便之處,如果確定要回滾的內容都在同一個目錄下,我們就可以一次性地回滾。
參數--depth是svn命令的一個全局參數,用于限制命令執行的范圍。可選項包括:empty,file,immediate,infinity。
-------------------------------------------------------------
生活就像打牌,不是要抓一手好牌,而是要盡力打好一手爛牌。