分布式版本控制工具:git与Mercurial(zz)
最早从今年初就已经开始用git。刚开始的时候的确会感到git比较复杂。一个原因是它不同于Subversion这样的集中式版本控制系统,在Subversion中只有一个仓库(repository),许多个工作目录(working copy),而像git这样的分布式版本控制系统中,每一个工作目录都包含一个完整仓库,仓库之间内容可能不相同,可以进行仓库之间的同步。另一个原因是git的命令非常之多,而它本身的概念也比较复杂(虽然 Linus说git是“stupid contenc tracker”,但其实这个东西不适合傻瓜使用),还分repository、index、working tree等,直接使用也会比较麻烦,所以实际上我一直都是使用cogito,只有必要时才直接使用git。
为什么要使用分布式的版本控制系统?Subversion有什么不好?
我最开始使用Subversion时一直觉得有一点很不爽,如果我想把某个已有的项目使用Subversion来进行管理,首先要建立一个仓库,然后把文件import到仓库,最后再check out,然后在check out的工作目录中进行修改。为什么要那么麻烦?我只是自己一个人进行开发而已,为什么非要有一个仓库?此其一,只是不爽而已。
第二点使我没有办法使用Subversion、不得不寻找其他的工具的原因是,我需要在几台电脑上同时进行开发,我希望在每一台电脑上都能使用版本控制工具。所以,我需要有一个放在优盘上的仓库,这个时候使用Subversion就有问题了。一来当你提交时你必须得把优盘插上电脑,每次提交都得插上;二来仓库在优盘上的位置不能改变,否则路径改变的话使用file协议拷贝出来的工作目录就废了。我查过svn propset的帮助,似乎可以改变仓库地址,但我不会,网上也没有搜到。
这两个问题git都可以很好的解决(严格来说我使用的是cogito)。要把已有的文件加入版本控制的话使用cg init一条命令即可。而分布式的版本控制系统解决第二个问题实在是再适合不过了。在优盘上建立一个仓库,不同机器上的仓库在开发时就尽管commit到本地的仓库好了,在要换机器之前先把修改push到优盘上的仓库,到其他机器上时pull出来,然后merge一下就好了。cogito可以直接使用update完成这两步操作。而优盘上仓库路径如果有改变的话可以使用cg-branch-chg很方便地修改远程仓库的地址。实际上可以认为优盘上的仓库就是一个中央仓库,所以有许多个仓库其实并不是一件可怕的事情,完全可以像使用集中式的版本控制系统那样自定一个为中央仓库即可。但分布式的版本控制系统不强制你这么做,给你更多的灵活性。
更加让我喜欢git的是它的branch概念。我在使用Subversion的时候从来没有用过,因为它的branch概念是通过copy来实现的(当然不是实际的拷贝),不够直观。目前我只用branch来进行实验性的开发。而Linus使用git管理内核开发时通过branch 整合多人所做的修改,内核有那么多的branch,Linus通过git可以很轻松的merge这些不同的branch所做的修改,最后从他自己的仓库中发布新版本的Linux内核。
此外,git对磁盘空间的利用也更高效(不过需要定期对仓库使用git repack -d命令),其他方面性能也都很出色。想想它要管理Linux内核那么大的项目就可以知道了。
Linus在Google Tech Talk上做过git的介绍,以及他是如何使用git来管理内核开发的。他的演讲里面对分布式版本控制系统的好处有更好的说明。不过Linus自己也承认自己是个“strong opinion person”,他在演讲的时候多次说集中式的版本控制系统没有前途,因此,Subversion的开发者想要开发一个更好的CVS其实是脑子出了毛病,实在是太“offensive”了。好在他是Linus,大家都知道他的个性。
但是,但是……git很好,可它不跨平台,至少在非Linux平台上运行得没有那么好,在非Linux文件系统上会有麻烦。虽然我不在Windows上做开发,但是最近要在Solaris上做开发,我不想花时间在Solaris上把git装起来,而且如果以后要和其他使用Windows的人合作,我可不想再使用Subversion。所以,我需要一个替代git的工具。
这篇文章介绍了Mozilla“移向”新版本控制工具时是如何做出选择。(原文强调是“move”而不是“pick”,因为最后的候选者都很好。)首先肯定要用分布式的,然后在4个分布式的版本控制工具中筛选,git和Monotone因为支持平台问题而被排除,剩下Bazaar和Mercurial。前者有 Canonicol在支持。而后者已经是OpenSolaris等著名项目的版本控制工具,而且有着非常完善的文档,可以很方便地使用Python的Web Server发布项目。在Mozilla的版本控制工具选择中,Mercurial最终因为性能而胜出。所以,我也决定转到Mercurial,看了看文档,感觉和cogito很像,比git更简单,迁移过程应该会比较顺利。
另外提一下,分布式的版本控制工具还有darcs,arch。前者是用Haskell编写,后者据说很复杂。
分布式版本控制工具:git与Mercurial(zz)的更多相关文章
- 痞子衡嵌入式:备受开源社区推崇的分布式版本控制工具(Git)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是分布式版本控制工具Git. 1.为什么需要版本控制系统? 单人软件项目开发过程,往往很多功能都是逐步增加的,在代码开发过程中,有的时候功 ...
- 开源分布式版本控制工具 —— Git 之旅
Git 主张的分布式代码库与文件快照的设计思想,相对于传统 CVS.SVN 等集中式.文件差异式版本控制工具是一种挑战与颠覆.Git 带来了离线提交.轻量级分支等诸多便利.不过,也有人质疑 Git 的 ...
- 分布式版本控制工具Git
一.Git技术简介 Git是一个分布式版本控制系统,与集中式的SVN不同. 1. 主要特点 集中式特点: 所有人的资源全部保存在中央服务器. 所有人开发前都需要从中央服务器上下载同步其他人的代码才能继 ...
- 版本控制工具——Git常用操作(上)
本文由云+社区发表 作者:工程师小熊 摘要:用了很久的Git和svn,由于总是眼高手低,没能静下心来写这些程序员日常开发最常用的知识点.现在准备开一个专题,专门来总结一下版本控制工具,让我们从git开 ...
- 版本控制工具 - Git
版本控制工具 - Git 安装完成后,打开Git Bash,这是一个命令行工具,用于操作仓库和仓库的文件.你可以通过命令将已经存在的项目变成仓库,也可以重新创建一个新项目再通过命令将其变成仓库,还可以 ...
- 版本控制工具Git工具快速入门-Linux篇
版本控制工具Git工具快速入门-Linux篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.版本管理系统的介绍 1>.版本管理系统的特点 1.1>.自动生成备份: ...
- 版本控制工具Git工具快速入门-Windows篇
版本控制工具Git工具快速入门-Windows篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 最近在学习Golang语言,之前的开发环境在linux上开发的,后来由于办公用的是w ...
- 版本控制工具Git介绍-01
使用版本控制工具是为了方便团队开发,比如多人共同维护一个项目的时候,用版本控制工具可以很方便的维护项目代码,如果哪天你改了一个版本,出问题了,我们也可以很快的找到你改了什么,这里介绍使用比较多的版本控 ...
- 强大得分布式项目管理工具Git
---恢复内容开始--- 强大的分布式管理工具-Git(一) 前言:最近忙着写项目,在期间呢,用的是git管理,由于一个项目的管理是很重要得,所以整理了一篇关于git得博客跟大家分享一下.大家都知道, ...
随机推荐
- 【翻译】View Frustum Culling --2 Geometric Approach – Extracting the Planes
在上一篇中,我们知道了视锥体的形状,并且也确定了我们进行裁剪时的步骤.那我们接下来要走的就是确定视锥体的六个平面: near, far, top, bottom, left and right 2.计 ...
- SML + NL + HJ
Join是一种试图将两个表结合在一起的谓词,一次只能连接2个表,表连接也可以被称为表关联.在后面的叙述中,我们将会使用”row source”来代替”表”,因为使用row source更严谨一些,并且 ...
- python基础入门学习简单程序练习
1.简单的乘法程序 i = 256*256 print('The value of i is', i) 运行结果: The value of i is 65536 2.执行python脚本的两种方式 ...
- zkClient的使用
ZKClient是由DataMeer的工程师StefanGroschupf和Peter Voss 一起开发的,在源生API接口基础上进行了封装,简化了ZK的复杂性. 1. 创建客户端方法:ZKClie ...
- vue初学:基础概念
一.vue使用步骤: 1.引包vue.js 2.html中写要操作的DOM节点 3.创建vue对象:new Vue({options}); 4.配置options:el:(要操作的对象,用选择器,同j ...
- jquery 事件委托(利用冒泡)
将事件绑定在父元素上,格式$(父元素).on("事件名称","子元素选择器",function(方法体){}) <!DOCTYPE html> &l ...
- VS PDB文件
转 PDB文件 PDB(Program Data Base),意即程序的基本数据,是VS编译链接时生成的文件.DPB文件主要存储了VS调试程序时所需要的基本信息,主要包括源文件名.变量名.函数名.FP ...
- stark组件之pop操作【模仿Django的admin】
一.先看下什么django的admin的pop到底是个什么东西 其实就是这么一个东西, a.在添加页面,在一对多和多对多的项后加了一个+号 b.点击这个加号,会弹出对应的添加 页面,在新的添加 c.添 ...
- linux命令学习之:ifup/ifdown
ifup命令网络配置 ifup命令用于激活指定的网络接口.ifdown命令用于禁用指定的网络接口. 实时地手动修改一些网络接口参数,可以利用ifconfig来实现,如果是要直接以配置文件,亦即是在 / ...
- android轮播图的实现原理
1.轮播图的点:RadioGroup,根据网络请求的数据,解析得到的图片的个数,设置RadioGroup的RadioButton的个数. 2.轮播图的核心技术:用Gallery来存放图片,设置适配器. ...