Git

git（，）是一个分散式版本控制软件，最初由林纳斯·托瓦兹創作，於2005年以GPL授權條款釋出。最初目的是为了更好地管理Linux核心开发而设计。应注意的是，这与GNU Interactive Tools（一个类似界面的文件管理器）不同。

git最初的开发动力来自于BitKeeper和Monotone "Some historical background" on git's predecessors。git最初只是作为一个可以被其他前端（比如Cogito或Stgit）包装的后端而开发的，但后来git内核已经成熟到可以独立地用作版本控制。很多被廣泛使用的軟體專案都使用 git 进行版本控制，其中包括 Linux 核心、X.Org服务器和OLPC内核等项目的开发流程。

 歷史 
自2002年開始，林纳斯·托瓦兹（Linus Torvalds）決定使用BitKeeper作為Linux內核主要的版本控制系統用以维护程式碼。因為BitKeeper為专有软件，這個決定在社群中長期遭受質疑。在Linux社群中，特別是理查德·斯托曼與自由軟體基金會的成員，主張應該使用開放原始碼的軟體來作為Linux核心的版本控制系統。林纳斯·托瓦兹曾考慮過採用現成軟體作为版本控制系統（例如Monotone），但這些軟體都存在一些問題，特別是效能不佳。現成的方案，如CVS的架構，受到林纳斯·托瓦兹的批評。

2005年，安德魯·垂鳩（Andrew Tridgell）寫了一個簡單程式，可以連接BitKeeper的儲存庫，BitKeeper著作權擁有者拉里·麥沃伊認為安德魯·垂鳩对BitKeeper內部使用的协议进行逆向工程，決定收回无偿使用BitKeeper的授權。Linux內核開發團隊與BitMover公司進行磋商，但無法解決他們之間的歧見。林纳斯·托瓦兹決定自行開發版本控制系統替代BitKeeper，以十天的時間編寫出git第一個版本。

 命名 
林纳斯·托瓦兹諷刺地嘲笑git這個名字（在英式英語俚語中表示「不愉快的人」）

源代碼的自述文件進一步闡述了：

版本

 版本 最初发布日期   最新修订版本 最新修订版本发布日期    2005-07-11 0.99.9n 2005-12-15  2005-12-21 1.0.13 2006-01-27  2006-01-08 1.1.6 2006-01-30  2006-02-12 1.2.6 2006-04-08  2006-04-18 1.3.3 2006-05-16  2006-06-10 1.4.4.5 2008-07-16  2007-02-14 1.5.6.6 2008-12-17  2008-08-17 1.6.6.3 2010-12-15  2010-02-13 1.7.12.4 2012-10-17  2012-10-21 1.8.5.6 2014-12-17  2014-02-14 1.9.5 2014-12-17  2014-05-28 2.0.5 2014-12-17  2014-08-16 2.1.4 2014-12-17  2014-11-26 2.2.3 2015-09-04  2015-02-05 2.3.10 2015-09-29  2015-04-30 2.4.12 2017-05-05  2015-07-27 2.5.6 2017-05-05  2015-09-28 2.6.7 2017-05-05  2015-10-04 2.7.6 2017-07-30  2016-03-28 2.8.6 2017-07-30  2016-06-13 2.9.5 2017-07-30  2016-09-02 2.10.5 2017-09-22  2016-11-29 2.11.4 2017-09-22  2017-02-24 2.12.5 2017-09-22  2017-05-10 2.13.7 2018-05-22  2017-08-04 2.14.5 2018-09-27  2017-10-30 2.15.3 2018-09-27  2018-01-17 2.16.5 2018-09-27  2018-04-02 2.17.5 2018-04-19  2018-06-21 2.18.4 2020-04-19  2018-09-10 2.19.5 2020-04-19  2018-12-09 2.20.4 2020-04-19  2019-02-24 2.21.3 2020-04-19  2019-06-07 2.22.4 2020-04-19  2019-08-16 2.23.3 2020-04-19  2019-11-04 2.24.3 2020-04-19  2020-01-13 2.25.4 2020-04-19  2020-03-23 2.26.2 2020-04-19  2020-06-01 2.27.0 2020-06-01  2020-07-27 2.28.0 2020-07-27  2020-10-19 2.29.2 2020-10-29  2020-12-27 2.30.0 2020-12-27  2021-03-15 2.31.1 2021-04-02  2021-06-06 2.32.0 2021-06-06  2021-08-16 2.33.2 2022-03-23  2022-01-24 2.35.0 2022-01-24  2022-04-18 2.36.0 2022-04-18  2022-06-27 2.37.0 2022-06-27  2022-10-02 2.38.2 2022-12-11  2022-12-12 2.39.0 2022-12-12  2023-03-12 2.40.0 2023-03-12  2023-06-01 2.41.0 2023-06-01  2023-08-21 2.42.1 2023-11-02  2023-01-20 2.43.2 2024-02-13  2024-02-23 2.44.0 2024-02-23  2024-04-29 2.45.0 2024-04-29 

 主要功能 
git是用于Linux内核开发的版本控制工具。与CVS、Subversion一類的集中式版本控制工具不同，它采用了分布式版本库的作法，不需要服务器端软件，就可以運作版本控制，使得源代码的发布和交流极其方便。git的速度很快，这对于诸如Linux内核这样的大项目来说自然很重要。git最为出色的是它的合并追踪（merge tracing）能力。

实际上Linux内核开发团队决定开始开发和使用git来作为内核开发的版本控制系统的时候，世界上开源社群的反对声音不少，最大的理由是git太艰涩难懂，从git的内部工作机制来说，的确是这样。但是随着开发的深入，git的正常使用都由一些友善的命令来执行，使git变得非常好用。现在，越来越多的著名项目采用git来管理项目开发，例如：wine、等。

作为开源自由原教旨主义项目，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。

 -{zh-cn:库;zh-tw:儲存庫}-目录 
hooks：存儲-{zh-cn:钩子;zh-tw:hook}-的文件夾
logs：存儲日誌的文件夾
refs：存儲指向各個分支的指標（SHA-1标识）文件
objects：存放git對象
config：存放各種-{zh-cn:設置文檔;zh-tw:組態檔}-
HEAD：指向當前所在分支的指標文件路徑，一般指向refs下的某文件

数据結構
git有两种数据结构：可变的索引（index、stage或cache）用于缓冲工作目录信息与下一次提交的版本信息；不变的、仅追加的对象数据库。

对象数据库包含4类对象：
blob （-{zh-cn:二进制大对象;zh-tw:二進位大型物件}-）是使用zlib压缩算法对一个文件的内容压缩后的结果。Blobs没有保存文件名、时间戳或其他元数据。git将其存储在位于隐藏的.git/objects文件夹中。文件的名称为使用SHA-1哈希函数对原文件内容生成的哈希值。这些对象文件称为Blob，每次将新文件添加到存储库时会创建Blob对象。
tree对象对应于文件目录。包含文件名列表以及文件的类型比特（包含-{zh-cn:许可权;zh-tw:許可權}-）、到blob（对应于文件）或tree对象的引用。tree对象是源树（source tree）的快照。用-{zh-cn:默克尔树;zh-tw:雜湊樹}--{zh-cn:实现;zh-tw:實作}-。
commit对象链接tree对象在一起而成为history，包含顶层源目录的tree对象名字、一个时间戳、log信息、0个或多个父commit对象的名字。用于保存特定版本的树型文件夹结构以及提交作者，电子邮件地址，日期和描述性提交消息。
tag对象是一个容器，包含了到另一个对象的引用，也可以增加关于另外对象的元数据。通常它保存需要追溯的特定版本数据的一个commit对象的数字签名。

以上4类的对象用其内容的SHA-1 hash值标识：hash值的前两个字符作为存放的目录名字，其余hash字符作为这个对象的文件名。 

git数据库中不变引用的对象将会被垃圾回收清除。git命令可以创建、移动、删除引用。"git show-ref"列出所有引用。某些引用类型：
 heads：引用一个本地对象，是commit的指针。每个head可以指任意一个这样的指针。可以包含任意数量的heads。而"HEAD"（全部大写），仅仅指的是当前有效的head。默认情况下，在每个仓库下都有一个head，叫做master。
 remotes：引用远程repository中的一个对象
 stash：引用一个还没有committed的一个对象
 meta：例如一个bare repository中的一个配置，用户权限；refs/meta/config命名空间等
 tags：

某些操作（例如，将提交推送到远程存储库，存储太多对象或手动运行git的垃圾收集命令）可能会导致git将对象重新打包为打包文件，在打包过程中，采用反向差异并进行压缩以消除多余的内容并减小尺寸。该过程将生成包含对象内容的.pack文件，每个文件都有一个对应的.idx索引文件，其中包含对打包对象及其在打包文件中位置的引用。当将分支推送到远程存储库或从远程存储库拉出分支时，这些打包文件将通过网络传输。提取或获取分支时，将打包文件解压缩以在对象存储库中创建松散对象。

 移植性 
在Windows平台上有msysgit與TortoiseGit可資利用。TortoiseGit還提供有GUI。

git也提供Windows版本下载。

Visual Studio 自 2013 版本开始内置 git 功能。

GIT GUI客户端
 GitHub Desktop：可用于第三方git仓库网站
 Git for Windows
 TortoiseGit
 SourceTree
 GitEye

使用

 使用git的專案 

有不少的專案目前都使用git：

 Amarok
 Android
 Arch Linux


 Btrfs
 Clojure

 Debian
 Digg
 DragonFly BSDTypicalgitUsage - dragonflywiki
 Drupal

 Fedora
 FFmpeg 
 Freenet
 git
 GIMP
 GNOME

 GStreamer
 gThumb
 GTK+
 Hurd
 jQuery

 LilyPond (music typesetting)
 Linux kernel
 Linux Mint
 LMMS Music Production Software 
 Maemo
 MeeGo


 One Laptop Per Child (OLPC)
 OpenFOAM
 openSUSE
 Perl
 PHP
 phpBB
 PostgreSQL
 Prototype JavaScript框架
 Qt
 Reddit
 rsync
 Ruby on Rails
 Samba

 Sugar (用戶界面)
 Accessing SWI-Prolog source  via git 
 VLC
 Wine
 Xiph
 X.org Server
 x264
 YUI

 NOJ

 支持git的源码存取服务 
以下是部分知名的支持git的源码存取服务：



 Bitbucket
 CodePlex（已於2017年12月15日起關閉）
 GitHub

 GNU Savannah
 Google Code
 JavaForge
 Pikacode
 SourceForge
 码云 Gitee 
 CSDN CODE
 Coding 
 GitLab
 GitCode 

 参见 

 分布式版本控制
 Gitee
 代码库
 仓库 (版本控制)
 GitHub
 GitLab
 Gitea

 参考文献 

 外部链接 

git官方网站
git快速入门
git Man Page
git用户手册 
git Community Book
使用git管理源代码 
git# (gitSharp) 
GNU Interactive Tools 
git从入门到精通P
連猴子都能懂的Git入門指南 

Category:自由版本控制软件
Category:分布式版本控制系统
Category:Perl软件
Category:用C編程的自由軟體
Category:2005年软件
Category:Git