hg转git的那些事

来源:互联网 发布:会员积分软件免费版 编辑:程序博客网 时间:2024/06/05 17:36

其实网上的信息真的很多很多了,不管是度娘还是谷歌,搜关键字“git”,所有的信息都有了。最简单的入门也好,高级操作也罢,在这个信息爆炸的时代,想要的不想要的信息,都触手可及。那我写这篇文章的意义何在呢?——权当总结吧。

背景

公司说,为了提高大家的效率以后都要用git,用惯了hg的我们积极响应公司的号召,弃hg投git。此为记。

软件及其他

权衡了利弊之后,最终选择的小乌龟版的git,版本号已经到1.8.14.0了,除此之外还下载了汉化包。图形化界面上来说,hg是胜git一筹的。hg有workbench,为毛git没有workbench,这不是赤裸裸的歧视吗╭(╯^╰)╮虽然说smartgit类似于hg的workbench,但界面元素太多看起来也容易让人头大(实际上是觉得smartgit速度太慢而且秘钥总是配不起来所以放弃了)。

基础操作

先回忆下hg的常用操作,pull,update,push,merge,天天用的也就这四个了吧。那如果要转到git上来,搞定了跟hg这四个操作对应的命令,应该就可以万事大吉了。push和merge这两个操作,git的表现和hg完全一样,略过,pull和update就有点差别了。我们都知道,hg的pull只是把代码拉下来,并没有更新到本地,update是将拉取到的代码更新到本地,而git的pull却不是这样——它把update的活也给干了。在git中,单纯拉取代码的命令是fetch。这个点是平时使用中最大的区别了。我用的小乌龟git汉化之后,fetch和pull的汉语分别是获取与拉取,刚开始使用的时候挺容易弄混的,需要小心谨慎。

分支

过去三年的时间里,我所经历的三个项目组都使用的hg,但不知道为什么,无一例外采用的是分仓库的方式进行代码的隔离,比如XXX-stable、XXX-alpha、XXX-beta,这样就造成了一种情况——本地有N多重复的代码库。犹记得当时乐园的代码库多达七八个,本地集成开发环境一打开,映入眼帘的是uzone-stable、uzone-alpha、uzone-agile、uzone-quick等等,甚是壮观。现在想想,过去的我们一直说“在不同的分支上开发”,实际上我们一直都是“在不同的仓库上开发”。

去年某一天,偶然中我惊讶地发现,hg也是有branch的!没错,不是repository,而是branch。现在使用了git后回看hg的branch,我觉得这俩货的branch都是一样的。但是公司在推广git的时候极力推荐单个仓库多分支开发(这次是真的多分支)。为什么这样做,依稀记得是说这样很便捷。好吧,这样不清不楚的表达,真不像一篇严肃认真的博客该有的作风啊!那我们就具体解释一下吧。git和其他版本控制工具的不同之处在于,它保存的不是文件差异或者变化量,而是文件快照。每次commit之后,git会保存一个commit对象,这个对象包含一个指向暂存文件快照的指针和该提交对象的父对象指针。注意,关键词是指针。git默认的分支是master,在一开始创建git仓库的时候指向master的指针就存在了,每次commit后master分支指针就移动到最新的commit上。git怎么新建一个分支呢?很简单,建一个新的分支指针就好啦,比如说建个alpha分支,git只要new一个名为alpha的分支指针,将这个指针和master指针指向相同的commit就算建好啦!所以git建分支的速度超级快(因为做的事实在太少了)。分支建好之后,就像一棵树一样有了分叉,那之后master指针和alpha指针就分道扬镳了,各自奔向人生的旅程。而hg的分支不是这样子滴,但hg咋个处理的这里就不细讲了(真相是我并不知道/(ㄒoㄒ)/~~)。so从hg换成git后,首先我们要确定的是,1.一个仓库到底行不行;2.多分支之间怎么并行开发。

插入的一段话——由于这篇文章太啰里啰嗦一时半会没写完然后组内就开周例会了,在例会上leader为大家解答了为什么hg时代没有使用多branch的原因。简单来说,hg本身是有branch的没错,但是各个项目组不约而同采用了多仓库的形式,实际上是牺牲了单个仓库多branch的便捷及代码简洁的优点,承担了维护多个仓库及本地代码冗余多份的缺点,达到“强”代码隔离的目的。因为当年的uzone是一个蛮大的项目组,开发人员有三四十人,每个人对hg的掌握程度不一,如果只有一个hg仓库每个人push到不同的branch上的话,出现误操作的可能性就非常大——插入的这段话结束。

最后在例会上大家结合当前的情况各抒己见,最后决定采用一个仓库多个分支的情况,原因如下:现在组内的每个子项目一般都是两个人在维护,系统支撑组也对我们进行了比较完善的git培训,加之git可以选择对仓库的某一分支进行保护操作(比如将master设为保护分支,只有拥有最高权限的人可以推代码上去),综合考量使用一个仓库多分支的利大于弊。

那么现在回答刚才提到的两个问题。第一个问题已经有明确答案,当然可以,不再啰嗦。第二个问题,多分支并行开发也很简单。首先查看当前的仓库有多少分支:

git branch 

git branch的结果至少有一个——master——这个是默认分支,必须有的。如果结果列表中已经有了你需要工作的分支,比如alpha,那么通过命令切换:

git checkout alpha

这样你就切换到alpha分支上开发了。一般来说本地的分支都会和远端的某个分支对应的。在本地开发完成后推代码时,注意需要选择远端的对应的分支。

如果本地不存在你需要工作的分支,那么需要新建分支,命令如下:

git branch alpha -- 新建分支alphagit branch beta  -- 新建分支betagit branch gamma -- 新建分支gamma

然后git checkout 分支名就OK。或者采用

git checkout -b <new_branch>

这个命令将新建分支和切换分支的动作合二为一了,更为方便。

如果有三个同学A、B、C需要同时对一个仓库开发,那么进行了如上的操作后,三位同学可以分别在三个分支上开发,互不影响。如果A先开发完毕且上线了,可以将A开发的分支(如alpha)合并到master分支。操作步骤如下:

git checkout master -- 切回主干git merge alpha -- 合并

对于B和C来说,主干分支更新了,自己需要拿到主干的最新代码,这个时候只需要在本地执行git merge master就可以了(因为B和C本来就在beta和gamma分支上进行开发中)。至于合并的过程中有冲突怎么解决,我觉得对于有hg使用经验的人来说完全不是事,这里就不展开了。

学习与参考资料

网上参考资料太多了,有很多很好的使用手册,这里推荐http://git-scm.com/ 这个网站,本文在分支这一块的操作也参考了http://git-scm.com/book/zh/ch3-2.html。不啰嗦了,git走起!

0 0