本頁使用了標題或全文手工轉換

git

維基百科,自由的百科全書
前往: 導覽搜尋
git
Git-logo.svg
Gitweb.png
gitweb,git的一個Web介面。
原作者 林納斯·托瓦茲
開發者 濱野純林納斯·托瓦茲
穩定版本 2.14.1[1](2017年8月4日,​17天前​(2017-08-04
預覽版本 2.14.0-rc1[2](2017年7月24日,​28天前​(2017-07-24
程式語言 CPerlsh[3]
作業系統 POSIX, Windows
類型 版本控制
授權條款 GNU通用公眾授權條款 第二版,GNU較寬鬆公共許可證 2.1版[4]
網站 https://git-scm.com/
原始碼庫 https://github.com/git/git、git://git.kernel.org/pub/scm/git/git.git

git/ɡɪt/[5]關於這個音訊檔案 音訊)是一個分散式版本控制軟體,最初由林納斯·托瓦茲(Linus Torvalds)創作,於2005年以GPL釋出。最初目的是為更好地管理Linux內核開發而設計。應注意的是,這與GNU Interactive Tools[6](一個類似Norton Commander介面的檔案管理器)有所不同。

git最初的開發動力來自於BitKeeperMonotone[7][8]。git最初只是作為一個可以被其他前端(比如Cogito或Stgit[9])包裝的後端而開發的,但後來git內核已經成熟到可以獨立地用作版本控制[10]。很多著名的軟體都使用git進行版本控制[11],其中包括Linux內核X.Org伺服器OLPC內核等專案的開發流程[12]

命名來源[編輯]

林納斯·托瓦茲自嘲地取了這個名字「git」,該詞源自英國俚語,意思大約是「混帳」。[13][14]

git的官方wiki也給出了多種關於這個名字的解釋。[15]

歷史[編輯]

自2002年開始,林納斯·托瓦茲決定使用BitKeeper作為Linux內核主要的版本控制系統用以維護程式碼。因為BitKeeper為專有軟體,這個決定在社群中長期遭受質疑。在Linux社群中,特別是理察·斯托曼自由軟體基金會的成員,主張應該使用開放原始碼的軟體來作為Linux核心的版本控制系統。林納斯·托瓦茲曾考慮過採用現成軟體作為版本控制系統(例如Monotone),但這些軟體都存在一些問題,特別是效能不佳。現成的方案,如CVS的架構,受到林納斯·托瓦茲的批評[16]

2005年,安德魯·垂鳩寫了一個簡單程式,可以連接BitKeeper的儲存庫,BitKeeper著作權擁有者拉里·麥沃伊認為安德魯·垂鳩對BitKeeper內部使用的協定進行逆向工程,決定收回無償使用BitKeeper的授權。Linux內核開發團隊與BitMover公司進行蹉商,但無法解決他們之間的歧見。林納斯·托瓦茲決定自行開發版本控制系統替代BitKeeper,以十天的時間,編寫出第一個git版本[17][18]

版本[編輯]

版本 最初釋出日期 最新修訂版本 最新修訂版本釋出日期
舊版本,不再支援: 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.5 2017-05-05
舊版本,仍被支援: 2.8 2016-03-28 2.8.5 2017-05-05
舊版本,仍被支援: 2.9 2016-06-13 2.9.4 2017-05-05
舊版本,仍被支援: 2.10 2016-09-02 2.10.3 2017-05-05
舊版本,仍被支援: 2.11 2016-11-29 2.11.2 2017-05-05
舊版本,仍被支援: 2.12 2017-02-24 2.12.3 2017-05-05
當前版本: 2.13 2017-05-10 2.13.0 2017-05-10
格式:
舊版本
舊版本,仍被支援
目前版本
最新的預覽版
未來版本

主要功能[編輯]

git是用於Linux內核開發的版本控制工具。與CVSSubversion一類的集中式版本控制工具不同,它採用了分散式版本庫的作法,不需要伺服器端軟體,就可以運作版本控制,使得原始碼的釋出和交流極其方便。git的速度很快,這對於諸如Linux內核這樣的大專案來說自然很重要。git最為出色的是它的合併追蹤(merge tracing)能力。

實際上內核開發團隊決定開始開發和使用git來作為內核開發的版本控制系統的時候,世界上開源社群的反對聲音不少,最大的理由是git太艱澀難懂,從git的內部工作機制來說,的確是這樣。但是隨著開發的深入,git的正常使用都由一些友善的命令稿來執行,使git變得非常好用。現在,越來越多的著名專案採用git來管理專案開發,例如:wineU-boot[19]

作為開源自由原教旨主義專案,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伺服器典型的listen TCP port為9418。

庫目錄[編輯]

  • hooks:存儲鉤子的檔案夾
  • logs:存儲日誌的檔案夾
  • refs:存儲指向各個分支的指針(SHA-1標識)檔案
  • objects:存放git對象
  • config:存放各種設置文件
  • HEAD:指向當前所在分支的指針檔案路徑,一般指向refs下的某檔案

資料結構[編輯]

Git中的資料流與儲存級別

Git有兩種資料結構:可變的索引(index或stage或cache)用於緩衝工作目錄資訊與下一次提交的版本資訊;不變的、僅追加的物件資料庫。

物件資料庫包含4類物件:

  • blob (二進位大物件)是一個檔案的內容。Blobs沒有適當的檔案名、時間戳、或其他後設資料。一個blob的內部名字是它的內容的hash。
  • tree物件等效於目錄。包含檔案名列表以及檔案的類型位元、到blob或tree物件的參照。tree物件是源樹(source tree)的快照。用默克樹英語Merkle Tree實現。
  • commit物件連結tree物件在一起而成為history. 包含頂層源目錄的tree物件名字、一個時間戳、log資訊、0個或多個父commit物件的名字。
  • tag物件是一個容器,包含了到另一個物件的參照,也可以增加關於另外物件的後設資料。通常它儲存需要追溯的特定版本資料的一個commit物件的數位簽章。

每個物件用其內容的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命名空間等[20]
  • tags:

移植性[編輯]

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

現在git也提供windows版本下載。

GIT GUI用戶端[編輯]

使用[編輯]

使用git的專案[編輯]

有不少的專案目前都使用git:[22]

支援git的源碼存取服務[編輯]

以下是部分知名的支援git的源碼存取服務:

參考文獻[編輯]

  1. ^ Hamano, Junio. git v2.14.1 Release Notes. kernel. 2017-08-04 [2017-08-04]. 
  2. ^ Junio C Hamano. git v2.14.0-rc1. [2017-07-24]. 
  3. ^ http://git.kernel.org/?p=git/git.git;a=tree
  4. ^ git's LGPL license at github.com. github.com. 20 May 2011 [12 October 2014]. 
  5. ^ git - Definition and pronunciation. Oxford Learner's Dictionaries. 
  6. ^ [1]
  7. ^ Linus Torvalds. Re: [ANNOUNCE git wiki]. linux-kernel. 2006-05-05.  "Some historical background" on git's predecessors
  8. ^ Linus Torvalds. Re: Kernel SCM saga. linux-kernel. 2005-04-07. 
  9. ^ Linus Torvalds. Re: Kernel SCM saga. linux-kernel. 2005-04-08 [2008-02-20]. 
  10. ^ Linus Torvalds. Re: Errors gittifying GCC and Binutils. git. 2006-03-23. 
  11. ^ Projects that use git for their source code management. [2008-02-20]. 
  12. ^ OLPC wiki. Project hosting. [2008-02-20]. 
  13. ^ “a person, especially a man, who is stupid or unpleasant”(愚蠢或令人不爽的人,尤指男人)[2]
  14. ^ After controversy, Torvalds begins work on git. InfoWorld. 2005-04-19 [2008-02-20]. ISSN 0199-6649. 
  15. ^ gitFaq: Why the 'git' name?
  16. ^ LinusTalk200705Transcript
  17. ^ Linux-Kernel Archive: Kernel SCM saga
  18. ^ 王立恆. Git十歲了!Git之父Linus Torvalds說古,大談Git開發秘辛. iThome. 2015-04-10 [2016-05-10]. 
  19. ^ [3]
  20. ^ Gerrit Code Review – Project Configuration File Format
  21. ^ Using GitHub for Windows with non-GitHub repositories
  22. ^ Projects that use git for their source code management. [2008-02-20]. 
  23. ^ Getting Started/Sources/Amarok git Tutorial - KDE TechBase
  24. ^ Using Repo and git (Android Open Source Project)
  25. ^ BlueZ » git access
  26. ^ Btrfs source repositories - btrfs Wiki. Btrfs.wiki.kernel.org. [2009-06-15]. 
  27. ^ git.debian.org git
  28. ^ digg.git - part 1 | Digg About
  29. ^ TypicalgitUsage - dragonflywiki
  30. ^ [4]
  31. ^ Download
  32. ^ Get FFmpeg. Ffmpeg.org. [2009-06-15]. 
  33. ^ git - Fast Version Control System. [2010-04-24]. 
  34. ^ Lucas Rocha. Mailing List Announcement. [2009-03-19]. GNOME to migrate to git version control system... 
  35. ^ git - GNOME Live!
  36. ^ gstreamer Wiki - gitDeveloperGuidelines
  37. ^ gthumb - GNOME Live!
  38. ^ GTK+ - Download
  39. ^ source repositories
  40. ^ Downloading jQuery - jQuery JavaScript Library
  41. ^ CCHIT's laika at master - gitHub
  42. ^ LilyPond, music notation for everyone
  43. ^ The Linux Mint Blog » Blog Archive » Mint to use Launchpad for translations, bugs, blueprints and github for code hosting and version control
  44. ^ LMMS - Linux MultiMedia Studio
  45. ^ Maemo - gitorious
  46. ^ MeeGo - gitorious
  47. ^ Ruby on Rails: Merb
  48. ^ MooTools - a compact javascript framework
  49. ^ OLPC wiki. Project hosting. [2008-02-20]. 
  50. ^ openSUSE - gitorious (英語). 
  51. ^ Léon Brocard. Mailing List Announcement. [2008-12-22]. The Perl Foundation has migrated Perl 5 to the git version control system... 
  52. ^ PHP. PHP migrates to git. PHP Group. 2012-03-20 [2012-03-20]. 
  53. ^ phpBB. phpBB moves source code versioning from Subversion to git. phpBB Group. 2010-03-07 [2010-03-07]. 
  54. ^ Prototype JavaScript framework: Contribute
  55. ^ Qt now open for community contributions. 2009-05-11 [2009-06-22]. 
  56. ^ Reddit Goes Open Source. [2010-02-26]. 
  57. ^ "Rails is moving from SVN to git". [2008-04-03]. 
  58. ^ Using git for Samba Development - SambaWiki
  59. ^ SproutCore Documentation
  60. ^ Sugar Labs project hosting
  61. ^ Accessing SWI-Prolog source via <a href="http://git-scm.com/">git</a>
  62. ^ 62.0 62.1 git - VideoLAN Wiki
  63. ^ gitWine - The Official Wine Wiki
  64. ^ Xiph git
  65. ^ X.Org Wiki - Development/git
  66. ^ YUI 2 and YUI 3 Source Code Now on gitHub. [2009-01-20]. 

外部連結[編輯]

參見[編輯]