git初学者必须熟记的三个概念

原文链接:http://www.zixiong.org/blog/2015/11/01/3things-git-beginners-better-remember.html

熟练使用git的人大多对git带来的效率提升赞不绝口,而初学者往往被git很多“复杂”的概念弄得晕头转向。我认为git有很多优美的设计,你理解了这些设计的思想和基本的工作原理,用起来才会知其所以然,得心应手。

commit图的概念

git存放数据的核心是一个有向无环图,每次commit或者merge都会形成一个新的节点,指向它的父节点或者父节点们(merge时)。

git初学者必须熟记的三个概念_第1张图片
commit图

每个节点存放的是commit前所有文件和目录结构的快照,并根据快照计算出一个独一无二的hash值来标识这个快照。这个图的数据只会增加不会减少,也就是说,对于新手来说,怎么玩git都不会导致数据丢失,你总有办法恢复到原来的样子。
把这个 commit图结构挂念在心里,并结合下一点服用,才不会被各种分支啊合并啊reset啊弄得晕头转向。

引用的概念

你见的最多的本地分支、远程分支、tag、HEAD等等,其实本质上都是对上面那个commit图的节点的引用。你可以理解为贴了一张便条。比如我在master上新建了一个分支develop.

git branch develop

git初学者必须熟记的三个概念_第2张图片
引用图

你并没有真的copy了一份代码到新的分支里,你只是给这个commit图又多贴了一个叫做develop分支的便条。
git初学者必须熟记的三个概念_第3张图片
分支图

当你在两个分支上又添加了新的内容时,这些便条也会随着往前往后移动。
git初学者必须熟记的三个概念_第4张图片
总览图

同理,tag也是标记某一个特定版本的便条。
常见的 origin/master也是一种不同的便条,它表示你上次与服务器同步master分支时的位置,origin表示它来至于不同的 命名空间
HEAD是一种比较特殊的便条,它指向某一个便条,表示当前工作的节点,当然你也可以把它指向一个节点,比如执行 git checkout 56ca4它就指向了根节点.
这些引用可以随意的移动,怎么玩也不会出事,因为你并没有改变 commit图

分布式的概念

git区别于svn的最大的特点就是它是分布式的版本控制系统,每个仓库都可以是服务器,每个仓库也可以是客户端。服务器和客户端拥有相同的内容(那个.git文件夹)。你可以把你的代码push到同事李雷的电脑上去,然后从同事李蕾蕾的电脑上pull代码。前提是都是同一个git仓库(有相同的根节点),不管你从哪儿pull代码,git都会执行同样的合并策略,git并不知道有服务器这种角色存在。

但在实际操作中往往会有一个或多个git服务器,比如github,这是为了获得集中管理的好处。但必须明白的是git服务器的角色是虚拟出来的,不是绝对的,它在本质上和客户端的仓库没有区别。(实际上有一点点区别,服务器上的仓库没有工作区)。你可以随时跟换你的服务器。

这种分布式的设计带来了很多好处:

  • 离线提交:执行一次commit,只是给commit图增加了一个节点,不需要与服务器通信。也就是说你在出差的火车上也可以和平常一样的写代码。
  • 离线回滚:同样的,回退版本也不需要联网。因为服务器有的,你都有。
  • 精细的版本控制:我习惯于每完成一个小功能就commit一次,追踪自己的开发过程。而据说很多用svn的人,只是把svn当做同步代码的工具使用,这样就失去了版本控制的意义。
  • 简单便捷:开启一个项目,只需要执行git init就行了,而不需要建一个svn服务器。

最后

git是个小而美的工具,也是像github这样的开源社区能够发展壮大的原因之一。我前期在使用git的过程中经常感觉复杂、摸不着头脑,但在比较深入的理解了以上几个概念之后,才觉得开始上路了,对很多命令以及背后的原理都有一种恍然大悟的感觉。git在设计上很多哲学都是值得深入研究和体会的,linus torvalds不愧为大神。

几个git学习资料:

  1. interactive教学版 看完这个基本能上手了
  2. git团队协作 团队协作进阶
  3. 实用git工作流 继续进阶

你可能感兴趣的:(git初学者必须熟记的三个概念)