git

自由開源的版本控制軟體

git/ɡɪt/[3]音频)是一个分布式版本控制软件,最初由林纳斯·托瓦兹创作,于2005年以GPL许可协议发布。最初目的是为了更好地管理Linux内核开发而设计。应注意的是,这与GNU Interactive Tools[4](一个类似Norton Commander英语Norton Commander界面的文件管理器)不同。

git
执行了建立仓库、新增文件以及远程同步的命令行工作阶段。
执行了建立仓库、新增文件以及远程同步的命令行工作阶段。
原作者林纳斯·托瓦兹
开发者滨野纯林纳斯·托瓦兹
首次发布2005年4月7日,​19年前​(2005-04-07
当前版本
  • 2.47.0(2024年10月7日;稳定版本)[1]
编辑维基数据链接
原始码库 编辑维基数据链接
编程语言CPerlshTcl
操作系统POSIX, Windows
类型版本控制
许可协议GNU通用公共许可证 第二版,GNU宽通用公共许可证 2.1版[2]
网站git-scm.com 编辑维基数据

git最初的开发动力来自于BitKeeperMonotone[5][6]。git最初只是作为一个可以被其他前端(比如Cogito或Stgit[7])包装的后端而开发的,但后来git内核已经成熟到可以独立地用作版本控制[8]。很多被广泛使用的软件项目都使用 git 进行版本控制[9],其中包括 Linux 内核、X.Org伺服器OLPC内核等项目的开发流程[10]

历史

编辑

自2002年开始,林纳斯·托瓦兹(Linus Torvalds)决定使用BitKeeper作为Linux内核主要的版本控制系统用以维护代码。因为BitKeeper为专有软件,这个决定在社群中长期遭受质疑。在Linux社群中,特别是理查德·斯托曼自由软件基金会的成员,主张应该使用开放原始码的软件来作为Linux内核的版本控制系统。林纳斯·托瓦兹曾考虑过采用现成软件作为版本控制系统(例如Monotone),但这些软件都存在一些问题,特别是性能不佳。现成的方案,如CVS的架构,受到林纳斯·托瓦兹的批评[11]

2005年,安德鲁·垂鸠(Andrew Tridgell)写了一个简单程序,可以连接BitKeeper的仓库,BitKeeper著作权拥有者拉里·麦沃伊认为安德鲁·垂鸠对BitKeeper内部使用的协议进行逆向工程,决定收回无偿使用BitKeeper的许可。Linux内核开发团队与BitMover公司进行磋商,但无法解决他们之间的歧见。林纳斯·托瓦兹决定自行开发版本控制系统替代BitKeeper,以十天的时间编写出git第一个版本[12][13]

命名

编辑

林纳斯·托瓦兹讽刺地嘲笑git这个名字(在英式英语俚语中表示“不愉快的人”)[14][15][16]

原始码的自述文件进一步阐述了:[17]

The name "git" was given by Linus Torvalds when he wrote the very first version. He described the tool as "the stupid content tracker" and the name as (depending on your way):

  • random three-letter combination that is pronounceable, and not actually used by any common UNIX command. The fact that it is a mispronunciation of "get" may or may not be relevant.
  • "global information tracker": you're in a good mood, and it actually works for you. Angels sing, and a light suddenly fills the room.
  • stupid. contemptible and despicable. simple. Take your pick from the dictionary of slang.

林纳斯·托瓦兹在编写第一个版本时就使用了“git”这个名称。 他将工具描述为“愚蠢的内容跟踪器”,并将其描述为(取决于您的方式):

  • 可以发音念出的随机三个字母组合,而且并未被实际用在任何 UNIX 指令上。它是“get”的错误发音,这点可能相关也可能无关。
  • “全球资讯跟踪器”:您的心情不错,对你而言它也确实说得通。天使唱歌,房间突然充满光明。
  • 愚蠢的。鄙视和卑鄙的。简单。从俚语字典中选择。

版本

编辑
版本 最初发布日期 最新修订版本 最新修订版本发布日期
旧版本,不再支持: 0.99 2005-07-11 0.99.9n 2005-12-15
旧版本,不再支持: 1.0 2005-12-21 1.0.13 2006-01-27
旧版本,不再支持: 1.1 2006-01-08 1.1.6 2006-01-30
旧版本,不再支持: 1.2 2006-02-12 1.2.6 2006-04-08
旧版本,不再支持: 1.3 2006-04-18 1.3.3 2006-05-16
旧版本,不再支持: 1.4 2006-06-10 1.4.4.5 2008-07-16
旧版本,不再支持: 1.5 2007-02-14 1.5.6.6 2008-12-17
旧版本,不再支持: 1.6 2008-08-17 1.6.6.3 2010-12-15
旧版本,不再支持: 1.7 2010-02-13 1.7.12.4 2012-10-17
旧版本,不再支持: 1.8 2012-10-21 1.8.5.6 2014-12-17
旧版本,不再支持: 1.9 2014-02-14 1.9.5 2014-12-17
旧版本,不再支持: 2.0 2014-05-28 2.0.5 2014-12-17
旧版本,不再支持: 2.1 2014-08-16 2.1.4 2014-12-17
旧版本,不再支持: 2.2 2014-11-26 2.2.3 2015-09-04
旧版本,不再支持: 2.3 2015-02-05 2.3.10 2015-09-29
旧版本,不再支持: 2.4 2015-04-30 2.4.12 2017-05-05
旧版本,不再支持: 2.5 2015-07-27 2.5.6 2017-05-05
旧版本,不再支持: 2.6 2015-09-28 2.6.7 2017-05-05
旧版本,不再支持: 2.7 2015-10-04 2.7.6 2017-07-30
旧版本,不再支持: 2.8 2016-03-28 2.8.6 2017-07-30
旧版本,不再支持: 2.9 2016-06-13 2.9.5 2017-07-30
旧版本,不再支持: 2.10 2016-09-02 2.10.5 2017-09-22
旧版本,不再支持: 2.11 2016-11-29 2.11.4 2017-09-22
旧版本,不再支持: 2.12 2017-02-24 2.12.5 2017-09-22
旧版本,不再支持: 2.13 2017-05-10 2.13.7 2018-05-22
旧版本,不再支持: 2.14 2017-08-04 2.14.5 2018-09-27
旧版本,不再支持: 2.15 2017-10-30 2.15.3 2018-09-27
旧版本,不再支持: 2.16 2018-01-17 2.16.5 2018-09-27
旧版本,仍被支持: 2.17 2018-04-02 2.17.5 2018-04-19
旧版本,仍被支持: 2.18 2018-06-21 2.18.4 2020-04-19
旧版本,仍被支持: 2.19 2018-09-10 2.19.5 2020-04-19
旧版本,仍被支持: 2.20 2018-12-09 2.20.4 2020-04-19
旧版本,仍被支持: 2.21 2019-02-24 2.21.3 2020-04-19
旧版本,仍被支持: 2.22 2019-06-07 2.22.4 2020-04-19
旧版本,仍被支持: 2.23 2019-08-16 2.23.3 2020-04-19
旧版本,仍被支持: 2.24 2019-11-04 2.24.3 2020-04-19
旧版本,仍被支持: 2.25 2020-01-13 2.25.4 2020-04-19
旧版本,仍被支持: 2.26 2020-03-23 2.26.2 2020-04-19
旧版本,仍被支持: 2.27 2020-06-01 2.27.0 2020-06-01
旧版本,仍被支持: 2.28 2020-07-27 2.28.0 2020-07-27
旧版本,仍被支持: 2.29 2020-10-19 2.29.2 2020-10-29
旧版本,仍被支持: 2.30 2020-12-27 2.30.0 2020-12-27
旧版本,仍被支持: 2.31 2021-03-15 2.31.1 2021-04-02
旧版本,仍被支持: 2.32 2021-06-06 2.32.0 2021-06-06
旧版本,仍被支持: 2.33 2021-08-16 2.33.2 2022-03-23
旧版本,仍被支持: 2.35 2022-01-24 2.35.0 2022-01-24
旧版本,仍被支持: 2.36 2022-04-18 2.36.0 2022-04-18
旧版本,仍被支持: 2.37 2022-06-27 2.37.0 2022-06-27
旧版本,仍被支持: 2.38 2022-10-02 2.38.2 2022-12-11
旧版本,仍被支持: 2.39 2022-12-12 2.39.0 2022-12-12
旧版本,仍被支持: 2.40 2023-03-12 2.40.0 2023-03-12
旧版本,仍被支持: 2.41 2023-06-01 2.41.0 2023-06-01
旧版本,仍被支持: 2.42 2023-08-21 2.42.1 2023-11-02
旧版本,仍被支持: 2.43 2023-01-20 2.43.2 2024-02-13
旧版本,仍被支持: 2.44 2024-02-23 2.44.0 2024-02-23
当前版本: 2.45 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来管理项目开发,例如:wineU-boot英语U-boot[18]

作为开源自由原教旨主义项目,git没有对版本库的浏览和修改做任何的权限限制,通过其他工具也可以达到有限的权限控制,比如:gitosis、CodeBeamer MR。原本git的使用范围只适用于Linux/Unix平台,但在Windows平台下的使用也日渐成熟,这主要归功于Cygwinmsysgit环境,以及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。

库目录

编辑
  • hooks:存储钩子的文件夾
  • logs:存储日志的文件夾
  • refs:存储指向各个分支的指针(SHA-1标识)文件
  • objects:存放git对象
  • config:存放各种設置文檔
  • HEAD:指向当前所在分支的指针文件路径,一般指向refs下的某文件

数据结构

编辑
 
Git中的数据流与存储级别

git有两种数据结构:可变的索引(index、stage或cache)用于缓冲工作目录资讯与下一次提交的版本资讯;不变的、仅追加的对象数据库。

对象数据库包含4类对象:

  • blob (二进制大对象)是使用zlib压缩算法对一个文件的内容压缩后的结果。Blobs没有保存文件名、时间戳或其他元数据。git将其存储在位于隐藏的.git/objects文件夹中。文件的名称为使用SHA-1哈希函数对原文件内容生成的哈希值。这些对象文件称为Blob,每次将新文件添加到存储库时会创建Blob对象。
  • tree对象对应于文件目录。包含文件名列表以及文件的类型位元(包含许可权[需要解释此处权限具体指涉的是什么概念])、到blob(对应于文件)或tree对象的引用。tree对象是源树(source tree)的快照。用默克尔树实现。
  • 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命名空间等[19]
  • tags

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

移植性

编辑

Windows平台上有msysgit与TortoiseGit可资利用。TortoiseGit还提供有GUI

git也提供Windows版本下载。

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

GIT GUI客户端

编辑

使用

编辑

使用git的项目

编辑

有不少的项目目前都使用git:[24]

支持git的原始码存取服务

编辑

以下是部分知名的支持git的原始码存取服务:

参见

编辑

参考文献

编辑
  1. ^ 滨野纯. [ANNOUNCE] Git v2.47.0. 2024年10月7日 [2024年10月8日]. 
  2. ^ git's LGPL license at github.com. github.com. 2011-05-20 [2014-10-12]. (原始内容存档于2016-04-11). 
  3. ^ git - Definition and pronunciation. Oxford Learner's Dictionaries. [2014-04-04]. (原始内容存档于2019-06-13). 
  4. ^ 存档副本. [2013-01-11]. (原始内容存档于2021-01-30). 
  5. ^ Linus Torvalds. Re: [ANNOUNCE] git wiki. linux-kernel (邮件列表). 2006-05-05 [2008-03-27]. (原始内容存档于2016-04-11).  "Some historical background" on git's predecessors
  6. ^ Linus Torvalds. Re: Kernel SCM saga. linux-kernel (邮件列表). 2005-04-07 [2008-03-27]. (原始内容存档于2020-10-01). 
  7. ^ Linus Torvalds. Re: Kernel SCM saga. linux-kernel (邮件列表). 2005-04-08 [2008-02-20]. (原始内容存档于2016-04-11). 
  8. ^ Linus Torvalds. Re: Errors gittifying GCC and Binutils. git (邮件列表). 2006-03-23 [2008-03-27]. (原始内容存档于2016-04-11). 
  9. ^ Projects that use git for their source code management. [2008-02-20]. (原始内容存档于2009-04-30). 
  10. ^ 10.0 10.1 OLPC wiki. Project hosting. [2008-02-20]. (原始内容存档于2009-02-02). 
  11. ^ LinusTalk200705Transcript. [2016-05-09]. (原始内容存档于2011-07-25). 
  12. ^ Linux-Kernel Archive: Kernel SCM saga. [2014-09-13]. (原始内容存档于2012-06-30). 
  13. ^ 王立恒. Git十歲了!Git之父Linus Torvalds說古,大談Git開發秘辛. iThome. 2015-04-10 [2016-05-10]. (原始内容存档于2019-06-16). 
  14. ^ GitFaq: Why the 'Git' name?. Git.or.cz. [2012-07-14]. (原始内容存档于2012-07-23). 
  15. ^ After controversy, Torvalds begins work on 'git'. PC World. 2012-07-14 [2020-02-18]. (原始内容存档于2011-02-01). 
  16. ^ git(1) Manual Page. [2012-07-21]. (原始内容存档于2012-06-21). 
  17. ^ Initial revision of 'git', the information manager from hell · git/git@e83c516. GitHub. [2016-01-21]. (原始内容存档于2017-10-08). 
  18. ^ 存档副本. [2009-04-02]. (原始内容存档于2008-10-07). 
  19. ^ Gerrit Code Review – Project Configuration File Format. [2017-05-22]. (原始内容存档于2020-12-03). 
  20. ^ GitHub Desktop. [2017-05-24]. (原始内容存档于2021-02-04). 
  21. ^ Using GitHub for Windows with non-GitHub repositories. [2017-05-24]. (原始内容存档于2020-10-22). 
  22. ^ Git for Windows. [2017-05-24]. (原始内容存档于2021-01-18). 
  23. ^ GitEye. [2017-05-24]. (原始内容存档于2014-11-19). 
  24. ^ Projects that use git for their source code management. [2008-02-20]. (原始内容存档于2020-10-21). 
  25. ^ Getting Started/Sources/Amarok git Tutorial - KDE TechBase. [2010-04-27]. (原始内容存档于2020-08-09). 
  26. ^ Using Repo and git (Android Open Source Project). [2010-04-27]. (原始内容存档于2010-01-09). 
  27. ^ BlueZ » git access. [2010-04-27]. (原始内容存档于2020-10-24). 
  28. ^ Btrfs source repositories - btrfs Wiki. Btrfs.wiki.kernel.org. [2009-06-15]. (原始内容存档于2020-06-02). 
  29. ^ git.debian.org git. [2021-02-06]. (原始内容存档于2021-01-15). 
  30. ^ digg.git - part 1 | Digg About. [2010-04-27]. (原始内容存档于2010-02-11). 
  31. ^ TypicalgitUsage - dragonflywiki[永久失效链接]
  32. ^ 存档副本. [2011-03-07]. (原始内容存档于2019-10-16). 
  33. ^ Download. [2010-04-27]. (原始内容存档于2020-10-28). 
  34. ^ Get FFmpeg. Ffmpeg.org. [2009-06-15]. (原始内容存档于2013-09-15). 
  35. ^ git - Fast Version Control System. [2010-04-24]. (原始内容存档于2009-01-01). 
  36. ^ Lucas Rocha. Mailing List Announcement. [2009-03-19]. (原始内容存档于2020-10-27). GNOME to migrate to git version control system... 
  37. ^ git - GNOME Live!. [2015-10-10]. (原始内容存档于2012-04-10). 
  38. ^ gstreamer Wiki - gitDeveloperGuidelines. [2015-10-10]. (原始内容存档于2013-02-06). 
  39. ^ gthumb - GNOME Live!. [2010-04-27]. (原始内容存档于2013-05-24). 
  40. ^ GTK+ - Download. [2010-04-27]. (原始内容存档于2010-07-03). 
  41. ^ source repositories. [2010-04-27]. (原始内容存档于2020-10-24). 
  42. ^ Downloading jQuery - jQuery JavaScript Library. [2010-04-27]. (原始内容存档于2012-09-19). 
  43. ^ CCHIT's laika at master - gitHub. [2010-04-27]. (原始内容存档于2010-04-20). 
  44. ^ LilyPond, music notation for everyone. [2019-10-16]. (原始内容存档于2018-12-11). 
  45. ^ The Linux Mint Blog » Blog Archive » Mint to use Launchpad for translations, bugs, blueprints and github for code hosting and version control. [2010-04-27]. (原始内容存档于2010-02-08). 
  46. ^ LMMS - Linux MultiMedia Studio. [2021-02-06]. (原始内容存档于2014-04-18). 
  47. ^ Maemo - gitorious. [2010-04-27]. (原始内容存档于2009-10-08). 
  48. ^ MeeGo - gitorious. [2010-04-27]. (原始内容存档于2011-01-29). 
  49. ^ Ruby on Rails: Merb. [2010-04-27]. (原始内容存档于2010-04-30). 
  50. ^ MooTools - a compact javascript framework. [2010-04-27]. (原始内容存档于2021-02-05). 
  51. ^ openSUSE - gitorious. [2010-04-27]. (原始内容存档于2010-05-27) (英语). 
  52. ^ Léon Brocard. Mailing List Announcement. [2008-12-22]. (原始内容存档于2011-08-10). The Perl Foundation has migrated Perl 5 to the git version control system... 
  53. ^ PHP. PHP migrates to git. PHP Group. 2012-03-20 [2012-03-20]. (原始内容存档于2021-02-04). 
  54. ^ phpBB. phpBB moves source code versioning from Subversion to git. phpBB Group. 2010-03-07 [2010-03-07]. (原始内容存档于2010-09-24). 
  55. ^ Prototype JavaScript framework: Contribute. [2010-04-27]. (原始内容存档于2020-10-24). 
  56. ^ Qt now open for community contributions. 2009-05-11 [2009-06-22]. (原始内容存档于2009-05-14). 
  57. ^ Reddit Goes Open Source. [2010-02-26]. (原始内容存档于2011-12-22). 
  58. ^ "Rails is moving from SVN to git". [2008-04-03]. (原始内容存档于2009-02-24). 
  59. ^ Using git for Samba Development - SambaWiki. [2015-10-10]. (原始内容存档于2015-10-15). 
  60. ^ SproutCore Documentation. [2010-04-27]. (原始内容存档于2009-07-16). 
  61. ^ Sugar Labs project hosting. [2010-04-27]. (原始内容存档于2020-11-27). 
  62. ^ Accessing SWI-Prolog source页面存档备份,存于互联网档案馆) via git页面存档备份,存于互联网档案馆
  63. ^ 63.0 63.1 git - VideoLAN Wiki. [2015-10-10]. (原始内容存档于2021-01-28). 
  64. ^ gitWine - The Official Wine Wiki. [2015-10-10]. (原始内容存档于2021-02-03). 
  65. ^ Xiph git. [2010-04-27]. (原始内容存档于2010-05-07). 
  66. ^ X.Org Wiki - Development/git. [2009-04-02]. (原始内容存档于2020-09-22). 
  67. ^ YUI 2 and YUI 3 Source Code Now on gitHub. [2009-01-20]. (原始内容存档于2009-02-12). 

外部链接

编辑