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 這三種狀態:

  • 已提交(committed),表示數據已經安全的保存在本地數據庫中
  • 已修改(modified),表示修改了文件,但還沒保存到數據庫中
  • 已暫存(staged),表示對一個已修改文件的當前版本做了標記,使之包含在下次提交的快照中

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

  • Git 倉庫,用來保存項目的元數據和對象數據庫
  • 工作目錄,對項目的某個版本進行獨立提取
  • 暫存區域,保存了下次將提交的文件列表信息,也可以叫“索引”

Git 的工作流程是這樣的:

  • 在工作目錄中修改文件
  • 暫存文件,將文件的快照放入暫存區域
  • 提交更新,找到暫存區域的文件,將快照永久性存儲到 Git 倉庫目錄

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

https://git-scm.com/downloads

我個人使用的 macOS 系統,可以直接使用 brew install 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)等核心知識點

https://github.com/itwanger/toBeBetterJavaer

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章