聊一聊 svn merge 命令。
svn 是啥就不用介紹了吧,誰用誰知道。有了 svn,開發者只要把代碼提交上去,無論山崩地裂、電腦進水、硬盤格式化,哪怕換了一台電腦,都能隨時把代碼找回來。不過從自己工作中看到的現象來說,可能還有很多人並不了解 svn 真正的便捷之處。這里我們就聊一聊代碼合並、回滾必備的利器——svn merge 命令。
一說到回滾,可能很多人立馬先想到了 svn revert。其實非也,svn revert 只能把未提交的本地修改撤銷,對於已經提交的代碼就無能為力了。要把已經提交上去的代碼回滾掉,非 svn merge 莫屬。
PS:我們這里以 Linux shell 下的 svn 命令行工具為例進行介紹。Windows 圖形界面版本其實原理一樣,只是把命令轉移到 GUI 里面去了。
在 shell 里輸入 svn help merge ,可以看到大片的幫助文檔,新手看了真是無從下手。不急,且看為首的幾行:
merge: Apply the differences between two sources to a working copy path.
usage: 1. merge sourceURL1[@N] sourceURL2[@M] [WCPATH] 2. merge sourceWCPATH1@N sourceWCPATH2@M [WCPATH] 3. merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [WCPATH]
其實只要看明白這 4 行,svn merge 命令就搞定了。
svn merge 能干啥?
我們都知道,svn 上面保存了一份代碼的所有歷史版本。隨着開發過程中不短提交新的代碼,版本只會越來越多,而已存在的版本又無法刪除。所以,如果某個版本的代碼提交錯了、不想要了怎么辦?
這種情況,其實只要把最后一次提交里,新增的代碼刪掉、刪掉的代碼加回來、修改的代碼改回去,然后 svn ci 一下就好。雖然這樣好像又多了一個版本,但其實代碼是回到前面一個版本的狀態了。
而要把新增的代碼刪掉、刪掉的代碼加回來、修改的代碼改回去,手工修改無疑太笨,也太容易出錯。這就輪到 svn merge 命令出場了。
merge: Apply the differences between two sources to a working copy path.
help 文檔告訴我們,merge 就是把兩套代碼之間的 diff 生效到本地的一個路徑上。
比如上面的例子,我們假設有一套代碼維護在 svn 上,一開始的版本號是 r1,后來提交了一次版本就是 r2,然后發現 r2 寫錯了、想撤銷這次修改。這次修改做的變化就是 r1 -> r2 兩個版本的 diff;那么想撤銷修改,只要把 r2 -> r1 的 diff 再提交上去,雖然生成了新的版本號 r3,但其實 r3 里的代碼跟 r1 是完全一樣的。
svn merge 怎么用?
說了這么多虛的,那怎么操作呢?我們繼續跟着 help 往下看。
1. 在同一個 URL 上做 merge
3. merge [-c M[,N...] | -r N:M ...] SOURCE[@REV] [WCPATH]
前面的例子其實是第 3 種用法,我們先看這個。假設 shell 里面當前路徑就對應着 svn 上代碼最上層目錄,要實現上面的例子,可以直接這么寫:
svn merge -r r2:r1 .
注意結尾有個“.”,表示將 diff 生效到當前路徑。然后提交代碼即可。
svn ci -m "rollback r2 -> r1"
2. 在不同的 URL 上做 merge
前面的例子要求遠程代碼 URL 跟本地代碼對應的 URL 必須一致,即都在 trunk 上,或者都在同一個 branch 或者 tag 上。一般情況需要回滾代碼、撤銷某次修改,上面的命令足矣。而如果涉及到多個 branch 合並到 trunk 之類的問題,還需要繼續往下看 :)
To be continued ...
(有時間再接着寫)