Git
章節 ▾ 第二版

1.3 開始 - 什麼是 Git?

什麼是 Git?

那麼,簡而言之,Git 是什麼?這是需要吸收的重要章節,因為如果您了解 Git 是什麼以及它運作的基本原理,那麼有效地使用 Git 可能會對您來說容易得多。當您學習 Git 時,請盡量清空您可能知道的關於其他 VCS(例如 CVS、Subversion 或 Perforce)的事情,這樣做將有助於您在使用工具時避免細微的混淆。儘管 Git 的使用者介面與這些其他 VCS 相當相似,但 Git 儲存和思考資訊的方式卻截然不同,了解這些差異將有助於您在使用它時避免混淆。

快照,而不是差異

Git 和任何其他 VCS(包括 Subversion 和朋友)之間的主要區別在於 Git 思考其資料的方式。從概念上講,大多數其他系統將資訊儲存為基於檔案的變更列表。這些其他系統(CVS、Subversion、Perforce 等)將它們儲存的資訊視為一組檔案以及隨時間對每個檔案所做的變更(這通常被描述為基於差異的版本控制)。

Storing data as changes to a base version of each file
圖 4. 將資料儲存為對每個檔案基礎版本的變更

Git 不以這種方式思考或儲存其資料。相反地,Git 更像是將其資料視為一系列微型檔案系統的快照。使用 Git 時,每次您提交或儲存專案的狀態時,Git 基本上都會拍攝您所有檔案在那一刻的樣子,並儲存對該快照的參考。為了提高效率,如果檔案沒有變更,Git 不會再次儲存該檔案,而只會儲存到先前已儲存的相同檔案的連結。Git 更像是將其資料視為一連串的快照

Git stores data as snapshots of the project over time
圖 5. 將資料儲存為專案隨時間的快照

這是 Git 與幾乎所有其他 VCS 之間的重要區別。它使 Git 重新考慮了大多數其他系統從上一代複製的版本控制的幾乎所有方面。這使得 Git 更像是一個內建了一些功能強大工具的微型檔案系統,而不僅僅是一個 VCS。當我們在 Git 分支中介紹 Git 分支時,我們將探討通過以這種方式思考您的資料所獲得的一些好處。

幾乎每個操作都是本地的

Git 中的大多數操作只需要本地檔案和資源即可運作,一般來說不需要來自您網路上另一台電腦的資訊。如果您習慣於大多數操作都有網路延遲開銷的 CVCS,那麼 Git 的這一方面會讓您認為速度之神已經以超凡的力量祝福了 Git。由於您在本地磁碟上擁有專案的完整歷史記錄,因此大多數操作似乎幾乎是瞬間完成的。

例如,要瀏覽專案的歷史記錄,Git 不需要連線到伺服器來取得歷史記錄並顯示給您,它只需直接從您的本地資料庫讀取即可。這表示您幾乎可以立即看到專案歷史記錄。如果您想查看檔案的目前版本和一個月前的檔案之間引入的變更,Git 可以查找一個月前的檔案並進行本地差異計算,而不必要求遠端伺服器執行該計算或從遠端伺服器提取舊版本的檔案以在本地執行該計算。

這也代表,如果你處於離線或未連線 VPN 的狀態,你幾乎可以做任何事。如果你搭飛機或火車,想稍微工作一下,你可以安心地提交 (請記住,是提交到你的本機副本),直到你連上網路可以上傳為止。如果你回到家,VPN 用戶端程式無法正常運作,你仍然可以工作。在許多其他系統中,這樣做不是不可能就是很麻煩。例如,在 Perforce 中,如果沒有連線到伺服器,你幾乎無法做任何事;在 Subversion 和 CVS 中,你可以編輯檔案,但你無法將變更提交到你的資料庫 (因為你的資料庫是離線的)。這看起來可能沒什麼大不了,但你可能會驚訝地發現它能帶來多大的差異。

Git 具有完整性

Git 中的所有內容在儲存前都會經過檢查碼運算,然後以該檢查碼來參照。這表示,如果沒有讓 Git 知道,就不可能變更任何檔案或目錄的內容。此功能在 Git 最底層就已內建,是其哲學的基礎。你不會在傳輸過程中遺失資訊,或在 Git 無法偵測到的情況下發生檔案損壞。

Git 用於此檢查碼運算的機制稱為 SHA-1 雜湊。這是一個 40 個字元的字串,由十六進位字元 (0–9 和 a–f) 組成,並根據 Git 中檔案或目錄結構的內容計算得出。一個 SHA-1 雜湊看起來像這樣

24b9da6552252987aa493b52f8696cd6d3b00373

你會在 Git 中到處看到這些雜湊值,因為它非常頻繁地使用它們。事實上,Git 在資料庫中儲存所有內容的方式,並非依照檔案名稱,而是依照其內容的雜湊值。

Git 通常只會新增資料

當你在 Git 中執行動作時,幾乎所有動作都只會將資料新增到 Git 資料庫。很難讓系統執行任何不可撤銷的動作,或以任何方式清除資料。與任何 VCS 一樣,你可能會遺失或搞砸尚未提交的變更,但在你將快照提交到 Git 之後,它就非常難以遺失,特別是如果你定期將資料庫推送到另一個儲存庫。

這讓使用 Git 變成一種樂趣,因為我們知道我們可以進行實驗,而不會有嚴重搞砸事情的危險。如需更深入瞭解 Git 如何儲存其資料,以及如何復原看似遺失的資料,請參閱還原變更

三種狀態

請注意現在 — 如果你希望學習過程順利進行,以下是關於 Git 最重要的一件事。Git 有三個主要狀態,你的檔案可能處於這些狀態:已修改已暫存已提交

  • 已修改表示你已變更檔案,但尚未將其提交到資料庫。

  • 已暫存表示你已將目前版本的已修改檔案標記為要放入你的下一個提交快照。

  • 已提交表示資料已安全地儲存在你的本機資料庫中。

這將我們引導到 Git 專案的三個主要區段:工作目錄、暫存區和 Git 目錄。

Working tree, staging area, and Git directory
圖 6. 工作目錄、暫存區和 Git 目錄

工作目錄是專案一個版本的單次簽出。這些檔案會從 Git 目錄中壓縮的資料庫取出,並放置在磁碟上供你使用或修改。

暫存區是一個檔案,通常包含在你的 Git 目錄中,會儲存關於哪些內容將放入你的下一個提交的資訊。它在 Git 中的技術名稱是「索引」,但「暫存區」這個詞也同樣適用。

Git 目錄是 Git 儲存你的專案的中繼資料和物件資料庫的地方。這是 Git 最重要的部分,當你從另一部電腦複製儲存庫時,複製的就是這個部分。

基本的 Git 工作流程如下

  1. 你在工作目錄中修改檔案。

  2. 你選擇性地暫存你想要成為下一個提交一部分的那些變更,這會將這些變更新增到暫存區。

  3. 你執行提交,這會將檔案依照它們在暫存區中的狀態,永久地儲存該快照到你的 Git 目錄。

如果檔案的特定版本在 Git 目錄中,則會被視為已提交。如果檔案已修改並新增到暫存區,則為已暫存。如果檔案自簽出以來已變更,但尚未暫存,則為已修改。在Git 基礎中,你會學到更多關於這些狀態的資訊,以及如何利用它們,或者完全跳過暫存部分。

scroll-to-top