• svn上想回滚代码怎么办?——svn merge 命令


    小博客断更了很久,最近想接着尝试建立写作的习惯,把自己工作生活遇到的有用知识沉淀下来。尽管微信公共账号比较火,但个人觉得这种不能用搜索引擎检索的东西完全就是历史的倒退,就像 RSS 这种提高信息传播效率的协议被 Google 抛弃一样。扯远了,进入今天的正题,聊一聊 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 ...

    (有时间再接着写)

  • 相关阅读:
    (转)CSS3全局实现所有元素的内边距和边框不增加
    (转载)常用的Mysql数据库操作语句大全
    100天搞定机器学习|day40-42 Tensorflow Keras识别猫狗
    《统计学习方法》极简笔记P2:感知机数学推导
    100天搞定机器学习|day39 Tensorflow Keras手写数字识别
    100天搞定机器学习|day38 反向传播算法推导
    100天搞定机器学习|day37 无公式理解反向传播算法之精髓
    100天搞定机器学习|Day36用有趣的方式解释梯度下降算法
    100天搞定机器学习|Day35 深度学习之神经网络的结构
    《统计学习方法》极简笔记P4:朴素贝叶斯公式推导
  • 原文地址:https://www.cnblogs.com/xuxn/p/how-to-rollback-source-code-by-svn-merge.html
Copyright © 2020-2023  润新知