SubVersion程式碼庫的回滾
我剛開始使用SubVersion時, 想把svn程式碼庫回滾到以前某個版本, 上網找來找去都找不到(那時文件比較少), 讓我鬱悶了好一陣子. 現在記錄一下 SubVersion回滾的方法:
第一種方法: 使用TortoiseSVN進行回滾. 很明顯, 這種方法只適用於windows平臺. 以下摘自 TortoiseSVN文件:
B.4. 回滾版本庫裡的版本
B.4.1. 使用版本日誌對話方塊
如果想恢復某個版本或者版本範圍的變更,最簡單的方法是使用版本日誌對話方塊。這種方法也可以用來撤銷最近的若干次變更,把以前的某個版本變成最新版。
選中想要恢復變更的檔案或者資料夾。如果想要恢復所有的變更,需要選中最頂層的資料夾。
選擇
→ ,顯示出版本列表。有可能需要使用 或者 按鈕,把想要恢復的版本顯示出來。選中想要恢復的版本。如果想要恢復一個版本範圍,選中想要恢復的第一個版本,按住shift鍵,然後選中想要恢復的最後一個版本。注意,當恢復多個版本的時候,這些版本必須在列表中是連續的。用滑鼠右鍵點選選中的版本(段),然後選擇 → 。
如果想要把以前的某個版本變成最新版本,右鍵點選選中的版本(範圍),然後選擇 → 。就能夠撤銷被選中版本後面所有的變更。
工作拷貝已經恢復到了變更以前的狀態。檢查恢復後的結果,然後提交變更。
B.4.2. 使用合併對話方塊
如果要撤銷更大版本範圍的變更,可以使用合併對話方塊。上一個方法在後臺使用了合併的機制,在這個方法裡我們直接使用合併功能。
在工作拷貝上選擇
→ 。在起始:文字框裡輸入想要恢復的變更所在的分支或標籤的URL。它也將作為預設URL。
在起始版本文字框裡輸入當前工作拷貝的版本號。如果能夠保證沒有其他人會提交變更,可以使用最新版本。
確認使用“起始:”的 URL
檢查框處於被選中的狀態。在結束版本裡輸入想要恢復到的版本號。比如,想要恢復的最小版本號的前一個版本號。
點選
按鈕完成合並。工作拷貝已經恢復到了變更以前的狀態。檢查恢復後的結果,然後提交變更。
B.4.3. 使用svndumpfilter
因為TortoiseSVN絕不會丟棄資料,所以那些被回滾的版本仍然以中間版本的形式被保留在版本庫裡。只是最新版本已經回到了以前的狀態。如果想讓版本庫裡的某些版本徹底消失,擦去這些版本曾經存在過的所有痕跡,就必須採取更極端的手段。不推薦使用這種方法,除非有很好的理由。比如某人向一個公開的版本庫裡提交了一份機密檔案。
從版本庫裡刪除資料的唯一方法就是使用
svnadmin
這個Subversion命令列工具。具體如何實現請參考Subversion手冊。
第二種方法: 使用SubVersion自帶的svn merge 命令. 這種方法適用於任何能使用SubVersion的平臺. 以下摘自 <使用SubVersion進行版本控制> 4.4.2節:
svn merge另一個常用的做法是取消已經做得提交,假設你愉快的在
/calc/trunk
工作,你發現303版本對integer.c
的修改完全錯了,它不應該被提交,你可以使用svn merge來“取消”這個工作拷貝上所作的操作,然後提交本地修改到版本庫,你要做得只是指定一個相反的區別:$ svn merge -r 303:302 http://svn.example.com/repos/calc/trunk U integer.c $ svn status M integer.c $ svn diff … # verify that the change is removed … $ svn commit -m "Undoing change committed in r303." Sending integer.c Transmitting file data . Committed revision 350.我們可以把版本庫修訂版本想象成一組修改(一些版本控制系統叫做修改集),通過
-r
選項,你可以告訴svn merge來應用修改集或是一個修改集範圍到你的工作拷貝,在我們的情況例子裡,我們使用svn merge合併修改集#303到工作拷貝。記住回滾修改和任何一個svn merge命令都一樣,所以你應該使用svn status或是svn diff來確定你的工作處於期望的狀態中,然後使用svn commit來提交,提交之後,這個特定修改集不會反映到
HEAD
版本了。繼續,你也許會想:好吧,這不是真的取消提交吧!是吧?版本303還依然存在著修改,如果任何人取出
calc
的303-349版本,他還會得到錯誤的修改,對吧?是的,這是對的。當我們說“刪除”一個修改時,我們只是說從
HEAD
刪除,原始的修改還儲存在版本庫歷史中,在多數情況下,這是足夠好的。大多數人只是對追蹤HEAD
版本感興趣,在一些特定情況下,你也許希望毀掉所有提交的證據(或許某個人提交了一個祕密檔案),這不是很容易的,因為Subversion設計用來不丟失任何資訊,每個修訂版本都是不可變的目錄樹 ,從歷史刪除一個版本會導致多米諾效應,會在後面的版本導致混亂甚至會影響所有的工作拷貝。 [9]
解釋一下, svn merge -r 303:302 http://svn.example.com/repos/calc/trunk 這個命令是把當前目錄當作工作拷貝. 如果想指定工作拷貝路徑(如: c:/test), 則命令變成以下:
svn merge -r 303:302 http://svn.example.com/repos/calc/trunk c:/test