svn merge 回滚

聊一聊 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 之类的问题,还需要继续往下看 :)

### ### SVN 命令行工具实现版本回滚的方法 在使用 SVN 时,若需要撤销已提交的更改或回退到某个历史版本,可以通过命令行工具完成操作。以下是几种常见的回滚方式及其具体实现方法。 #### 版本回滚的基本操作 如果已经提交了错误的更改,并希望将其从服务器端移除,可以使用 `svn merge` 命令进行反向合并: - 执行以下命令查看提交日志并确定要回滚的版本号: ```bash svn log -v ``` - 使用 `merge` 命令撤销指定版本的更改(假设版本号为 r1234): ```bash svn merge -c -1234 . ``` 此命令会将版本 r1234 引入的更改从当前工作副本中移除[^2]。 - 完成回滚后,提交更改以同步到服务器: ```bash svn commit -m "Reverted revision 1234" ``` #### 回退到指定版本 如需将整个项目或某个文件恢复到特定的历史版本,可使用以下步骤: - 更新本地工作副本以确保其状态与服务器一致: ```bash svn update ``` - 查看最近的提交日志并找到目标版本: ```bash svn log -l 5 ``` - 执行 `merge` 命令将工作副本回退到指定版本(例如从当前版本回退到 r602): ```bash svn merge -r HEAD:602 . ``` 此操作会将所有比 r602 更高的版本更改全部撤销,使工作副本的状态恢复到 r602 的内容。 - 提交更改以更新服务器端版本: ```bash svn commit -m "Reverted to revision 602" ``` #### 放弃本地修改并重新提交 如果误提交了某些不需要的文件,可以通过以下方式清理并重新提交: - 放弃对某个文件的修改: ```bash svn resolved filename ``` - 删除不需要提交的文件(例如 test.log): ```bash svn rm test.log ``` - 提交清理后的更改: ```bash svn commit -m "update" ``` 此方法适用于临时清理本地改动并重新提交干净版本的情况[^1]。 #### 注意事项 在执行版本回滚操作前,应确保本地工作副本是最新的。如果在更新过程中出现冲突,必须先解决冲突再继续操作。此外,在使用 `svn merge` 进行版本回滚时,务必确认目标版本范围是否正确,避免因误操作导致不必要的数据丢失[^3]。 --- ```bash # 示例:撤销指定版本的更改 svn log -v svn merge -c -1234 . svn commit -m "Reverted revision 1234" # 示例:回退到指定版本 svn update svn log -l 5 svn merge -r HEAD:602 . svn commit -m "Reverted to revision 602" # 示例:放弃本地修改并删除文件 svn resolved filename svn rm test.log svn commit -m "update" ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值