天天看點

可能是曆史上最偉大的一次 Git 代碼送出

Git 是一個分布式版本控制系統,締造者是大名鼎鼎的林納斯·托瓦茲 (Linus Torvalds),Git 最初的目的是為了能更好的管理 Linux 核心源碼。

PS:為了能夠幫助更多的 Java 愛好者,已将《Java 程式員進階之路》開源到了 GitHub(本篇已收錄)。該專欄目前已經收獲了 715 枚星标,如果你也喜歡這個專欄,覺得有幫助的話,可以去點個 star,這樣也友善以後進行更系統化的學習:

https://github.com/itwanger/toBeBetterJavaer

每天看着 star 數的上漲我心裡非常的開心,希望越來越多的 Java 愛好者能因為這個開源項目而受益,而越來越多人的 star,也會激勵我繼續更新下去~

大家都知道,Linux 核心是開源的,參與者衆多,到目前為止,共有兩萬多名開發者給 Linux Kernel 送出過代碼。

但在 1991 年到 2002 年期間,Linus 作為項目的管理者并沒有借助任何配置管理工具,而是以手工方式通過 patch 來合并大家送出的代碼。

倒不是說 Linus 喜歡手工處理,而是因為他對代碼版本管理工具非常挑剔,無論是商用的 clearcase,還是開源的 CVS、SVN 都入不了他的法眼。

直到 2002 年,Linus 才相中了一款分布式版本控制系統 BitKeeper,雖然是商用的,但 BitKeeper 願意讓 Linux 社群免費使用,這讓 Linus 非常開心和滿意。

時間來到 2005 年,由于 BitKeeper 提供的預設接口不能滿足 Linux 社群使用者的全部需要,一位開發者在未經允許的情況下反編譯了 BitKeeper 并利用了未公開的接口,于是 BitKeeper 的著作權擁有者拉裡·麥沃伊就氣憤地收回了 Linux 社群免費使用的權力。

沒辦法,Linus 隻好自己硬着頭皮上了。他對新的版本控制系統制訂了若幹目标:

速度

設計簡單

允許成千上萬個并行開發的分支

完全分布式

有能力高效管理類似 Linux 核心一樣的超大規模項目

結果,令人意想不到的是,Linus 隻用了 10 天時間就用 C語言完成了第一個版本,嗯。。神就是神。并且給這個版本起了一個略帶嘲諷意味的名字——Git(在英式英語俚語中表示“不愉快的人”)。

源代碼的自述檔案有進一步的闡述:

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)

從 Git 的設計上來看,有兩種指令:分别是底層指令(Plumbing commands)和高層指令(Porcelain commands)。一開始,Linus 隻設計了一些給開源社群的黑客們使用的符合 Unix KISS 原則的指令,因為黑客們本身就是動手高手,水管壞了就撸起袖子去修理,是以這些指令被稱為 plumbing commands。

Linus 在送出了第一個 git commit 後,就向社群釋出了 git 工具。當時,社群中有位叫 Junio Hamano 的開發者覺得這個工具很有意思,便下載下傳了代碼,結果發現一共才 1244 行代碼,這更令他驚奇,也引發了極大的興趣。Junio 在郵件清單與 Linus 交流并幫助增加了 merge 等功能,而後持續打磨 git,最後 Junio 完全接手了 Git 的維護工作,Linus 則回去繼續維護 Linux Kernel 項目。

Junio Hamano 覺得 Linus 設計的這些指令對于普通使用者不太友好,是以在此之上,封裝了更易于使用、接口更精美的高層指令,也就是我們今天每天使用的 git add, git commit 之類。Git add 就是封裝了 update-cache 指令,而 git commit 就是封裝了 write-tree, commit-tree 指令。

如果選曆史上最偉大的一次 Git 代碼送出,那一定是這 Git 工具項目本身的第一次代碼送出。這次代碼送出無疑是開創性的,如果說 Linux 項目促成了開源軟體的成功并改寫了軟體行業的格局,那麼 Git 則是改變了全世界開發者的工作方式和寫作方式。

如今,Git 已經成為全球軟體開發者的标配。

原本的 Git 隻适用于 Unix/Linux 平台,但随着 Cygwin、msysGit 環境的成熟,以及 TortoiseGit 這樣易用的GUI工具,Git 在 Windows 平台下也逐漸成熟。

PS1:Cygwin 的主要目的是通過重新編譯,将 POSIX 系統(例如Linux、BSD,以及其他Unix系統)上的軟體移植到Windows上。

PS2:msysGit 前面的 4 個字幕來源于 MSYS 項目,而 MSYS 又源于 MinGW(Minimalist GNU for Windows,最簡GNU工具集),通過增加了一個由bash提供的shell環境以及其他相關工具軟體,組成了一個最簡系統(Minimal System),利用MinGW提供的工具,以及Git針對MinGW的一個分支版本,可以在Windows平台為Git編譯出一個原生應用,結合MSYS就組成了msysGit。

Git 和傳統的版本控制工具 CVS、SVN 有不小的差別,前者關心的是檔案的整體性是否發生了改變,後兩者更關心檔案内容上的差異。

可能是曆史上最偉大的一次 Git 代碼送出

除此之外,Git 更像是一個檔案系統,每個使用它的主機都可以作為版本庫,并且不依賴于遠端倉庫而離線工作。開發者在本地就有曆史版本的副本,是以就不用再被遠端倉庫的網絡傳輸而束縛。

Git 中的絕大多數操作都隻需要通路本地檔案和資源,一般不需要來自網絡上其它計算機的資訊。因為在本地磁盤上就有項目的完整曆史,是以 Git 的大部分操作看起來就像是在瞬間完成的。

在多人協作的情況下,Git 可以将本地倉庫複制給其他開發者,那些發生改變的檔案可以作為新增的分支被導入,再與本地倉庫的進行分支合并。

如果你希望後面的學習更順利,請記住 Git 這三種狀态:

已送出(committed),表示資料已經安全的儲存在本地資料庫中

已修改(modified),表示修改了檔案,但還沒儲存到資料庫中

已暫存(staged),表示對一個已修改檔案的目前版本做了标記,使之包含在下次送出的快照中

由此引入了 Git 的三個工作區域:

Git 倉庫,用來儲存項目的中繼資料和對象資料庫

工作目錄,對項目的某個版本進行獨立提取

暫存區域,儲存了下次将送出的檔案清單資訊,也可以叫“索引”

Git 的工作流程是這樣的:

可能是曆史上最偉大的一次 Git 代碼送出

在工作目錄中修改檔案

暫存檔案,将檔案的快照放入暫存區域

送出更新,找到暫存區域的檔案,将快照永久性存儲到 Git 倉庫目錄

接下來,我們來看一下 Git 的安裝,Linux 和 Windows 系統的安裝大家可以到 Git 官網上檢視安裝方法,上面講的非常詳細。

https://git-scm.com/downloads

我個人使用的 macOS 系統,可以直接使用 brew install git 指令安裝,非常友善。

可能是曆史上最偉大的一次 Git 代碼送出

安裝成功後,再使用 git --version 就可以檢視版本号了,我本機上安裝的是 2.23.0 版本。

參考資料:

維基百科:

https://zh.wikipedia.org/wiki/Git

ProGit:

https://www.progit.cn/

hutusi:改變世界的一次代碼送出

這是《Java 程式員進階之路》專欄的第 73 篇(記得去點個 star 哦)。該專欄風趣幽默、通俗易懂,對 Java 愛好者極度友好和舒适😄,内容包括但不限于 Java 基礎、Java 集合架構、Java IO、Java 并發程式設計、Java 虛拟機、Java 企業級開發(Maven、Git、SSM、Spring Boot)等核心知識點。

可能是曆史上最偉大的一次 Git 代碼送出

讓我們一起成為更好的 Java 工程師吧!