`
wdlisoft
  • 浏览: 47261 次
  • 性别: Icon_minigender_1
  • 来自: 常州
最近访客 更多访客>>
社区版块
存档分类
最新评论

版本控制之道——使用CVS

    博客分类:
  • cvs
阅读更多

3.9  冲突解决

         如果两个人同时编辑同一个文件会怎么样呢?这里有两种情形。第一种是修改的代码互不重叠。因为模拟这种情况比较容易,让我们先考虑这种情况。

首先编辑 Number.txt 文件在 sesame 目录中的副本。把第一行变成大写。


文件 Number.txt ( sesame 目录中 ) :

ZERO

one

two

three

four

five

six

         现在编辑 Number.txt 文件在 aladdin 目录中的副本。把最后一行变成大写。

文件 Number.txt ( aladdin 目录中 ) :

zero

one

two

three

four

five

SIX

         我们刚才模拟两个开发者修改了同一个文件在本地的副本。现在,这些修改都是独立的,而且 CVS 仓库还不知道这些修改。通过投掷硬币,决定 Aladdin 先签入被修改的文件版本。

work/aladdin> cvs commit -m "Make 'six' important"

cvs commit: Examining .

Checking in Number.txt;

/Users/dave/sandbox/sesame/Number.txt,v <-- Number.txt

new revision: 1.3; previous revision: 1.2

done

         不久之后, sesame 开发者也要签入这个文件。(记住,这个文件版本的第一行是大写的。)

work/sesame> cvs commit -m "Zero needs emphasizing"

cvs commit: Examining .

cvs commit: Up-to-date check failed for 'Number.txt'

cvs [commit aborted]: correct above errors first!

         CVS 使用了“ errors ”这样的词语,甚至用了一个感叹号来结束提示消息。

让我们按照 CVS (间接)的建议,先用仓库的最新版本更新本地文件。记住我们的文件有大写的“ zero ”,而仓库中的版本有大写的“ six ”。


work/sesame> cvs update

cvs update: Updating .

RCS file: /Users/dave/sandbox/sesame/Number.txt,v

retrieving revision 1.2

retrieving revision 1.3

Merging differences between 1.2 and 1.3 into Number.txt

M Number.txt

         注意那些附加的消息。它说明 CVS 并没有简单地更新本地文件,而是将修改的文件与仓库中的版本进行合并。让我们查看本地的文件版本:

文件 Number.txt :

ZERO

one

two

three

four

five

SIX

不可思议!现在的版本既包含我们修改的部分,也包含 Aladdin 修改的部分。两个人同时修改了一个文件,而 CVS 可以解决这个冲突问题。

         记住我们在本地的修改还没有保存回仓库。因此我们请求 CVS 提交修改的文件,而且这次提交成功了,因为我们的本地版本已经包含了仓库中最新版本的内容。

work/sesame> cvs commit -m "Zero needs emphasizing"

cvs commit: Examining .

Checking in Number.txt;

/Users/dave/sandbox/sesame/Number.txt,v <-- Number.txt

new revision: 1.4; previous revision: 1.3

done

         Aladdin 下次更新时也会得到我们修改的部分。

work/sesame> cd ../aladdin

work/aladdin> cvs update

cvs update: Updating .

U Number.txt

               遭遇变更冲突

         在前一个示例中,两个(虚拟的)开发者所做的修改不存在重叠的部分。如果两个开发者同时编辑同一个文件的同一行会怎么样呢?让我们继续寻找答案。


         进入 sesame 目录并且将 Number.txt 文件的第二行从“ one ”改成“ ichi ”。先不要签入这个文件。现在转到 aladdin 目录,并且将同一行从“ one ”修改成“ uno ”;再次假定 Aladdin 先签入他修改的文件。

work/aladdin> cvs commit -m "User likes Italian one"

cvs commit: Examining .

Checking in Number.txt;

/Users/dave/sandbox/sesame/Number.txt,v <-- Number.txt

new revision: 1.5; previous revision: 1.4

done

现在回到 sesame 目录中。记住我们在模拟两个不同的用户,假装此时不知道 Aladdin 修改的部分,并且试图签入修改的文件。

work/sesame> cvs commit -m "One should be Japanese"

cvs commit: Examining .

cvs commit: Up-to-date check failed for 'Number.txt'

cvs [commit aborted]: correct above errors first!

         以前我们曾经看到过这个消息:需要进行更新以得到仓库中修改的代码。

work/sesame> cvs update

cvs update: Updating .

RCS file: /Users/dave/sandbox/sesame/Number.txt,v

retrieving revision 1.4

retrieving revision 1.5

Merging differences between 1.4 and 1.5 into Number.txt

rcsmerge: warning: conflicts during merge

cvs update: conflicts found in Number.txt

C Number.txt

         现在看起来似乎不妙: CVS 告诉我们当将仓库中的版本与我们在本地修改的文件进行合并时发现了冲突。我们努力工作的成果会全白费吗?不。

         当发生冲突时,主要是由于两个开发者有一些误会。对于本例,一个开发者想把第一行修改成意大利文,而另一个想用日文。想一下你就会明白这里存在交流上的问题,这是一个团队中的问题。不管什么原因,我们要解决的问题是,“这一行实际上应该是什么?” CVS 没有为用户提供一条热线,所以它不能解决这个问题,而只能给这个文件添加特殊的注释来显示发生了哪些冲突。


本例中,如果我们查看文件 Number.txt ,会发现它看起来像下面的样子:

文件 Number.txt:

ZERO

<<<<<<< Number.txt

ichi

=======

uno

>>>>>>> 1.5

two

three

four

five

SIX

         带有 <<<<<< >>>>>>> 的行显示了冲突发生的位置。在这两行之间 可以看到我们修改的部分以及仓库中存在冲突的修改部分。接下来,我们需要做一些检查工作。第一件需要做的事情是找出仓库中修改的部分是谁做的。 cvs log 命令用于显示一个或多个文件的历史,所以它可以帮助发现这里所发生的一切。

work/sesame> cvs log -r1.5 Number.txt

RCS file: /Users/dave/sandbox/sesame/Number.txt,v

Working file: Number.txt

head: 1.5

branch:

locks: strict

access list:

symbolic names:

keyword substitution: kv

total revisions: 5; selected revisions: 1

description:

----------------------------

revision 1.5

date: 2003/04/22 18:22:07; author: dave; state: Exp; lines: +1 -1

User likes Italian one

===============================================

         在最后两行,可以看到这次修改的作者的名称连同签入时的注释,我们可以向他询问这样修改的原因。给客户打一个电话之后,这个问题就解决了:客户希望单词“ one ”用日文而“ two ”用意大利文。 Aladdin 一定是搞错了。在这个新信息的帮助下,现在就可以解决这个冲突。在 sesame 目录中编辑 Number.txt 文件,移走 CVS 的冲突记号,并且按照客户的要求进行修改。


文件 Number.txt ( sesame ) :

ZERO

ichi

due

three

four

five

SIX

因为已经移走了冲突记号,现在可以提交这个文件。

work/sesame> cvs commit -m "One is Japanese, two Italian"

cvs commit: Examining .

Checking in Number.txt;

/Users/dave/sandbox/sesame/Number.txt,v <-- Number.txt

new revision: 1.6; previous revision: 1.5

done

         CVS 实际上已帮我们发现了一个误解之处。冲突解决了,并且每个人都很高兴。乐观锁确实名副其实。需要强调的是,在实际项目中这种冲突极少发生。

         另外一点要指出的是, CVS 并不能猜出人们的想法。两个人可能以两种不同的方式修复同一个错误。如果这些修改在源代码级没有冲突,那么这两者都会被 CVS 接受,即使是对同样的代码,同时使用这两种修复方式是没有任何意义的。因此,没有冲突只是意味着在文本级上你和其他人修改的地方没有重叠,但还是应该依靠单元测试来检验修改的代码能否正常工作。

         以上是我们对 CVS 的一次快速预览。在此,你可以把该仓库留在原地。以后如果想在实际的项目仓库上使用一个特别的功能之前试验一下,你会发现这个仓库还是有用的。

分享到:
评论

相关推荐

    版本控制的利器——CVS(在Windows环境下使用CVS)

    使用 4.1从服务器下载文件 4.1.1查看服务器里有哪些工程模块 4.1.2第一次下载新的模块(目录) 4.1.3获取文件最新版本 4.1.4从服务器恢复文件以前版本 4.2把文件增加入服务器 4.2.1增加工程模块(Module目录...

    配置管理 —— cvs 配置管理版本库控制中很好的资料

    配置管理版本库控制中很好的资料 值得推荐 对初学者很有帮助

    Git+TortoiseGit+中文语言包 分布式版本控制系统

    用诸如Subversion或者CVS的集中式版本控制系统,如果你不能连上中央版本库你就不能工作。有了Git,在你的本地机器上几乎能做任何事:提交、查看项目完整历史记录、合并(merge)或者新建分支……Git让你来决定何时何...

    SVN客户端——64位

    SVN是Subversion的简称,是一个开放源代码的版本控制系统,相较于RCS、CVS,它采用了分支管理系统,它的设计目标就是取代CVS。互联网上很多版本控制服务已从CVS转移到Subversion。

    SVN服务器VS2005客户端part2

    Elliotte Rusty Harold 介绍了 Subversion —— 一种开放源码、多用户版本控制系统,支持非 ASCII 文本和二进制数据。通过 Elliotte 的介绍,您可看到如何在 Eclipse 中配置 Subversion 支持(通过 Subclipse 插件)...

    SVN服务器与VS2005客户端par1

    Elliotte Rusty Harold 介绍了 Subversion —— 一种开放源码、多用户版本控制系统,支持非 ASCII 文本和二进制数据。通过 Elliotte 的介绍,您可看到如何在 Eclipse 中配置 Subversion 支持(通过 Subclipse 插件)...

    使用SUBCLIPSE——针对ECLIPSE的SUBVERSION插件

    火龙果软件工程技术中心 摘要Subversion(SVN)是一个版本控制系统,是CVS的极具竞争力的替代品。它支持CVS所缺少的一些重要特性,比如版本化的重命名、目录和元数据;还支持原子提交和通过HTTP/HTTPS的远程访问。...

    协作开发中的质量保证技术——并行版本控制、每日构建和交付工程

    火龙果软件工程技术中心 摘要本文以cvs为例,介绍了软件工程中,编码过程中对于版本控制的运用的一些技巧。在最后部分,还介绍了软件工程最后的“交付工程”。问题的提出编码过程是软件工程的重要一环。这一部分...

    Git版本管理工具

    Git是一个分布式版本控制工具,它的作者LinusTorvalds是这样给我们介绍Git——Thestupidcontenttracker(傻瓜式的内容跟踪器)Git最初由LinusTorvalds编写,用于Linux内核开发的版本控制工具。Git与常用的版本控制...

    leetcodepushfront-SQL_work:SQL_work

    leetcode 推前SQL 和 Git 简介:这个仓库记录了我的学习、历史、在实际...类似于其他版本控制系统——Subversion、CVS 和 Mercurial 等等。 所以,Git 是一个版本控制系统,但这意味着什么呢? 当开发人员创建一些东

    软件操作培训教程.pptx

    2.Subversion相关软件 基于Subversion和TortoiseSVN的版本控制系统 Subversion:是一个开源的版本控制系统,拥有CVS的大部分特征,并在CVS的基础上有更强的扩展,用来代替 CVS 系统。 TortoiseSVN:SVN的客户端工具...

    IDM.UEStudio.v11.20.0.1006.Incl.Keymaker-CORE

    制作了一款强大的应用程序,它拥有激动人心的崭新功能,例如对 30 多种流行编译器的本机支持,集成 CVS 版本控制,内置类浏览,语言智能(类似于 Intellisense),项目转换器,批生成器以及集成调试器——这些只是...

    Linux高级路由和流量控制

    2.5. 访问,CVS和提交更新 4 2.6. 邮件列表 4 2.7. 本文档的布局 4 第3章 介绍 IPROUTE2 6 3.1 为什么使用 IPROUTE2 6 3.2 IPROUTE2 概览 6 3.3 先决条件 6 3.4 浏览你的当前配置 7 3.4.1. 让ip显示我们的...

    Git.docx

    Git对每次提交,有变化的文件都会整个文件存储起来,而不是像其它版本控制系统,比如cvs,svn,perforce等存储的是文件的差异部分。但是git有package机制,适当的时候会自动运行git gc命令(也可以手动运行)对文件...

    Java SE实践教程 源代码 下载

    13.1.2 版本控制系统 356 13.1.3 统一建模语言 359 13.2 练习 360 13.2.1 建立CVS的使用环境和基本操作 360 13.2.2 使用标记和分支 373 13.3 使用UML建模 376 13.3.1 对基本结构建模 376 13.3.2 对高级结构...

    Java SE实践教程 pdf格式电子书 下载(一) 更新

    13.1.2 版本控制系统 356 13.1.3 统一建模语言 359 13.2 练习 360 13.2.1 建立CVS的使用环境和基本操作 360 13.2.2 使用标记和分支 373 13.3 使用UML建模 376 13.3.1 对基本结构建模 376 13.3.2 对高级结构...

    Java SE实践教程 pdf格式电子书 下载(四) 更新

    13.1.2 版本控制系统 356 13.1.3 统一建模语言 359 13.2 练习 360 13.2.1 建立CVS的使用环境和基本操作 360 13.2.2 使用标记和分支 373 13.3 使用UML建模 376 13.3.1 对基本结构建模 376 13.3.2 对高级结构...

    asp.net知识库

    ASP.NET 2.0使用Web Part创建应用程序之二(共二) 体验 .net2.0 的优雅(2) -- ASP.net 主题和皮肤 NET2.0系列介绍(一).NET 2.0 中Web 应用程序主题的切换 ASP.NET 2.0 中Web 应用程序主题的切换 2.0正式版中...

    beamer:使用 Latex Beamer 的演示模板

    投影仪使用 Latex Beamer 的演示模板文本文件要编辑的...模型依赖性极低(乱码和错位少)由于源代码随手可得,因此使用 git 或 cvs 进行版本控制很容易(对于喜欢编写程序的人)坏处由于基本都是LaTeX,所以在MS PPT等

Global site tag (gtag.js) - Google Analytics