-
1. 起步
-
2. Git 基礎
-
3. Git 分支
-
4. 伺服器上的 Git
- 4.1 協議
- 4.2 在伺服器上部署 Git
- 4.3 生成 SSH 公鑰
- 4.4 架設伺服器
- 4.5 Git Daemon
- 4.6 Smart HTTP
- 4.7 GitWeb
- 4.8 GitLab
- 4.9 第三方託管服務
- 4.10 小結
-
5. 分散式 Git
-
A1. 附錄 A: Git 在其他環境
- A1.1 圖形介面
- A1.2 Visual Studio 中的 Git
- A1.3 Visual Studio Code 中的 Git
- A1.4 IntelliJ / PyCharm / WebStorm / PhpStorm / RubyMine 中的 Git
- A1.5 Sublime Text 中的 Git
- A1.6 Bash 中的 Git
- A1.7 Zsh 中的 Git
- A1.8 PowerShell 中的 Git
- A1.9 小結
-
A2. 附錄 B: 在應用程式中嵌入 Git
-
A3. 附錄 C: Git 命令
1.3 入門 - Git 是什麼?
什麼是 Git?
那麼,簡而言之,Git 是什麼?這一節很重要,務必理解,因為如果你明白了 Git 是什麼以及它工作的基礎原理,那麼高效地使用 Git 就會變得容易得多。在學習 Git 的過程中,儘量忘掉你可能瞭解過的其他版本控制系統(VCS),例如 CVS、Subversion 或 Perforce —— 這樣做有助於你在使用 Git 時避免產生細微的混淆。儘管 Git 的使用者介面與其他 VCS 相當相似,但 Git 儲存和思考資訊的方式卻截然不同,理解這些差異將有助於你避免在使用過程中感到困惑。
快照,而非差異
Git 與其他任何 VCS(包括 Subversion 及其同類產品)的主要區別在於 Git 如何看待其資料。從概念上講,大多數其他系統將資訊儲存為基於檔案的更改列表。這些其他系統(CVS、Subversion、Perforce 等)將它們儲存的資訊視為一組檔案以及每個檔案隨時間發生的變化(這通常被描述為基於增量的版本控制)。
Git 不以這種方式思考或儲存其資料。相反,Git 將其資料更像一系列的迷你檔案系統快照。在 Git 中,每次提交或儲存專案狀態時,Git 基本上都會拍一張當時所有檔案樣子的照片,並存儲對該快照的引用。為了高效,如果檔案沒有更改,Git 不會再次儲存該檔案,只會在已儲存的先前相同檔案上建立一個連結。Git 將其資料更像一個**快照流**。
這是 Git 與幾乎所有其他 VCS 之間的一個重要區別。它使得 Git 能夠重新審視大多數其他系統從上一代繼承而來的幾乎每一個版本控制的方面。這使得 Git 更像一個迷你檔案系統,上面構建了一些極其強大的工具,而不僅僅是一個 VCS。當我們討論 Git 分支 時,我們將探討透過這種方式思考資料能帶來的一些好處。
幾乎所有操作都是本地的
Git 中的大多數操作只需要本地檔案和資源即可執行 —— 通常不需要網路上的另一臺計算機的任何資訊。如果你習慣使用 CVCS,其中大多數操作都存在網路延遲的開銷,那麼 Git 的這一點會讓你覺得速度之神似乎賦予了 Git 超凡的力量。因為專案的完整歷史記錄就在你的本地磁碟上,所以大多數操作似乎幾乎是瞬時的。
例如,要瀏覽專案歷史,Git 不需要連線到伺服器獲取歷史並顯示給你 —— 它只需從本地資料庫直接讀取。這意味著你幾乎可以立即看到專案歷史。如果你想檢視當前版本的檔案與一個月前的檔案之間的差異,Git 可以查詢一個月前的檔案並進行本地差異計算,而無需詢問遠端伺服器來執行此操作,或者從遠端伺服器拉取一個較舊的檔案版本來本地執行。
這意味著,如果你離線或沒有 VPN,你可以做的幾乎事情都很少。如果你坐上飛機或火車,想做點工作,你可以愉快地提交(請記住,提交到你的本地副本!),直到你連線到網路才能上傳。如果你回到家,VPN 客戶端無法正常工作,你仍然可以工作。在許多其他系統中,這樣做要麼不可能,要麼非常痛苦。例如,在 Perforce 中,當未連線到伺服器時,你無法做太多事情;在 Subversion 和 CVS 中,你可以編輯檔案,但無法將更改提交到你的資料庫(因為你的資料庫離線)。這可能看起來不是什麼大事,但你可能會驚訝於它能帶來如此大的不同。
Git 具有完整性
Git 中的所有內容在儲存之前都會進行校驗和計算,然後根據該校驗和進行引用。這意味著在 Git不知情的情況下,檔案或目錄的內容被更改是不可能的。這個功能是 Git 在最低級別上構建的,也是其哲學不可或缺的一部分。你不會在傳輸過程中丟失資訊,也不會在 Git 無法檢測到的情況下發生檔案損壞。
Git 使用的校驗和機制稱為 SHA-1 雜湊。這是一個由十六進位制字元(0-9 和 a-f)組成的 40 位字串,根據 Git 中檔案或目錄結構的內容計算得出。SHA-1 雜湊值看起來像這樣
24b9da6552252987aa493b52f8696cd6d3b00373
你會在 Git 中到處看到這些雜湊值,因為 Git 大量使用它們。實際上,Git 在其資料庫中儲存內容不是按檔名,而是按其內容計算出的雜湊值。
Git 通常只新增資料
當你執行 Git 操作時,幾乎所有操作都只是新增資料到 Git 資料庫。要讓系統執行任何不可撤銷的操作或以任何方式擦除資料,都是很困難的。與任何 VCS 一樣,你可能會丟失或弄糟尚未提交的更改,但一旦你將快照提交到 Git,就很難丟失,特別是如果你定期將資料庫推送到另一個倉庫。
這使得使用 Git 成為一種樂趣,因為我們知道我們可以進行實驗,而不會有嚴重搞砸的危險。有關 Git 如何儲存其資料以及如何恢復似乎丟失的資料的更深入的介紹,請參閱 撤銷操作。
三個狀態
現在請注意 —— 如果你希望後續的學習過程順利進行,這是關於 Git 最重要的一點要記住。Git 中你的檔案可以存在於三個主要狀態:已修改(modified)、已暫存(staged)和已提交(committed)。
-
已修改(Modified)表示你更改了檔案,但尚未將其提交到資料庫。
-
已暫存(Staged)表示你已將某個已修改檔案的當前版本標記為將包含在下一個提交快照中。
-
已提交(Committed)表示資料已安全地儲存在你的本地資料庫中。
這引出了 Git 專案的三個主要部分:工作目錄(working tree)、暫存區域(staging area)和 Git 目錄(Git directory)。
工作目錄是你專案中某個版本的單個檢出。這些檔案從 Git 目錄中的壓縮資料庫中提取出來,放在磁碟上供你使用或修改。
暫存區域是一個檔案,通常包含在你的 Git 目錄中,它儲存了有關將要包含在下一個提交中的資訊。在 Git 的專業術語中,它的技術名稱是“索引”(index),但“暫存區域”(staging area)這個說法也同樣好用。
Git 目錄是 Git 儲存專案元資料和物件資料庫的地方。這是 Git 最重要的部分,當你從另一臺計算機克隆(clone)一個倉庫時,它會被複制。
基本的 Git 工作流程大致如下:
-
你在工作目錄中修改檔案。
-
你選擇性地暫存你想包含在下一次提交中的更改,這會將僅這些更改新增到暫存區域。
-
你執行提交操作,該操作將暫存區域中的檔案作為當前狀態,並將該快照永久儲存到你的 Git 目錄中。
如果一個檔案的某個特定版本存在於 Git 目錄中,它就被認為是已提交(committed)。如果它被修改並新增到了暫存區域,那麼它就是已暫存(staged)。如果它自檢出以來被修改但尚未暫存,那麼它就是已修改(modified)。在 Git 基礎 中,你將學到更多關於這些狀態的資訊,以及如何利用它們或完全跳過暫存部分。