You are on page 1of 22

第二章: 基本操作

在第一章中,我们介绍了 CVS 基础知识,并且初步学习了如何把一个目录


下的内容变成 Module,置于 CVS 管理下,放到仓库(Repository)中去。我们还学
习了 Checkout 操作,也就是从仓库中把某个 Module 提出来,放到本地目录下供
我们工作。
在本章中,我们将学习 WinCVS 中最常用的一些操作,掌握了它们,您就基
本掌握了如何用 CVS 管理日常开发了。

2.1 同步(Update)

同步,也叫 Update, 是把远程仓库中最新的修改同步到本地。


为什么要同步呢:简单说来,在多人共同工作的环境下,远程仓库中的某些
文件,你的同事可能已经修改了,CVS 服务器上是修改后的最新版本。Update
的操作能够把最新版本下载到你本地,你在别人修改的最新版本上进行修改,可
以避免版本冲突、浪费精力和重复劳动。Update 还有别的用处,我们在后面会
逐渐学到。

好习惯
“先同步 后工作”。每次使用 WinCvs 开始工作前,应该先 Update 一次,这样
我们就能在文件的最新版本上工作。

同步的操作:
使用鼠标选择一个目录或者一个文件,也可选择多个,使用下面三种等效操作即
可:
1)菜单: Modify->Update
2)快捷键:Ctrl+U
3)点击 Update 工具按钮, 如下图所示。
在上图中,我们选择”MyWork”目录,进行上述操作之一后,WinCVS 会显示下
面的信息:
cvs update (in directory F:\Working\MyWork\)
cvs update: Updating .
cvs update: Updating CIni
cvs update: Updating Doc

***** CVS exited normally with code 0 *****

现在,我们已经进行了同步,最新版本已经到了我们的工作目录下了,可在
此基础上进行工作了。

Update 与 Checkout 之间的区别


Checkout 是把 CVS 服务器上的 module 下载到本地进行工作。
Update 主要同步本地文件(目录)和 CVS 服务器库中相应文件(目录)之间
的差异,使本地相应文件是最新版本,另外 Update 也能执行获取文件旧版本的
操作。

2.2 提交修改(Commit)

我们对一些文件进行修改,来模拟日常的程序修改过程以及版本变化过程。
首先,为 WinCVS 配置一下外部文本编辑器。笔者最常用的文本编辑器是
UltraEdit, 我们在主菜单选择 Admin,再选择 Preferences 菜单项,就会出现下面
的 Preference 对话框。我们选择 WinCVS 栏目,把 UltraEdit 的可执行目录和程
序名填写到 Default Editor 中去:
注意,在上面的对话框中,还有一项叫 External diff, 这是文件差异比较工具,
也就是比较两个文件(或者同一文件的不同版本)差异的。笔者推荐使用 Araxis
Merge。关于文件差异比较,可参考本章的 2.7 节: “比较文件两个版本的差异”。
如何对文件进行编辑呢?
有三种不同的等效做法:
1)选择需要修改的文件,用鼠标双击它。
2)选择需要修改的文件,按 F4
3)用鼠标选择某个文件,然后按鼠标右键,在弹出的对话框中选择”Edit with
Editor”子菜单,如下图所示:
当我们在文本编辑器对选定的文件进行编辑,并且存盘之后,我们发现,在
WinCVS 中,这个文件图标变红了,如下图所示:

小提示
WinCVS 图标变红的文件,表示最近经过了修改,其内容已经和原来的版本产
生了差异。

如果我们认可对它的修改,就需要把这种修改提交给 CVS 管理起来。这是


通过使用提交(Commit)功能来实现的。它的作用是把您的最新修改记录到远程仓
库中去,并且升级修改后的文件版本(Revision)。
Commit 的实现,应先选择需要提交的文件,然后通过下面四个等效操作来
进行:
1)在主菜单中,选择 Modify,然后选择 Commit 菜单项。如下图所示:
2)使用 Ctrl+M 快捷键
3)直接点击 Commit 的工具按钮

4)点击鼠标右键,在弹出菜单中,选择 Commit。
无论通过上述哪种操作,WinCVS 都会在真正提交修改之前,弹出下面的对话框:

我们建议您在这个对话框中,对刚才的修改进行一些简单的说明,也就是
在”Enter the log message”下面,写上一些简洁的文字,如上图所示。
好习惯
“先注释,后提交”。对修改进行简单文字说明,是一个好习惯。这样,今后
你和你的同事都知道这个版本进行了什么样的改动,方便自己也方便别人。这
和在程序源代码中加入必要的注释道理类似。

成功地把修改提交到了远程仓库中之后,我们会看见新文件的版本已经从
1.1.1.1 变成了 1.2, 而且 WinCVS 也输出了许多关于这次提交的信息,如下图所
示:

2.3 添加文件(Add)

在开发过程中,工作目录中可能会因工程需要添加新的文件。如何把新的文
件置于 CVS 管理下?例如,在原来的工作目录(F:\Working)下,我们新增加了文
件 AboutDlg.cpp
这个新增加的文件,并不一定会出现在 WinCVS 的文件列表上。我们需要在
主菜单 View 下,选择 File Filter 子菜单,把 Hide Unknown 选项的钩去掉,才能
看见新加的 AboutDlg.cpp,如下图所示。请注意,现在出现在 WinCVS 中的
AboutDlg.cpp,其图标是一个问号,而且没有任何版本标志。这表明,它对于
WinCVS 是未知(Unknown)文件,CVS 并没有对 AboutDlg.cpp 进行版本管理。
所以我们需要把新的文件置于 CVS 管理下。
小提示
灵活使用主菜单 View->File Filter,我们能够方便地在 WinCVS 下观察不同类型
的文件。

向 CVS 添加新的文件,具体操作如下:先选中需添加的文件,然后在主菜
单 Modify 下选中 add 即可,也可以直接使用工具条中的 Add 按钮,如下图所示:

需要注意的是,添加有三种方式:
add: 以文本方式添加,
add binary 以二进制形式添加,
add Unicode:以 Unicode 形式添加。
对于源代码,需要用文本形式添加,而对于图形文件,声音文件,Word 的 Doc
文件等等,都需要用二进制方式添加。

警示:
如果以文本方式添加二进制文件,可能会对二进制文件造成损害。

AboutDlg.cpp 是源代码,我们用文本形式添加之后,出现下图所示情况:
首先,AboutDlg.cpp 出现了一个标有红色字母”A”的图标,它的版本(Revision)
是“0”。
其次,WinCVS 的输出信息提醒我们:

cvs add AboutDlg.cpp (in directory F:\Working\MyWork\)


cvs add: scheduling file `AboutDlg.cpp' for addition
cvs add: use 'cvs commit' to add this file permanently

***** CVS exited normally with code 0 *****

这些信息告诉我们,WinCVS 已经计划(scheuling)把 AboutDlg.cpp 加入了,


需要你使用提交(commit)命令真正地把文件加进来。
所以,我们选中 AboutDlg.cpp,使用 Commit 指令把它提交到仓库中。关于如
何使用 Commit 操作,请见 2.2 节。经过 Commit 之后,AboutDlg.cpp 的图标变
成了正常图标,而且版本变成了 1.1。到此,向 CVS 中添加新文件的操作就完成
了。

2.4 删除文件

删除文件有两个命令,一个是 Remove,一个是 Erase,都在主菜单 Modify 下面。


其中,Remove 是同时把文件从本地和远程仓库删除掉,而 Erase 是删除本地文
件,不动远程仓库中的版本。
警示:
您在使用 Remove 和 Erase 命令的时候,一定要弄清楚区别,以免造成损失。

Remove 操作方法是:先选择需要从 CVS 管理中删除的文件,再选择主菜单


Modify,然后选择 Remove 子菜单。也可更直接地使用工具按钮,如下图所示:

操作后,情况如下图所示:

上述信息表明,第一:AboutDlg.cpp 已经从 F:\Working 目录下删除,放到回收箱


(recycle bin)去了。第二,为了从 CVS 仓库删除它,您还需要进行 Commit 操作。
Commit 操作的具体方法,可见 2.2 节。
与 Remove 相似的功能是 Erase 功能,在 Modify 主菜单下。Erase 的功能是把你
本地的文件删除掉,而远程仓库中的相应文件不受影响。当您选择一个文件,进
行了 Erase 操作之后,这个文件被打上了“Missing”的标记,含义是这个文件在
远程仓库有,而本地不存在。如下图所示:

既然这个被 erase 的文件在仓库中有,我们就可以从仓库中把它取回一份到本地。


具体操作是:选定状态为 missing 的文件,按下鼠标右键,在弹出菜单中,选择
“Update…”子菜单,如下图所示:
在随后出现的对话框中,钩上“Get the clean copy”选项,如下图所示:

按“确定”,就会发现已经在本地删除的文件又从远程仓库拷贝了一份回来。
2.5 添加目录

添加目录:在项目开发过程中,如果本地新增加了子目录,也需要 CVS 管
理起来的话,就需要添加新增加的子目录。
练习操作:
在本地 F:\Working 目录下,新建立一个子目录叫“新添加的目录”。

小提示
您可以给新的子目录起任何名字,我们这里只是示意。

把若干文本文件和二进制文件拷贝到“新添加的目录”。
用鼠标选“新添加的目录”,再在主菜单 Modify 下,选择“Add”,如下图所
示。

这样新的子目录就被加上了,见下图:
遗憾的是,新添加的目录下那些文本文件和二进制文件都没有被加入到 CVS 中。
你需要自己手动把这些文件一一加入。

小提示
使用主菜单 Modify->Add 添加子目录时,WinCVS 不会自动把子目录中的内容
添加到 CVS 仓库中,您需要自己手动添加。

这当然很不方便,希望新版本能够解决这个问题。添加文件的具体操作,请
参考本章 2.3 节:“添加文件”

2.6 删除目录

那么,如何把 CVS 一个 Module 中的子目录删除掉呢?例如,我们想把上


图”CIni”子目录删除掉。遗憾的是,WinCVS 界面上并没有这样的功能。怎么办
呢?办法是有的,我们可以到远程仓库中,手动地把 MyWork 子目录下,Cini
子目录删除掉,如下图所示:
然后我们再使用 Checkout Module 的功能,从远程仓库重新获取 MyWork,
就可以了。关于 Checkout Module 的操作,可参考第一章有关内容。

2.7 查看文件的版本历史沿革

WinCVS 提供了很方便的图形功能,能够让我们以形象的方式来查看文件版
本的历史沿革,并比较任意两个版本之间的差异。
在我们的例子中,我们先对某个文件,比如 GuiDrawLayer.cpp,进行多次修
改和提交,使其版本变成 1.5,这样做的目的是为了演示 WinCVS 显示版本历史。
文件的修改和提交,可参考本章的 2.2 节,提交修改(Commit)。
现在,让我们选择需要查看版本历史的文件,例如 GuiDrawLayer.cpp。然后
选择主菜单 Query,选择“Graph”菜单项。这个操作也可用 Ctrl+G 快捷键或者
工具条上的“Graph selected”按钮来实现。如图:
现在,选定文件的所有版本出现在一个图形文件中,如下图所示:
这个图形显示的,是文件的版本变化历史,非常直观。
您可以用鼠标选择任意的版本,例如 1.4, WinCVS 将在信息输出区显示这个
版本的相关信息,这些信息,其实是您在 Commit 的时候,自己输入的。
利用这个版本历史图,我们可以进行很多有用的操作,例如比较文件任意两
个版本的差异,获取某个版本文件的内容等。

2.7 比较文件两个版本的差异

我们只要在文件版本历史图中,选择两个版本,就可以比较它们的差异。具
体操作是:
1) 显示文件版本历史图,具体操作见本章 2.6 节。
2) 在图中,选择两个需要比较的版本。例如,我们先用鼠标选中 1.2, 然后按下
Ctrl 键,再用鼠标选中 1.5, 就可以比较版本 1.2 和 1.5 的差异了。
3) 在主菜单 Graph 中,选中“Diff”菜单项,或者按 Ctrl+D 快捷键。见下图。
如果您安装并配置了文件差异比较工具,例如 Araxis Merge, (见本章 2.2 节),
文件比较工具就会把这两个版本文件之间的差异显示出来,这对于软件开发工作
非常有用。

2.8 提取文件从前版本的内容

在软件开发过程中,由于种种原因,有时候需要某个文件从前的一个版本内
容。WinCVS 提供了非常方便的手段来实现这一点。操作过程是:
1)显示特定文件版本历史图,具体操作见本章 2.6 节。
2)在版本历史图中,选中需要提取文件内容的版本。
3)按鼠标右键,在弹出菜单中选中”Retrieve revision as….”,见下图。我们的例
子中,选择了 1.2,也就是需要获得 GuiDrawLayer.cpp 文件的 1.2 版本内容。

现在 WinCVS 就会把 1.2 版本文件内容提取出来,让您保存起来。在另存为


对话框中,填入合适的文件名,就可以了。如下图所示。
2.9 从文件的某个版本重新开始

软件开发过程中,经常有这种现象:改着改着把某文件改糟了,不想用了,
想获取一份从前好的版本,在它的基础上重新开始修改。WinCVS 提供了方便的
手段来实现这一点。
在下面的例子中,我们在 GuiDocSpecial.cpp 文件的 1.2 版本上进行修改,结
果没有改好,我们想回复原来的 1.2 版本。
具体操作方法是:选择 GuidocSpecial.cpp,然后进行 Update 操作,如下图所
示:

然后在 Update 的对话框中,钩上“Get the clean copy”选项,见下图:


于是 1.2 版本就又回来了。
紧接着的问题是,如果我们觉得 1.2 版本也不好,想从 1.1.1.1 版本开始改,怎么
办呢?
其实使用 Update 功能,可以获得文件的任意版本。具体操作是:
选择文件后,进行 Update 操作。操作方法见本章 2.1 节。
在 Update 的对话框中,点击”Update option”栏目,在”By revision/tag/branch”处打
上钩,并填写想取回的版本号,点击“确定”就可以了。在我们的例子中,我们
想取回版本 1.1.1.1,操作界面如下:
本章介绍的是 WinCVS 最常用的几个功能,20%的功能能够覆盖 80%的需求。
更高级和复杂的版本控制,我们在第三章学习。

You might also like