Git 是开源分布式版本控制系统。它旨在以高速度和效率处理次要项目。开发它是为了协调开发人员之间的工作。版本控制使我们能够在同一工作区中跟踪团队成员并与之一起工作。 Git是许多服务的基础,例如 GitHub 和 GitLab ,但是我们可以使用Git而不使用任何其他Git服务。 Git可以私有和公开使用。
开始阅读主要功能
git是用于Linux内核开发的版本控制工具。与CVS、Subversion一类的集中式版本控制工具不同,它采用了分布式版本库的作法,不需要服务器端软件,就可以运作版本控制,使得源代码的发布和交流极其方便。git的速度很快,这对于诸如Linux内核这样的大项目来说自然很重要。git最为出色的是它的合并追踪(merge tracing)能力。
实际上Linux内核开发团队决定开始开发和使用git来作为内核开发的版本控制系统的时候,世界上开源社群的反对声音不少,最大的理由是git太艰涩难懂,从git的内部工作机制来说,的确是这样。但是随着开发的深入,git的正常使用都由一些友善的命令来执行,使git变得非常好用。现在,越来越多的著名项目采用git来管理项目开发,例如:wine、U-boot等[18]。
作为开源自由原教旨主义项目,git没有对版本库的浏览和修改做任何的权限限制,通过其他工具也可以达到有限的权限控制,比如:gitosis、CodeBeamer MR。原本git的使用范围只适用于Linux/Unix平台,但在Windows平台下的使用也日渐成熟,这主要归功于Cygwin、msysgit环境,以及TortoiseGit这样易用的GUI工具。git的源代码中也已经加入了对Cygwin与MinGW编译环境的支持且逐渐完善,为Windows用户带来福音。
实现原理
git和其他版本控制系统(如CVS)有不小的差别,git本身关心文件的整体性是否有改变,但多数的版本控制系统如CVS或Subversion系统则在乎文件内容的差异。git拒绝保持每个文件的版本修订关系。因此查看一个文件的历史需要遍历各个history快照;git隐式处理文件更名,即同名文件默认为其前身,如果没有同名文件则在前一个版本中搜索具有类似内容的文件。
git更像一个文件系统,直接在本地上获取资料,不必连线到主机端获取资料。 每个开发者都可有全部开发历史的本地副本,changes从这种本地repository复制给其他开发者。这些changes作为新增的开发分支被导入,可以与本地开发分支合并。
分支是非常轻量级的,一个分支仅是对一个commit的引用。
git是用C语言开发的,以追求最高的性能。git自动完成垃圾回收,也可以用命令git gc --prune
直接调用。
git存储每个新创建的object作为一个单独文件。为了压缩存储空间占用, packs操作把很多文件(启发式类似名字的文件往往具有类似内容)使用差分压缩入一个文件中(packfile),并创建一个对应的索引文件,指明object在packfile中的偏移值。新创建的对象仍然作为单独文件存在。repacks操作非常费时间,git会在空闲时间自动做此操作。也可用命令git gc
来直接启动repack。packfile与索引文件都用SHA-1作为校验和并作为文件名。git fsck
命令做校验和的完整性验证。
Git服务器典型的TCP监听端口为9418。
数据结构
Git有两种数据结构:可变的索引(index、stage或cache)用于缓冲工作目录信息与下一次提交的版本信息;不变的、仅追加的对象数据库。
对象数据库包含4类对象:
以上4类的对象用其内容的SHA-1 hash值标识:hash值的前两个字符作为存放的目录名字,其余hash字符作为这个对象的文件名。
Git数据库中不变引用的对象将会被垃圾回收清除。Git命令可以创建、移动、删除引用。"git show-ref"列出所有引用。某些引用类型:
目录