Git

git（note=no，音頻）是一個分散式版本控制軟件，最初由林納斯·託瓦茲創作，於2005年以GPL授權條款釋出。最初目的是為了更好地管理Linux核心開發而設計。應注意的是，這與GNU Interactive Tools（一個類似界面的文件管理器）不同。
git最初的開發動力來自於BitKeeper和Monotone。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這個名字（在英式英語俚語中表示「不愉快的人」）
源代碼的自述文件進一步闡述了：

**版本**

**主要功能**
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中的數據流與存儲級別
git有兩種數據結構：可變的索引（index、stage或cache）用於緩衝工作目錄信息與下一次提交的版本信息；不變的、僅追加的對象數據庫。
對象數據庫包含4類對象：
*blob （-{zh-cn:二進制大對象;zh-tw:二進位大型物件}-）是使用zlib壓縮算法對一個文件的內容壓縮後的結果。Blobs沒有保存文件名、時間戳或其他元數據。git將其存儲在位於隱藏的.git/objects文件夾中。文件的名稱為使用SHA-1哈希函數對原文件內容生成的哈希值。這些對象文件稱為Blob，每次將新文件添加到存儲庫時會創建Blob對象。
*tree對象對應於文件目錄。包含文件名列表以及文件的類型比特（包含-{zh-cn:許可權;zh-tw:許可權}-post-text=此處許可權具體指涉的是什麼概念）、到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 BSD- 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 (用戶界面)- 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 date=20210201025217 -  CSDN CODE-  Coding date=20210202144136 - GitLab-  GitCode 

**參見**
 分佈式版本控制- Gitee- 代碼庫- 倉庫 (版本控制)- GitHub- GitLab- Gitea

**參考文獻**

**外部鏈接**
 git官方網站- git快速入門- git Man Pagedate=20081025105540 - git用戶手冊 date=20180305063745 - git Community Book- 使用git管理源代碼 date=20190629212730 - git# (gitSharp) date=20200817180900 - GNU Interactive Tools date=20210130135718 - git從入門到精通P- 連猴子都能懂的Git入門指南 date=20170722050211