其实网上的信息真的很多很多了,不管是度娘还是谷歌,搜关键字“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 -- 新建分支alpha
git branch beta  -- 新建分支beta
git 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走起!

hg转git的那些事相关推荐

  1. hg和git命令对照表

    hg和git命令对照表 来源 https://github.com/sympy/sympy/wiki/Git-hg-rosetta-stone Git hg rosetta stone muxator ...

  2. hg和git命令对照表(值得拥有)

    转自:https://github.com/sympy/sympy/wiki/Git-hg-rosetta-stone Rosetta Stone hg git hg cat -r rev some_ ...

  3. Git和Mercurial(Hg)的分析

    译者: ninoz 原作者:jrobb...@gmail.com 发表时间:2011-08-06 浏览量:13875 评论数:1 挑错数:2 关于Git和Hg的区别(机制.性能等等),以及为什么Goo ...

  4. HG,GIT,SVN版本控制系统

    SVN,HG,GIT是三种常见的版本控制系统,本文简单列出一些相似的操作命令.当然,三种系统各有特点,严格的对应关系是没有的. 1,第一次下载,包括源码和版本库: svn checkout http: ...

  5. Mercurial和Git有什么区别?

    我一直在Windows上使用git一段时间(使用msysGit),我喜欢分布式源代码控制的想法. 就在最近,我一直在关注Mercurial(hg),它看起来很有趣. 但是,我无法解决hg和git之间的 ...

  6. Git之深入解析如何将项目迁移到Git

    一.前言 如果我们现在有一个正在使用其他 VCS 的代码库,但是已经决定开始使用 Git,必须通过某种方式将项目迁移至 Git,那该怎么办呢? Git 有一些通用系统的导入器,也可以开发自己定制的导入 ...

  7. 9.1 Git 与其他系统 - 作为客户端的 Git

    现实并不总是尽如人意. 通常,你不能立刻就把接触到的每一个项目都切换到 Git. 有时候你被困在使用其他 VCS 的项目中,却希望使用 Git. 在本章的第一部分我们将会了解到,怎样在你的那些托管在不 ...

  8. 《走进git时代系列一》 你该怎么玩?

    首先,这篇分享不是git命令操作大全,不是某代码托管服务的硬广, 只是希望激发仍然在使用中世纪时期版本管理系统的同学们,能够放弃你手里的SVN,转向更先进的思路. 所以,大家不会看到非常多的Comma ...

  9. 本地git存储库关闭_Git 入门:术语基础 | Linux 中国

    想学习 Git?看看这个最重要的术语和命令的快速总结. • 来源:linux.cn • 作者:Matthew Broberg • 译者:Xingyu.Wang • (本文字数:4793,阅读时长大约: ...

最新文章

  1. CRichEdit小记
  2. String构造方法和字符集编码转换
  3. 分离圆环图显示百分比_Tableau制作圆环图
  4. cocos2d-基本概念(4)-CallFunc Action
  5. net 自定义表单的设计
  6. sublime text插件与快捷键
  7. (转)MapReduce二次排序
  8. 第六章 线性回归 学习笔记下
  9. zendstudio php6.5,ZendStudio13.6配置composer.phar和中文镜像、如何更新php项目依赖组件方法...
  10. diskgenius创建efi分区_无损分区大小调整
  11. 计算机系统结构安全检测,计算机软件安全检测法综述
  12. 高德地图-2D转换为3D
  13. 如何让Word中某一页横放
  14. 数字通信调制方式的误码率matlab仿真,包括OOK,PRK,FSK以及QAM
  15. fineReport10连接达梦数据库
  16. CSGO地图制作常见问题
  17. 手机实名认证接口有哪些类别?
  18. 流计算 Oceanus | Flink JVM 内存超限的分析方法总结
  19. 都是博士生的西湖大学第三期新招195位学生
  20. 六、Spring Boot整合Shiro

热门文章

  1. HLS第十七课(pragma, array, data,)
  2. 蓝牙耳机性价比排行,2021最值得入手的蓝牙耳机推荐
  3. Ubuntu2004下连接双屏拓展屏幕方法[Nvidia]
  4. Hive中 Oder by 、sort by、distribute by 和 cluster by
  5. 【win11】Y9000P 2022款 升级22H2
  6. PHP安全 [环境变量]
  7. ubuntu 分辨率只有800x600解决办法
  8. 计算机概念总结5-阿里云的了解2-slb
  9. 机器学习分类算法常用评价指标
  10. 安卓键盘顶起底部菜单问题