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.1(2024年11月25日;穩定版本)[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:儲存hook的資料夾
  • 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.1. 2024年11月25日 [2024年11月25日]. 
  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). 

外部連結

編輯