美文网首页开发@产品今日看点
分布式版本控制软件水银(Mercurial)使用指南1

分布式版本控制软件水银(Mercurial)使用指南1

作者: 行之与亦安 | 来源:发表于2016-09-06 16:29 被阅读430次

    Ground Up Mercuial

    翻译自:http://hginit.com/01.html

    即使你只是一个人在战斗,你也应当使用水银来得到版本控制的诸多好处。此教程会展示将一个文件夹交由水银管理是多么地容易,你可以因此而方便地跟踪软件的旧版本。

    水银是一个版本控制系统。开发者用它来管理源代码。用它的目的主要有两个:

    1. 它跟踪旧版本的每一个文件。
    2. 它可以合并不同版本的代码。因而团队成员可以各自独立地工作,然后把他们所作出的改变合并到一起。

    如果没有水银,你可能需要复制一大堆文件夹来保存你的旧版本:

    多个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:

    现在的log

    OK。到现在为之,我做了一些变更。而且每当我作出一个重要的变更之后,我都会把它提交到仓库中去。

    我知道你在想些什么。你在想,“JOEL, 这简直在浪费时间!”为什么一个提交讲这么久!真是懒婆娘的裹脚布!

    请耐心一点,年轻人!你马上就会学到如何从提交中得到好处。

    首先,比如说你在编辑的时候犯了点错。

    文件编辑出错了

    然后,天呐,你删了一些非常重要的文件。

    又误删了一些文件

    【此处有原作者的小故事。因与主题关系不大,略过……】

    感谢水银,当你对自己的改变不满时,你可以输入hg revert。水银会把你的目录里的所有东西恢复到最后一次提交时的样子。

    水银来帮你恢复

    之所以使用参数--all是因为想要把所有的文件都回滚到它们的初始状态上。

    因此,当你使用水银管理你的源代码时,你可以:

    1. 做一些变更
    2. 看它们是否正确有效
    3. 如果是,则commit它们
    4. 如果不是,则revert它们
    5. 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。下面是你应当已经掌握的知识:

    1. 创建一个仓库
    2. 在仓库中添加或删除文件
    3. 当做了变更,看看有哪些没有提交的变更,然后
    4. 如果你觉得这些变更还不错,就commit
    5. 如果你觉得这些变更不行,就revert
    6. 查看文件的旧版本,并让自己的工作目录可以update成任何一个版本。

    相关文章

      网友评论

      • jk2671:和git有啥区别?
        行之与亦安: @jk2671 子非鱼的问题与你的问题相似,已回复。
      • 934f22e633f6:git呢。
        行之与亦安: @子非鱼1210 我git用的不多。就我目前的经验而言,其实他俩大同小异。如果协同工作的环境为局域网,则水银更好用。如果要放网站托管,则支持git的网站更多。另外,如果要用GUI界面,则TortoiseHg比TortoiseGit更直观,好用些。
      • 升生:请教一下,这个和SVN有什么区别
        行之与亦安:@升生 水银是分布式版本控制,SVN是集中式控制。具体区别可以参看我的第一篇文章《分布式版本控制软件水银(Mercurial)使用指南0》。水银使用起来更方便轻巧。 :blush:

      本文标题:分布式版本控制软件水银(Mercurial)使用指南1

      本文链接:https://www.haomeiwen.com/subject/njbdettx.html