玩转SVN系列之【如何放弃本地/服务器端所做的修改】
前幾天我遇到了如何在GIT下放棄本地所做的修改的問題,并寫了一篇博客來整理其中的思路,詳見(玩轉GIT系列之【如何放棄本地/服務器端所做的修改】)。但是今天,我在SVN下遇到了同樣的問題,而且是linux系統下命令行的SVN,不是windows系統下的圖形界面。所以,一切還是得靠命令來解決,具體來說要分以下幾種情況來區別對待:
第一種情況:放棄本地的修改內容
也就是說,你所做的修改仍然是在本地,尚未提交到服務器端。這種情況下,使用“svn revert”命令就能取消之前的修改。用法如下:
svn revert [-R] target其中target是你需要放棄修改(即還原成服務器版本)的目錄或文件。
- 當target為單個文件時,直接“svn revert target”就行了;
- 當target為某個目錄時,需要加上參數-R(Recursive,遞歸),否則只會針對target根目錄進行處理,而不會處理它下面的子目錄。
比如:想要放棄整個工程里所有的修改內容,則可以在整個工程的根目錄下執行下述命令:
svn revert -R *注意:一旦使用了這個命令,就意味著你完全放棄本地所做的修改,這些文件的內容將會被徹底還原成服務器端的版本。而這種放棄不可撤銷的,是找不回來的,這一點請注意!
特別說明:此處的revert命令,只是針對之前就已經存在的那些文件。如果你本次還新增了一些文件,則revert命令并不會將你新增的文件刪除或者清空,仍需你自己手動操作。經過摸索,我找到了一個命令可以完成這個任務,也就是說,可以自動刪除那些你新增的、但是尚未提交的文件。親測可用,大家如果有需要可以拿去用:
svn st | grep '^?' | awk '{print $2}' | xargs rm -rf劃重點:
總結一下就是,如果你修改了若干文件,同時還新增了一些文件,然后突然想放棄所有的操作,將所有代碼恢復原樣,那么則可以采取以下命令組合:
svn revert -R * # 對已經存在的文件,恢復原樣 svn st | grep '^?' | awk '{print $2}' | xargs rm -rf # 對本次新增的文件,全部刪除特別說明:
以上方法,經本人反復嘗試,在實際應用中存在一些未知的風險,請謹慎使用。具體的現象描述如下:
1、從SVN上克隆一個linux系統的代碼倉庫至本地,編譯完畢,所有一切正常;
2、執行“svn revert -R *”命令,再次編譯,所有一切依舊正常;
3、執行“svn revert -R *”之后接著執行“svn st | grep ‘^?’ | awk ‘{print $2}’ | xargs rm -rf”命令,再次編譯,出現問題,編譯生成的image文件異常(表現為內容偏大,原本是3.99M,現變為4.99M,原因未知);
上述現象可反復重現,但是原因未知,將其記錄在此處,待日后若有結論再行補充。
第二種情況:放棄服務器端的修改內容
也就是說,你所做的修改已經被提交到了服務器上了。這種情況下,只能用“svn merge”命令來進行版本回滾。回滾的操作過程如下:
1、首先保證我們拿到的是最新代碼
svn update假設最新版本號是28。
2、然后找出要回滾的確切版本號
svn log [something]假設根據svn log日志查出要回滾的版本號是25,此處的something可以是文件、目錄或整個項目。如果想要更詳細的了解情況,可以使用svn diff -r 28:25 [something]。
3、回滾到版本號25
svn merge -r 28:25 something為了保險起見,再次確認回滾的結果:
svn diff [something]確認正確無誤,方可提交。
4、提交回滾之后的內容
svn commit -m "Revert revision from r28 to r25, because of ..."提交后版本變成了29。
總之,將以上操作總結為三條如下:
收工!
總結
以上是生活随笔為你收集整理的玩转SVN系列之【如何放弃本地/服务器端所做的修改】的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 玩转GIT系列之【如何放弃本地/服务器端
- 下一篇: 3 月 10 日上线,Bungie 宣布