Git 內部運作原理

  • Git 內部原理

    • 用檔案內容來定位的檔案系統
    • SHA1 是根據內容產生的,跟檔名無關
    • 內容一樣的檔案,即使檔案名稱不同,在Repository裡仍然只存一份。
    • 解耦合(decouple): 內容與當時的檔名
  • Git 的 Repository 又稱作 Object Database 資料庫,共有四種 Objects 類型:

    • Blob 記錄檔案內容
    • Tree 記錄該目錄下有哪些檔案(檔名、內容的SHA1)和 Trees
    • Commit 記錄 commit 訊息、Root tree 和 Parent commits 的 SHA1
    • Tag 記錄標籤
  • SHA-1 (Secure Hash Algorithm 1 安全雜湊演算法1)

    • 一種單向 Hash 雜湊加密演算法,例如它會將hello字串單向加密成為aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d。
    • 一種密碼雜湊函式,美國國家安全局設計,並由美國國家標準技術研究所(NIST)發布為聯邦資料處理標準(FIPS)
    • SHA-1可以生成一個被稱為訊息摘要的160位(20位元組)雜湊值,雜湊值通常的呈現形式為40個十六進位數。
    • 這個演算法有以下特性:
      • 給定 message 容易計算出 hash
      • 極度困難從 hash 推回 message
      • 極度困難修改 message 而 hash 不變
      • 極度困難不同的 messages 而 hash 一樣
      • hash 的分布很分散,跟 message 關聯不大
  • Git 內部如何儲存檔案

  • Git 內部如何儲存 Commit

  • 參照 Reference

    • Reference 會指向一個 Commit
    • tag 不會移動,指向的 commit 都一樣
      • 帶有額外資訊的 tag 內部會用 Object 儲存
    • branch 指向該 branch 最新的 commit
    • HEAD 指向 current branch
  • Reference 是非常便宜的。

  • 開新 branch 和 tag 只不過是 refs 而已,直到真的有 commit 前都沒有什麼負擔。
  • 不像有些 CSV 開分支會複製一份原始碼,非常耗費資源。

  • Integrity

    • SHA1 是內容的 checksum
    • Integrity: 如果檔案內容有損毀,就會發現跟SHA1不同。如果 tree 改檔名,也會被發現。
    • 這在分散式系統非常重要:資料從一個開發者傳到另一個開發者時,確保資料沒有被修改
  • Git 內部如何儲存 Branch 分支

cat .git/HEAD 拿到目前工作目錄 current branch 是指向哪一個 branch
cat .git/refs/heads/master 拿到 master branch 指向的 commit
cat .git/refs/tags/foobar 拿到 foobar tag 指向的 commit

了解了 Git 如何儲存 Branch 之後,就再也不會想用中央儲存式的 SVN 了:

  • svn 開分支和 merge 超痛苦,能避免開 branch 就避免開 branch
  • svn 看 log 超痛苦,需要等待網路連線
  • svn commit 或 checkout 超慢,主機如果放國外常 commit 一半中斷

Reference:

results matching ""

    No results matching ""