大家好,我是二哥呀!
從今天開始,我計(jì)劃在《Java 程序員進(jìn)階之路》專欄的“Java 企業(yè)級(jí)開發(fā)”子目錄中分享幾篇關(guān)于 git 的文章。由于公眾號(hào)文章發(fā)布后無(wú)法修改或添加統(tǒng)一目錄作為索引頁(yè),我決定將《Java 程序員進(jìn)階之路》的系列文章開源到 github 上。
目前計(jì)劃的主題包括:
- Git 的前世今生(本文)
- Git 的數(shù)據(jù)結(jié)構(gòu)
- Git 的內(nèi)部實(shí)現(xiàn)
- 常用 Git 命令清單
- Git 的基本使用
- Git 分支管理
- Git 版本庫(kù)托管商 GitHub
- Git 學(xué)習(xí)資料推薦
如果大家有喜歡的主題,也歡迎在評(píng)論區(qū)提出。好了,我們開始吧。
Git 是一個(gè)分布式版本控制系統(tǒng),由著名的林納斯·托瓦茲(Linus Torvalds)創(chuàng)建。Git 最初的目的是為了更好地管理 linux 內(nèi)核源碼。
眾所周知,Linux 內(nèi)核是開源的,參與者眾多,至今已有兩萬(wàn)多名開發(fā)者為 Linux Kernel 貢獻(xiàn)過代碼。然而,從 1991 年到 2002 年期間,Linus 作為項(xiàng)目管理員并沒有使用任何配置管理工具,而是通過手動(dòng)合并大家提交的補(bǔ)丁來(lái)管理代碼。
這并不是因?yàn)?Linus 喜歡手動(dòng)處理,而是因?yàn)樗麑?duì)代碼版本管理工具非常挑剔,無(wú)論是商用的 ClearCase,還是開源的 CVS、svn,都不符合他的要求。
直到 2002 年,Linus 才看中了一款分布式版本控制系統(tǒng) BitKeeper。盡管 BitKeeper 是商用的,但它愿意讓 Linux 社區(qū)免費(fèi)使用,這讓 Linus 非常高興和滿意。
然而,到了 2005 年,由于 BitKeeper 提供的默認(rèn)接口無(wú)法滿足 Linux 社區(qū)用戶的所有需求,一位開發(fā)者在未經(jīng)許可的情況下反編譯了 BitKeeper 并使用了未公開的接口。于是,BitKeeper 的著作權(quán)擁有者拉里·麥沃伊憤怒地收回了 Linux 社區(qū)的免費(fèi)使用權(quán)。
無(wú)奈之下,Linus 決定自己動(dòng)手。他為新的版本控制系統(tǒng)設(shè)定了幾個(gè)目標(biāo):
- 速度快
- 設(shè)計(jì)簡(jiǎn)單
- 允許成千上萬(wàn)個(gè)并行開發(fā)分支
- 完全分布式
- 能夠高效管理類似 Linux 內(nèi)核的超大規(guī)模項(xiàng)目
令人驚訝的是,Linus 僅用了 10 天時(shí)間就用 C 語(yǔ)言完成了第一個(gè)版本,真是神一般的速度。他給這個(gè)版本起了一個(gè)略帶嘲諷意味的名字——Git(在英式英語(yǔ)俚語(yǔ)中表示“不愉快的人”)。
Git 的設(shè)計(jì)包括兩種命令:底層命令(Plumbing commands)和高層命令(Porcelain commands)。最初,Linus 設(shè)計(jì)了一些符合 unix KISS 原則的命令,供開源社區(qū)的黑客們使用,因?yàn)檫@些黑客本身就是動(dòng)手高手,所以這些命令被稱為 plumbing commands。
Linus 在提交了第一個(gè) git commit 后,向社區(qū)發(fā)布了 git 工具。當(dāng)時(shí),社區(qū)中一位名叫 Junio Hamano 的開發(fā)者對(duì)這個(gè)工具產(chǎn)生了興趣。他下載了代碼,發(fā)現(xiàn)只有 1244 行,這更激發(fā)了他的興趣。Junio 通過郵件列表與 Linus 交流,并幫助增加了 merge 等功能,后來(lái)持續(xù)打磨 git,最終完全接手了 Git 的維護(hù)工作,而 Linus 則回到了 Linux Kernel 項(xiàng)目的維護(hù)工作上。
Junio Hamano 認(rèn)為 Linus 設(shè)計(jì)的這些命令對(duì)普通用戶不太友好,因此在此基礎(chǔ)上封裝了更易于使用、接口更友好的高層命令,這就是我們今天常用的 git add、git commit 等命令。例如,git add 封裝了 update-cache 命令,而 git commit 封裝了 write-tree、commit-tree 命令。
如果要選歷史上最偉大的一次 Git 代碼提交,那一定是 Git 工具項(xiàng)目本身的第一次代碼提交。這次提交無(wú)疑是開創(chuàng)性的。如果說(shuō) Linux 項(xiàng)目促成了開源軟件的成功并改變了軟件行業(yè)的格局,那么 Git 則改變了全世界開發(fā)者的工作方式和寫作方式。
如今,Git 已經(jīng)成為全球軟件開發(fā)者的標(biāo)配。
最初的 Git 僅適用于 Unix/Linux 平臺(tái),但隨著 Cygwin、msysGit 環(huán)境的成熟,以及 TortoiseGit 等易用的 GUI 工具的出現(xiàn),Git 在 windows 平臺(tái)上也逐漸成熟。
Git 和傳統(tǒng)的版本控制工具 CVS、SVN 有著顯著的區(qū)別,前者關(guān)注文件的整體性是否發(fā)生了變化,而后兩者更關(guān)注文件內(nèi)容的差異。
Git 存儲(chǔ)項(xiàng)目隨時(shí)間改變的快照。
此外,Git 更像是一個(gè)文件系統(tǒng),每個(gè)使用它的主機(jī)都可以作為版本庫(kù),并且可以在不依賴遠(yuǎn)程倉(cāng)庫(kù)的情況下離線工作。開發(fā)者在本地就有歷史版本的副本,因此不再受限于遠(yuǎn)程倉(cāng)庫(kù)的網(wǎng)絡(luò)傳輸。
Git 的大多數(shù)操作只需要訪問本地文件和資源,通常不需要來(lái)自網(wǎng)絡(luò)上其他計(jì)算機(jī)的信息。因?yàn)樵诒镜卮疟P上就有項(xiàng)目的完整歷史,所以 Git 的大部分操作看起來(lái)就像是瞬間完成的。
在多人協(xié)作的情況下,Git 可以將本地倉(cāng)庫(kù)復(fù)制給其他開發(fā)者,那些發(fā)生變化的文件可以作為新的分支導(dǎo)入,再與本地倉(cāng)庫(kù)進(jìn)行分支合并。
為了后續(xù)學(xué)習(xí)更順利,請(qǐng)記住 Git 的三種狀態(tài):
- 已提交(committed):表示數(shù)據(jù)已經(jīng)安全地保存在本地數(shù)據(jù)庫(kù)中。
- 已修改(modified):表示修改了文件,但還沒保存到數(shù)據(jù)庫(kù)中。
- 已暫存(staged):表示對(duì)一個(gè)已修改文件的當(dāng)前版本做了標(biāo)記,使之包含在下次提交的快照中。
由此引入了 Git 的三個(gè)工作區(qū)域:
- Git 倉(cāng)庫(kù):用來(lái)保存項(xiàng)目的元數(shù)據(jù)和對(duì)象數(shù)據(jù)庫(kù)。
- 工作目錄:對(duì)項(xiàng)目的某個(gè)版本進(jìn)行獨(dú)立提取。
- 暫存區(qū)域:保存了下次將提交的文件列表信息,也可以稱為“索引”。
Git 的工作流程如下:
- 在工作目錄中修改文件。
- 暫存文件,將文件的快照放入暫存區(qū)域。
- 提交更新,找到暫存區(qū)域的文件,將快照永久性存儲(chǔ)到 Git 倉(cāng)庫(kù)目錄。
接下來(lái),我們來(lái)看一下 Git 的安裝。Linux 和 Windows 系統(tǒng)的安裝方法可以在 Git 官網(wǎng)上找到,非常詳細(xì)。
我個(gè)人使用的是 macos 系統(tǒng),可以直接使用 brew install git 命令進(jìn)行安裝,非常方便。
安裝成功后,使用 git –version 就可以查看版本號(hào)了,我本機(jī)上安裝的是 2.23.0 版本。
參考資料: