分布式版本控制软件水银(Mercurial)使用指南1
Ground Up Mercuial
即使你只是一个人在战斗,你也应当使用水银来得到版本控制的诸多好处。此教程会展示将一个文件夹交由水银管理是多么地容易,你可以因此而方便地跟踪软件的旧版本。
水银是一个版本控制系统。开发者用它来管理源代码。用它的目的主要有两个:
- 它跟踪旧版本的每一个文件。
- 它可以合并不同版本的代码。因而团队成员可以各自独立地工作,然后把他们所作出的改变合并到一起。
如果没有水银,你可能需要复制一大堆文件夹来保存你的旧版本:
多个copy版本这样做会占据很多磁盘空间,并且过段时间你就搞不清楚哪个是哪个了。使用版本控制器可以很好地解决这个问题。
大多数人使用命令行来管理水银,它在Windows, Unix和Mac平台上都适用。水银的命令为hg:
用命令行使用水银仅仅输入hg,你会得到一个常用命令的列表。你也可以输入hg help来获得一份更为详尽的列表。
为了使用版本控制,你需要一个repository(仓库)。仓库里保存了你所有文件的历史版本。为了节约硬盘空间,它并没有真的去保存每一个历史版本——它只是保存了版本之间的差异。
在以前,建一个仓库是一件大事。你需要一个中央服务器,并且在上面装软件。然而水银是分布式的,你不需要建什么中央服务器。你完全可以就在个人计算机上使用它。而且建一个仓库超级容易:你只需要进入代码的顶层目录……
进入顶层目录……,然后输入hg init:
创建一个水银的仓库等等,好像什么事也没有发生?然而,如果仔细瞧一瞧,你会发现多了一个叫.hg的新目录:
多了一个.hg目录那就是仓库!那是一个装满着水银所需的所有文件的目录。里面有一些设置,有文件的历史版本,有标签tags,还有备份,等等。记住这句忠告吧:不要修改里面的任何东西。你也不需要与这个文件夹直接打交道。
好了,我们现在有了一个新的仓库。我们想要把一些源代码添加进去。很简单,输入hg add。
添加文件还需要一个步骤…你需要提交变更。什么变更?变更就是:你添加了那么多的文件。
你为什么需要提交?用水银的时候,提交就好比是说:“嘿,请你记住现在这样的文档布局和内容。”这就好像是拷贝了一下整个文件夹…每一次你改变了一些内容,你就可以commit一下。
提交变更水银会弹出一个编辑器,从而你可以输入一些提交信息。这些信息只是为了提醒你自己,这次提交作了哪些改变。
记录变更当你保存并退出,你的文件就被提交了。
你可以输入hg log来看一看历史变更。这就像你的仓库的部落格。
查看历史变更现在不如再来编辑一个文件,看看会发生什么。
变更一个文件现在我们又作了另外一个变更,我们可以用hg commit来提交。
提交变更看,水银能够知道只有一个文件,a.txt被改变了:
显示变更提交过后,我们再来看看log:
此时的log就像任何现代的部落格一样,水银把最新的事件放在最上面。
再来一次变更:
再次变更一个文件提交:
提交变更提交信息:
提交信息现在的log:
现在的logOK。到现在为之,我做了一些变更。而且每当我作出一个重要的变更之后,我都会把它提交到仓库中去。
我知道你在想些什么。你在想,“JOEL, 这简直在浪费时间!”为什么一个提交讲这么久!真是懒婆娘的裹脚布!
请耐心一点,年轻人!你马上就会学到如何从提交中得到好处。
首先,比如说你在编辑的时候犯了点错。
文件编辑出错了然后,天呐,你删了一些非常重要的文件。
又误删了一些文件【此处有原作者的小故事。因与主题关系不大,略过……】
感谢水银,当你对自己的改变不满时,你可以输入hg revert。水银会把你的目录里的所有东西恢复到最后一次提交时的样子。
水银来帮你恢复之所以使用参数--all是因为想要把所有的文件都回滚到它们的初始状态上。
因此,当你使用水银管理你的源代码时,你可以:
- 做一些变更
- 看它们是否正确有效
- 如果是,则commit它们
- 如果不是,则revert它们
- GOTO 1
(我知道,我一会儿用Windows的CMD界面,一会儿又用GOTO语句,一定会招来你们的不满与吐槽。)
随着时间的流逝,你可能不记得每个版本都具体做过哪些变化。不过不要紧,水银替你跟踪了。你只需要输入hg status,水银就会给你显示你改变过的文件。
假设我首先创建了一个文件,然后编辑了一个文件,最后删除了一个文件。
显示改变过的文件hg status将你改变的任何一个文件都显示出来。“M”表示“更改”——文件被修改过了。“!”表示丢失——文件本来应该在的,可现在却没了。“?”表示不知道——水银对那个文件现在还一无所知。
我们一个一个来看。那个更改了的文件,a.txt。更改了什么?你可能已经忘了。有一个命令可以帮助你:hg diff。它会告诉你从上一次的提交到现在,文件作了哪些变化。
跟上一次提交相比当前的变化这种格式似乎有一点神秘,但最让人感兴趣的部分是:如果那块看到一些行前面有一个减号,表示它们被删除了;一些行前面有一个加号,则表明这些行被添加了。所以上面的例子中,“Normal people”被编辑成了“Civilians”。
现在来看那个遗失的文件,favicon.ico。像之前说的那样,如果你并不想删除它,则可以使用hg revert;如果你真的要删除它的话,你需要告诉水银:
删除文件“R”表示“Removed”。因此下次commit的时候,这个文件将被删除。最后,我们需要加上新的文件,b.txt:
添加文件“A”表示“Added。”你有没有发现我已经懒得把hg status打全了?水银只需要足够多的可以区分的字母。而以st打头的也只有这一条命令而已。
把所有的?和!都解决了之后,就可以继续commit了。
提交变更关于hg log还有一件事:变更集(changeset)那一行显示了一个数字……实际上是两个数字。一个简单的,比如“0”来表示最初的版本。还有一串长的,十六进制的数字你可以暂时忽略。
记住,水银保存了足够的信息,可以来重构任何一个历史版本。
首先,一个简单的命令hg cat可以被用来打印某个文件的任何历史版本。
例如,我们可以看看a.txt现在长什么样子。
如果想看它过去的样子,可以加一个-r("revision")参数:
查看文件在某个版本时的内容如果文件很长,很复杂,并且其实至改变了一点点。那我们可以使用hg diff带上-r参数来查看两个版本之间的差异在什么地方。
查看两个版本间的差异最后,在你快达到你看一篇文章的身体极限之前,我还想告诉你一件小事:你可以使用hg update这个命令来到达你想要的任何一个版本。
到达指定的版本如果不带任何参数,则hg update会更新到最新的版本。
自测
OK! 此为教程1。下面是你应当已经掌握的知识:
- 创建一个仓库
- 在仓库中添加或删除文件
- 当做了变更,看看有哪些没有提交的变更,然后
- 如果你觉得这些变更还不错,就commit,
- 如果你觉得这些变更不行,就revert。
- 查看文件的旧版本,并让自己的工作目录可以update成任何一个版本。