硬广:《SVN与TortoiseSVN实战》系列已经写了两篇,第一篇《SVN与TortoiseSVN实战:从入门到精通》,关于分支和标签的知识介绍可翻阅第二篇《SVN与TortoiseSVN实战:标签与分支》,本篇重点通过例子讲解TortoiseSVN新建及合并分支的实际操作。

先提示一下,网上大部分关于分支合并的讲解都是错的,对于其他资料请谨慎,本文本着科学严谨的精神,确保讲解正确。

我这里已经新建好一个SVN项目仓库,并按照第二篇介绍的标准项目仓库的目录结构新建好trunks、tags、branches三个目录:

下面开始实际操作。

使用TortoiseSVN新建分支


由于这三个目录是刚建好的,为了更好体现分支的新建及合并对项目中代码的影响,先伪造点代码文件。

打开trunks目录,在trunks目录下新建两个文本文件A.java,B.java:

打开A.java输入以下内容:

B.java文件可以随机输入些,本例中主要用于观察后续是否变化。

两个文件编辑完成后使用SVN Commit将更改提交到SVN:

下面开始创建分支:

1、在trunks上点击右键,在TortoiseSVN菜单中选择Branch/Tag;

2、在To path输入框中输入新建分支的路径,一般是:/branches/分支名,也就是相当于分支保存的路径名;

3、在下面选择HEAD revision in the repository,为当前SVN中trunks目录下最新的代码建立分支,如果需要为制定的revision建立分支,可以进行选择;

4、点击OK分支建立完成。

打开branches目录,发现目录依然为空,没有刚才建立的分支,这是因为分支建立的操作是在服务器端完成的,当需要编辑分支时,在branches目录点击Update,刚才建立的分支就会下载下来。

建立分支的过程会非常的快,不会因为主干中的文件多而降低速度,原因后续说明。

使用TortoiseSVN合并分支


第二篇中举过例子,有可能存在主干、分支并行开发的情况,下面我们模拟一下。

将刚才新建的分支Update下来,打开分支中的A.java,对其进行编辑如下:

在打开trunks主干中的A.java,对其进行编辑如下:

对以上两个文件的改动基本上模拟了分支、主干并行的情况,两个目录下的同一个文件被分别修改。

将以上两个文件的改动Commit,下面进行合并操作。

下面开始合并分支到主干:

1、在trunks上点击右键,在TortoiseSVN菜单中选择Merge;

2、在弹出的窗口中选择第二项,可以理解为合并两个树;

3、在From和To中都选择要合并的分支目录;

4、在From的Revision选择创建分支时的那个Revision,具体就是点击Show log,选择最下面那一条;

5、在To的Revision选择HEAD Revision,也就是最新操作;

6、点击Next,下一个页面使用默认项,点击Merge;

7、合并完成。

这时候会发现trunks目录下的文件已被修改,这时候的合并操作是在本地完成的,并没有提交到SVN,这与分支建立时有区别,请注意。

也就是说如果你在本次合并中发现问题,只需要对trunks目录Revert,放弃本次合并即可。

可以看一下trunks目录合并后的A.java文件,大家与前面对照下,已达到我们想要的合并效果:

创建分支时发生了什么


SVN服务器在创建分支时的拷贝是非常有效率的,瞬间就可以完成,并且只需要很少的空间来存储,所以不需要担心分支建立过多导致项目仓库膨胀的问题。

可以理解为SVN在服务器中存储的是文件的引用,而非物理上的拷贝。

不要多次合并同一个分支到主干


合并分支有一个原则,就是不要对一个分支多次合并到主干,虽然你有可能在合并后又对分支进行了修改,之所以这样说是有原因的。

上面提到在合并分支时,在From的Revision选项中需要选择合并的其实版本,如果是第一次合并只需要选择最早的那个版本即可,但如果合并过一次,你真的能记得你上次合并时最后的Revision是多少吗?

良好的操作是合并后新建分支。

合并主干到分支


其实合并是个可逆的过程,合并主干到分支与合并分支到主干正好是相反的操作,大家如果会了一种另一种应该非常简单。

这里我就不演示了,如果真的需要的话可以在博客中评论,大家确实需要的话我会写出来。


记录,为更好的自己!

SVN与TortoiseSVN实战:TortoiseSVN新建及合并分支的更多相关文章

  1. 使用TortoiseSVN新建及合并分支图文教程

    打开trunks目录,在trunks目录下新建两个文本文件A.java,B.java:   打开A.java输入以下内容: B.java文件可以随机输入些,本例中主要用于观察后续是否变化. 两个文件编 ...

  2. SourceTree使用详解(连接远程仓库,克隆,拉取,提交,推送,新建/切换/合并分支,冲突解决)

    前言: 俗话说的好工欲善其事必先利其器,Git分布式版本控制系统是我们日常开发中不可或缺的.目前市面上比较流行的Git可视化管理工具有SourceTree.Github Desktop.Tortois ...

  3. SVN与TortoiseSVN实战:补丁详解

    硬广:<SVN与TortoiseSVN实战>系列已经写了五篇,第二篇<SVN与TortoiseSVN实战:标签与分支>和第三篇<SVN与TortoiseSVN实战:Tor ...

  4. SVN与TortoiseSVN实战:冲突详解(二)

    硬广:<SVN与TortoiseSVN实战>系列已经写了四篇,第二篇<SVN与TortoiseSVN实战:标签与分支>和第三篇<SVN与TortoiseSVN实战:Tor ...

  5. SVN与TortoiseSVN实战:冲突详解(一)

    硬广:<SVN与TortoiseSVN实战>系列已经写了三篇,第一篇<SVN与TortoiseSVN实战:从入门到精通>,第二篇<SVN与TortoiseSVN实战:标签 ...

  6. SVN与TortoiseSVN实战:补丁详解(转)

    硬广:<SVN与TortoiseSVN实战>系列已经写了五篇,第二篇<SVN与TortoiseSVN实战:标签与分支>和第三篇<SVN与TortoiseSVN实战:Tor ...

  7. mac下sourcetree创建git分支和合并分支

    git默认创建的分支为:master主分支 要实现的效果:新建和合并分支. 1.在master基础上创建分支v1.0.1并切换至v1.0.1然后推送分支到远程服务器 确定即可!! 然后查看远端已经发现 ...

  8. SVN与TortoiseSVN实战:文件加锁详解

    硬广:<SVN与TortoiseSVN实战>系列已经写了八篇,本篇是完结篇,整个系列结合TortoiseSVN对SVN中容易被忽视的部分进行了详解,以技巧性为主. 本篇详解使用Tortoi ...

  9. SVN与TortoiseSVN实战:属性的奇技淫巧(二)

    硬广:<SVN与TortoiseSVN实战>系列已经写了七篇,本系列结合TortoiseSVN对SVN中容易被忽视的部分进行了详解. 关于属性的奇技淫巧较多,分为两篇来写,第一篇详见< ...

随机推荐

  1. Navicat(连接) -1之常规设置

    常规设置 要成功地创建一个新的连接到本机或远程服务器 - 不管通过 SSL.SSH 或 HTTP,都要在常规选项卡中设置连接属性.如果你的互联网服务供应商(ISP)不提供直接访问其服务器,安全通道协定 ...

  2. smartgit document merge

    'Normal' Merge In case of a normal merge, a merge commit with at least two parent commits (i.e., the ...

  3. Shell_Oracle Erp基于主机文件Host开发详解(案例)

    2014-06-20 Created By BaoXinjian

  4. window.print实现打印特定控件或内容

    window.print打印指定div 首先我们可以把要打印的内容放在div中,然后用下面的代码进行打印. <html> <head> <script language= ...

  5. contentProvider 内容提供者

    http://blog.csdn.net/woshixuye/article/details/8280879 实例代码当数据需要在应用程序间共享时,我们就可以利用ContentProvider为数据定 ...

  6. 一个简单的jsp自定义标签

    学到了一个简单的jsp自定义标签,后面有更多的例子,会更新出来: 例子1: 步骤: 1.编写标签实现类: 继承javax.servlet.jsp.tagext.SimpleTagSupport; 重写 ...

  7. android 技术相关Blog

    android 技术相关 LVXIANGAN的专栏 http://blog.csdn.net/LVXIANGAN/article/category/1101038 Android NFC 开发实例 h ...

  8. PostgreSQL 数据迁移

    新主机PostgreSQL需要事先建立和原主机名称相同的用户和数据库. 备份原主机数据库 pg_dump -U <UserName> -p <PortNum> <DBNa ...

  9. 线程间操作无效: 从不是创建控件“”的线程访问它~~~的解决方法~ 线程间操作无效: 从不是创建控件“Control Name'”的线程访问它问题的解决方案及原理分析

    看两个例子,一个是在一个进程里设置另外一个进程中控件的属性.另外一个是在一个进程里获取另外一个进程中控件的属性. 第一个例子 最近,在做一个使用线程控制下载文件的小程序(使用进度条控件显示下载进度)时 ...

  10. POJ 2154 【POLYA】【欧拉】

    前记: TM终于决定以后干啥了.这几天睡的有点多.困饿交加之间喝了好多水.可能是灌脑了. 切记两件事: 1.安心当单身狗 2.顺心码代码 题意: 给你N种颜色的珠子,串一串长度问N的项链,要求旋转之后 ...