聊一聊 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 ...

(有时间再接着写)

svn merge 回滚的更多相关文章

  1. SVN代码回滚

    取消对代码的修改分为两种情况:   第一种情况:改动没有被提交(commit). 这种情况下,使用svn revert就能取消之前的修改. svn revert用法如下: # svn revert [ ...

  2. svn代码回滚命令

    代码回滚提交: 比如要把73回滚到68 svn merge -r 73:68 http://my.repository.com/my/project/trunk 然后commit就行了 svn com ...

  3. 【转载】svn代码回滚命令

    [说明]转载自 http://www.cnblogs.com/jndream/archive/2012/03/20/2407955.html 取消对代码的修改分为两种情况:   第一种情况:改动没有被 ...

  4. linux svn代码回滚命令

    取消对代码的修改分为两种情况: 第一种情况:改动没有被提交(commit). 这种情况下,使用svn revert就能取消之前的修改. svn revert用法如下: # svn revert [-R ...

  5. SVN 提交回滚

    取消对代码的修改分为两种情况:   第一种情况:改动没有被提交(commit). 这种情况下,使用svn revert就能取消之前的修改. svn revert用法如下: # svn revert [ ...

  6. svn代码回滚命令 svn up -r

    第一种情况:改动没有被提交(commit). 这种情况下,使用svn revert就能取消之前的修改. svn revert用法如下: # svn revert [-R] something 其中so ...

  7. svn代码回滚命令【转】

    本文转载自:http://www.cnblogs.com/jndream/archive/2012/03/20/2407955.html 取消对代码的修改分为两种情况:   第一种情况:改动没有被提交 ...

  8. SVN系列之—-SVN版本回滚的办法

    例:SVN版本为:TortoiseSVN 1.9.7 一.SVN简介 subversion(简称svn)是一种跨平台的集中式版本控制工具,支持linux和windows. 版本控制解决了:*代码管理混 ...

  9. SVN版本回滚实战

    天在使用SVN发布的时候不小心修改了一些不正确的东西,新增和编辑了一些错误的文件,由于文件数量比较多,并且目录复杂,不可能单个进行处理,所以想到了SVN版本回滚. 回滚本地工作目录: 1.右键工作目录 ...

随机推荐

  1. Debian中如何切换默认Python版本

    当你安装 Debian Linux 时,安装过程有可能同时为你提供多个可用的 Python 版本,因此系统中会存在多个 Python 的可执行二进制文件,你可以按照以下方法使用 ls 命令来查看你的系 ...

  2. localhost 和 127.0.0.1 的区别

    很多人会接触到这个ip地址127.0.0.1.也许你会问127.0.0.1是什么地址?其实127.0.0.1是一个回送地址,指本地机,一般用来测试使用.大家常用来ping 127.0.0.1来看本地i ...

  3. ES6 — 数组Array

    ES6对数组引入了几个新函数: (1) Array.of() 作用是将一组数值,转换为数组. Array.of(1,2,3,4); //[1,2,3,4] (2) Array.from() 作用是把类 ...

  4. alias sample method——运行时间复杂度为O(1)的抽样算法

    根据离散离散概率分布抽样是一个常见的问题.这篇文章将介绍运行时间复杂度为O(1)的 alias method 抽样算法思想. 下面举例说明: 比如 a,b,c,d 的概率分别为 0.1,0.2,0.3 ...

  5. ..c++中用c语言的输入法

    题目: 竞选时,要求选民在n个候选人中选择,n个人的名字为 A,B,C,D--连续n个大写字母,如果选择n个人名字之外的人员,则为废票.   统计时以输入'#'为结束标记.请按候选人的得票数目从大到小 ...

  6. Oracle数据库五种约束

    oracle 数据库 数据表的5个约束类型:1.主键约束2.外键约束3.唯一约束4.检查约束5.非空约束 主键约束:用来唯一标示表中的一个列,一个表中的主键约束只能有一个,但是可以在一个主键约束中包含 ...

  7. spring beans源码解读之 ioc容器之始祖--DefaultListableBeanFactory

    spring Ioc容器的实现,从根源上是beanfactory,但真正可以作为一个可以独立使用的ioc容器还是DefaultListableBeanFactory,因此可以这么说, DefaultL ...

  8. 论文笔记之:DeepCAMP: Deep Convolutional Action & Attribute Mid-Level Patterns

    DeepCAMP: Deep Convolutional Action & Attribute Mid-Level Patterns CVPR 2016 本文提出一种 分割图像 patch 的 ...

  9. 看完com本质论第一章

    class IUnKnown { virtual void QueryInterface(REFIID riid,IUnknown** ppv)=0; virtual void addref()=0; ...

  10. MFC如何添加自定义控件

    project->add to project->components and controls在Registered ActiveX Controls下找到你注册的自定义控件就可以了   ...