SVN创建分支与合并(命令与界面)

来源:互联网 发布:sql update语句大全 编辑:程序博客网 时间:2024/06/03 17:27

刚看到有同学遇到这方面的问题,于是把自己以前看的总结一下,虽然一直用着!!

创建分支的意义:

简单说,分支就是用于区分开发版本与当前发布版本的。

    1、 主干负责新功能的开发

    2.、分支负责修正当前发布版本的bug(对于可以放入下个发布版本的改进性bug可以直接在主干上开发)

    3.、分支上修改的bug,经常性merge到主干上,尽量及时merge(避免大面积红色区域)。

    4.、只能分支往主干靠拢(merge),不能反向!

    5.、直到下个新版本发布,该分支停止修改


1、svn 创建分支

[java] view plaincopy
  1. svn copy trunk_path branch_path -m ‘描述’  

Svn的分支和标签操作都是复制一份副本。可能有人觉得,如果创建太多分支的话,不停的复制,服务器会不会太多东西了,负荷太重了,这个大可放心,svn的复制操作并不是真正的复制一份同样的数据,而是一个“钱复制”,它只是创建了一个链接而已,一个到主干的 连接。在你对分支没做任何修改之前,分支都只是一个链接,当你对分支的文件作了修改后,该文件在分支那才会真正的创建一个文件。如下代码,我在我的google code上面创建了一个我自己项目的分支

[html] view plaincopy
  1. svn copy https://simaopig.googlecode.com/svn/trunk https://simaopig.googlecode.com/svn/branches/20091022 -m ‘a new branches’  

提交后的修订版为 21。

2、svn 查看创建分支时的版本号

大家在上面的例子中看到了我的创建分支时的版本号为21。可是当我把分支里的内容改过,或者trunk的内容被别人改过后。就凭咱这脑袋是打死也不会记得这个创建分支时的版本号的。这可就成问题了,不知道合并哪些版本了。。


svn info查看最新版本

[html] view plaincopy
  1. svn info查看最新版本  

看现在的版本号变成23了,这才几分钟。如果时间长了的话。我真的会不记得这个创建分支时的版本号的。咋办呢?

[html] view plaincopy
  1. svn log –verbose –stop-on-copy branch_path  

看我执行该命令后的结果:

svn log --verbose --stop-on-copy

看到没,在最后一行,显示的那个版本号就是你创建该分支时的版本号。 stop on copy 多么形象啊。赞一个。

3、svn 合并分支:

内容改完了,要上线了。我们应该把分支的内容与trunk上的内容合并。咋合并呢?

[html] view plaincopy
  1. #进入有trunk版本的目录中,也就是在主干目录把修改过的分支的代码合并过来  
  2.     svn merge -r 旧的版本号:现在的版本号 branch_path  

svn merge

4、svn 代码冲突的解决:

使用svn管理的代码可能有多个人在维护。哪怕就是你自己也可能让trunk和branch上面的代码产生冲突。合并后的C符号就是代表文件有冲突的意思。

我解决冲突的方法是手动去掉那些不必要的代码。看留哪个。但是去掉后一些svn冲突的文件仍然存在,咋办?

冲突产生的多余文件


[html] view plaincopy
  1. svn resolved 冲突的文件名  

当手动解决完冲突后你会发现这些多出来的文件仍然存在,别怕,使用上面的命令:如果你的冲突真的解决了,那么多出来的文件会自动删除掉的。可比你自己手动rm要方便的多了。

svn resolved



5、eclipse中创建分支与合并

创建分支:我在eclipse中的项目(主干)上的svn url:  https://ajsdjksjmxmkase/svn/newrep/trunk/displaytag

然后在项目上右击——》Team——》分支/标记,出现如下:


修改URL为:https://ajsdjksjmxmkase/svn/newrep/branch/displaytag-branch,然后一直默认next就行了,此时可以看到在visual SVN的branch分支中有了display-branch项目(主干项目的copy),然后在eclipse中——》Team——》commit。

在创建了分支后,也可以不check out出分支项目到工作区,可以切换主干与分支:当你创建分支后,肯定是想在分支那修改东西。想修改分支的内容,要把本地的副本的切换到分支。操作步骤如下: 
在本地工作区的package Explorer面板里,右击要切换分支的文件,在弹出的菜单现在Team->切换,在”至URL“中填写刚才创建的分支URL对应文件,就切换到分支了,而不再是主干了,当你修改提交时也是修改分支的文件。



合并(把在分支做的修改合并到主干中):

测试:在eclipse中把刚才copy的分支项目check out到eclipse中,然后做些修改,然后提交,然后在主干项目上右击——》Team——》合并——》默认next——》然后单击update升级工作副本——》在Merge from中输入要合并的分支URL:https://ajsdjksjmxmkase/svn/newrep/branch/displaytag-branch,然后合并,会出现合并的状态,这时在eclipse中的主干中的对应的文件会有修改(来自分支的),然后在主干——》Team——》commit。这样就完成了分支到主干的合并。

反之,主干到分支也一样的操作。


下来是选项的含义:

合并选项:


1、合并一个范围的版本

此类型应用最为广泛,主要是把分支中的修改合并到主干上来。在主干上点击右键选择合并,然后选择合并类型:合并一个范围的版本。合并的源URL填写的是要合并的分支的URL,待合并的版本范围如果为空,则指的是合并分支上所有的版本,即自从分支创建以来到分支当前最新版本的所有演变。如果只是选择其中一个版本,或者几个版本,那么就表示只是将制定的n个版本的变化合并到主干上。如果只是选择其中一个版本,那么表示只是选择那个版本的修改,之前或之后的修改将不被采纳。

2、复兴合并 
复兴合并可以理解为是第一种合并类型的一种特例,在复兴合并中,主干可以理解为是自从开创分支之后没有任何修改,而分支是经过修改的,而且合并中分支是没有版本选择的。经过复兴合并,分支中所有的修改都会合并到主干中,合并的结果将使得分支和主干一模一样,从而可以删除分支

4、合并两个不同的树 
此类型与前两种类型不同,第一种类型可以选择分支合并的版本,主干不能选择版本;第二种类型是主干和分支都不能选择合并的版本;而这种类型则是无论是主干还是分支都可以选择合并的版本,即可以选择过去的一个主干版本与分支的某个版本进行合并。合并的时候以选择的分支版本为主,如果选择的主干版本与分支版本有不同的地方,合并时主干部分将被放弃。 
起始URL:选择主干目录的URL(应当和当前工作副本的URL一致,这个是所谓的合并点) 
结束URL:选择要合并的分支的URL。 
起始和结束的版本:一般起始版本应当找到最后一次同步时的版本,如果从没有同步过(第一次合并),则选择创建分支时的版本,结束版本一般是最新版本,如果你不想将某些内容合并进主干的话,也可以选择一个合并点。

5、仅记录的合并

选择此项意味着并没有实际的合并动作,只是在将来的合并过程中,svn将过滤掉此版本的修改动作。例如,我在合并的过程中,选择对分支的23版本只记录合并(阻止这个版本将来被合并),那么23版本并不会合并到主干中。在以后的合并中,如果选择合并分支的22到24版本,那么23版本将被忽略,要慎重使用这个选项,一旦使用了,那么表示这个版本在以后的合并中就不能再使用了。也就是:分支使用 --reintegrate 合并回主干后,如果继续在该分支上开发,当需要同步主干的修改到分支过来时,默认会包括之前 reintegrate 的修改,而这些修改已经在分支上做过了,所以这样往往会导致冲突。这也是前面“最佳实践”中最后一个建议的一个原因。当然,想要使这个分支继续可用也是可以的。忽略祖先:如果在分支上有一个文件曾经被删除过,后来又加了一个同文件名的文件,那么在merge的时候svn会识别到这两个文件不是同一个祖先而直接覆盖旧文件增加新文件。而实际上我是要对这两个不同祖先的文件进行合并的,这个时候就需要使用svn merge --ignore-ancestry 忽略祖先来进行合并才能保证正确。



合并深度:


一、工作副本:即你当前的工作目录,一般默认为这个选项; 

二、全递归:即你选择的目录的版本库,包括了其下面的子文件,子文件夹,包括子文件夹里面的内容; 

三、直接子节点,包括文件夹:即你选择的目录下面的文件,文件夹,但是不包括文件夹里面的子文件,子文件夹; 

四、仅文件子节点:即你选择的目录下面的文件,但不包括文件夹,当然不包括的文件夹下面的所有内容也都不纳入合并范围; 五、仅此项:没有任何合并内容;

五、仅此项:没有任何合并内容。


SVN命令:http://www.blogjava.net/jasmine214--love/archive/2011/01/12/342839.html

0 0
原创粉丝点击