附录D Git与Hg面对面
D.1 面对面访谈录
Git:你好Hg,我发现我们真的很像。
Hg:是啊,人们把我们都归类为分布式版本控制工具,所以我们之间的相似度,要比和CVS、SVN的相似度高得多了。
Hg:我是用Python和少部分的C语言实现的,你呢?
Git:我的核心当然是使用C语言了,因为Linus Torvalds最爱用C语言了。我的很多命令还使用了Shell脚本和Perl语言开发,Python用的很少。
Hg:大量使用C语言,是你的性能比我高的原因吗?
Git:当然不是了,你不也在核心模块使用C语言了么?问题的关键在于我的对象库设计得非常优秀。你不要忘了我是谁发明的,那可是大名鼎鼎的Linux之父Linus Torvalds啊,他对Linux文件系统可是再熟悉不过的了,所以他能够以文件系统开发者的视角来实现我的核心。
Git:还有我的网络传输过程非常直观,可以显示实时的进度,好像我从你那里没有看到。之所以我能够有这样的实现,是因为我使用了“智能协议”。在网络传输的两端都启用了相应的辅助程序,实现差异传输及传输进度的计算和显示。
Hg:实际上我也支持进度显示[1],不过是通过Progress插件[2]实现的,需要通过修改配置文件启用该插件。
Hg:我有一个特点是SVN用户非常喜欢的,就是我的顺序数字版本号。
Git:你的顺序数字版本号只在本地版本库中有效。也就是说,你不能像SVN那样将顺序数字版本号作为项目本身的版本号,因为换成另外一个版本库的克隆,那个数字版本号就会不一样了。
Hg:我觉得你的暂存区(stage)的概念太古怪了。我提交的时候,改动的文件会直接提交而不需要进行什么注册到暂存区的操作。
Git:让读者来做评判吧。如果读者读过本书的第2篇,一定会说Git的暂存区帅呆了。
Hg:我只允许用户对最近的一次提交进行回滚撤销,而你(Git)怎么能允许用户撤销
任意多次历史提交呢?那样安全吗?
Git:这就是我的对象库和引用设计的强大之处,我可以使用git reset命令将工作分支进行任意的重置,丢弃任意多的历史。至于安全性,我的重置命令有一个保险:reflog,我随时可以参照reflog的记录来弥补错误的重置。
Hg:我们的revert命令好像不同?
Git:你Hg的hg revert命令和SVN的svn revert命令相似,是取消本地修改,用原始拷贝覆盖。你的这个操作在我这里是用git checkout命令来实现的。我也有一个git revert命令,但是这个命令是针对某个历史提交进行的反向操作,以取消该历史提交的改动。
Hg:我执行日志查看能够看到文本显示的分支图,你呢?
Git:我需要在日志显示时添加参数,即使用命令git log—graph。我支持通过建立别名来实现简洁的调用,例如建立一个名为glog的别名。
Git:我听说你Hg不支持分支?
Hg:你说的是昨天的我,现在有了Bookmarks插件[3],我也拥有和你类似的分支实现。不过传统来讲我还是以克隆来实现分支的。
Git:实际上我的每一个克隆的版本库也相当于独立的分支,但是因为我有强大的分支功能,因此很多用户还没有意识到。使用Topgit的用户就应该使用版本库克隆作为Topgit本身的分支管理。
Git:还有,因为我对分支的完整支持,使得我可以和SVN很好地协同工作。我可以将整个SVN转换为本地的Git库,但是你Hg,显然只能每次转换一个分支。
Hg:是的,我要向你多学习。
[1]感谢来自中国台湾的Willie Wu对我博客的评论。