Git的学习笔记

背景

   Linux之父Linus是坚定的CVS反对者,他也两样地反对SVN。这就是为什么在1991- 2002这十余年间,Linus宁可以手工修补文件的方式维护代码,也迟迟不愿意使用CVS的原因。 我想在当时要想对说Linus使用CVS只有一个办法:把CVS服务器请进Linus的卧室, 并对外配以千兆带宽。

   2002年到2005年,Linus顶着开源社区精英们口诛笔伐的压力,选择了一个商业版本控制系统BitKeeper 作为Linux内核的代码管理工具。BitKeper不同于CVS和SVN等集中式版本控制工具, 而是一款分布式版本控制系统工具。

   分布式版本控制系统最大的反传统之处在于,可以不需要集中式的版本库, 每个人都工作在通过克隆建立在本地版本库中。也就是说每个人都拥有一个完整的版本库, 查看日志、提交、创建里程碑和分支、合并分支、回退等所有操作都直接在本地完成而不需要网络连接。 每个人都是本地版本库的主人,不再有谁能提交谁不能提交的限制, 加上多样的协同工作模型(版本库间推送、拉回、以及补丁文件的传送等)让开源项目的参与度有爆发式增长。

   2005年发生的一件事最终导致了Git的诞生。在2005年4月,Andrew Tridgell(即大名鼎鼎的Samba的作者) 试图对BitKeeper进行反向工程,以开发一个能与BigKeeper交互的开源工具。 这激怒了BitKeeper软件的所有者BitMover公司,要求收回对Linux社区免费使用BitKeeper的授权。迫不得已, Linus选择了自己开发一个分布式版本控制工具以替代BitKeeper。以是Git诞生过程中的大事记:

   Linus以一个文件系统专家和内核设计者的视角对Git进行了设计, 其独特的设计让Git拥有非凡的性能和最为优化的存储能力。完成原型设计后,在2005年7月26日, Linus功成身退,将Git的维护交给另外一个Git的主要贡献者Junio C Hamano,直到现在。

   最初的Git除了一些核心的命令以外,其他的都用脚本语言开发,而且每个功能作为一个独立的命令, 例如克隆操作用git-clone,提交操作用git-commit。这导致Git拥有庞大的命令集, 使用习惯也和其他版本控制系统格格不入。随着Git的开发者和使用者的增加,Git也在逐渐演变, 例如到1.5.4版本时,将一百多个独立的命令封装为一个git命令,使它看起来更像一个独立的工具, 也使Git更贴近于普通用户的使用习惯。

   经过短短几年的发展,众多的开源项目都纷纷从SVN或其他版本控制系统迁移到Git。 虽然版本控制系统的迁移过程是痛苦的,但是因为迁移到Git会带来开发效率的极大提升, 以及巨大的效益,所以很快就会忘记迁移的痛苦过程,而且很快就会适应新的工作模式。 在Git的官方网站上列出了几个使用Git的重量级项目,每一个都是人们耳熟能详的, 除了Git和Linux内核外,还有Perl,Eclipse、Gnome、KDE、Qt、Ruby on Rails、Android、 PostgreSQL、Debian、Z.org,当然还有GigHub的上百万个项目。

   Git虽然是在Linux下开发的,但现在已经可以跨平台运行在所有主流的操作系统上, 包括Linux、Mac OS X和Windows等。可以说每一个使用计算机的用户都可以分享Git带来的便利和快乐。

git配置

克隆

保存工作进度

更新

清理

里程碑

检出

重置

修改上一次提交

查看差异

原理探索

   .git/index文件是用来跟踪工作区文件的,文件.git/index实际上就是一个包含文件索引的目录树,像是一个虚拟的工作区。 在这个虚拟工作区的目录树中,记录了文件名和文件状态信息(时间戳和文件长度等)。 文件内容并没有存储在其中,而是保存在Git的对象库.git/Object目录中, 文件索引建立了文件和对象库中对象实体之间的对应。