CVS 分支合并指南

liuze124 贡献于2012-07-29

作者 微软测试用户  创建于2005-04-26 02:52:00   修改者微软测试用户  修改于2005-08-03 08:26:00字数2971

文档摘要:cvs允许你把修改隔离在各自的开发线上,这就是分支(branch)。当你改变一个分支中的文件时,这些更改不会出现在开发主干(maintrunk)和其它分支中。在这之后你可以使用merging把这些变更从一个分支移动到另一个分支(或主干)。
关键词:

CVS分支合并指南 cvs 允许你把修改隔离在各自的开发线上,这就是分支(branch)。当你改变一个分支中的文件时,这些更改不会出现在开发主干(main trunk)和其它分支中。 在这之后你可以使用 merging 把这些变更从一个分支移动到另一个分支(或主干)。合并首先使用 cvs update -j 命令,将这些变更合并到工作目录。然后你可以提交这个版本,这样也可以将这些变更作用于其它的分支。 下面的操作描述约定都以目录为操作对象。 1. 建立一个分支 使用 tag -b 去建立一个分支;例如,假定你现在有一个工作副本: $ cvs tag -b rel-1-0-patches 这将基于工作副本的当前版本分离出一个分支,并分配 rel-1-0-patches 名字给该分支。 有一点对理解分支很重要,分支是在 CVS 仓库中创建,而非在工作副本中创建。正如上面的例子,基于当前版本创建一个分支不会自动把当前的工作副本切换到新的分支上。 2. 检出与更新分支 你可以通过两种方式恢复分支:重新从仓库检出一份或是从现有的工作副本切换过去。 为了从仓库检出一个分支,使用 checkout 命令并带上 -r 标志,后面是这个分支的标签(branchtag)名: $ cvs checkout -r rel-1-0-patches tc 或者如果你已有了一个工作副本,你可以使用 update -r 命令切转到这个分支: $ cvs update -r rel-1-0-patches tc 或者使用另一个等效的命令: $ cd tc $ cvs update -r rel-1-0-patches 这对工作副本为主干代码或是其它分支都是有效的 – 上面的命令将把它切换到指名的分支。同 update 命令相类似,update -r 合并你所做的任何改变,通知你出现的冲突。 一旦你的工作副本已经转向一个特定的分支,它将一直保持在这个分支内,除非你又做了其它的操作。这意味着从这个工作副本提交的变更将加到这个分支的新版本中,而不影响到主干版本和其它分支。 想看一个工作副本是基于哪一个分支,可以使用 status 命令。在它们输出中查找一个 Sticky tag 的域(参阅 Sticky tags) – 那就是 cvs 告诉你当前工作文件分支号的方式: $ cvs status -v driver.c backend.c =================================================================== File: driver.c Status: Up-to-date Version: 1.7 Sat Dec 5 18:25:54 1992 RCS Version: 1.7 /u/cvsroot/yoyodyne/tc/driver.c,v Sticky Tag: rel-1-0-patches (branch: 1.7.2) Sticky Date: (none) Sticky Options: (none) Existing Tags: rel-1-0-patches (branch: 1.7.2) rel-1-0 (revision: 1.7) =================================================================== File: backend.c Status: Up-to-date Version: 1.4 Tue Dec 1 14:39:01 1992 RCS Version: 1.4 /u/cvsroot/yoyodyne/tc/backend.c,v Sticky Tag: rel-1-0-patches (branch: 1.4.2) Sticky Date: (none) Sticky Options: (none) Existing Tags: rel-1-0-patches (branch: 1.4.2) rel-1-0 (revision: 1.4) rel-0-4 (revision: 1.4) 请不要因为每个文件的分支号不同(1.7.2 和 1.4.2)而迷惑。分支的标签是相同的,rel-1-0-patches,所以这些文件是在相同的分支上。数字简单地反映在每个文件的版本历史中在制造分支的点。在以上的例子中,分支建立之前,driver.c 比 backend.c 有更多的变更,因此它们的版本编号是不同的。 3. 合并一整个分支 你可以把另一个分支上的修改合并到你的工作副本,只要在 update 子命令中加 -j tagname 的标志。 -j 的意思是“join”。 Consider this revision tree: +-----+ +-----+ +-----+ +-----+ ! 1.1 !----! 1.2 !----! 1.3 !----! 1.4 ! <- The main trunk +-----+ +-----+ +-----+ +-----+ ! ! ! +---------+ +---------+ Branch R1fix -> +---! 1.2.2.1 !----! 1.2.2.2 ! +---------+ +---------+ ! tag-1-6 分支R1fix 的最后版本的tag是tag-1-6。下面的例子假定模块 mod 只包含一个文件 m.c。 $ cvs checkout mod # Retrieve the latest revision, 1.4 $ cvs update -j tag-1-6 # Merge all changes made on the branch, # i.e. the changes between revision 1.2 # and 1.2.2.2, into your working copy # of the file. $ cvs commit -m "Included tag-1-6" # Create revision 1.5. 请注意,此操作是把分支上得变化,也就是分支得起点(revision 1.2)版本和分支得终点(revision 1.2.2.2)版本的差异,合并到你的工作副本中,不是将分支得终点(revision 1.2.2.2)版本的所有内容合并到你的工作副本中。 在合并时可能会发生冲突。如果这种情况发生,你应该在提交新版本之前解决它。 合并命令执行完后,强烈建议使用 cvs diff 命令检查合并结果和合入版本(及-j tag中tag指示的版本)的差别,以确保物理合并的完整性。 添加了这段说明 4. 在文件添加和删除的情况下? 如果你在合并时做的改变涉及到添加或删除一些文件,update -j 将反映这些变化。 例如: cvs update -A touch a b c cvs add a b c ; cvs ci -m "added" a b c cvs tag -b branchtag cvs update -r branchtag touch d ; cvs add d rm a ; cvs rm a cvs ci -m "added d, removed a" cvs update -A cvs update -jbranchtag 在执行这些命令且 cvs commit一完成之后,文件 a 将被删除,而文件 d 将被加入到主分支。 注意使用 update -j tagname 也许行但结果可能不是你想要的。 注意,当用静态标签(-j tagname)而不是动态标签(-j branchname)从一个分支合并改变时,cvs 一般不会删除文件,因为 cvs 不会自动给 dead 版本添加静态标签。除非静态标签是手工添加到 dead 版本上的。使用分支标签从分支合并所有改变或使用两个静态标签作为合并端点合并都会在合并中将企图的修改传播开。

下载文档到电脑,查找使用更方便

文档的实际排版效果,会与网站的显示效果略有不同!!

需要 5 金币 [ 分享文档获得金币 ] 0 人已下载

下载文档