Git 之二 架構、工作流程、.git 目錄文件

寫在前面

  Git 的官網上有很詳細的使用教程(當然有翻譯版本),具體地址是 https://git-scm.com/book/zh/v2。唯一不足就是,很多講解並沒有實機演示。但是,毫無疑問,官網資料是最全面的!如果有任何疑問,可以去官網看看!

架構

  Git 和其它版本控制系統(包括 Subversion 和近似工具)的主要差別在於 Git 對待數據的方法。 概念上來區分,其它大部分系統以文件變更列表的方式存儲信息。 這類系統(CVS、Subversion、Perforce、Bazaar 等等)將它們保存的信息看作是一組基本文件和每個文件隨時間逐步累積的差異。
在這裏插入圖片描述
  Git 不按照以上方式對待或保存數據。 反之,Git 更像是把數據看作是對小型文件系統的一組快照。 每次你提交更新,或在 Git 中保存項目狀態時,它主要對當時的全部文件製作一個快照並保存這個快照的索引。 爲了高效,如果文件沒有修改,Git 不再重新存儲該文件,而是隻保留一個鏈接指向之前存儲的文件。 Git 對待數據更像是一個快照流
在這裏插入圖片描述
  Git 中所有數據在存儲前都計算校驗和,然後以校驗和來引用。 這意味着不可能在 Git 不知情時更改任何文件內容或目錄內容。 這個功能建構在 Git 底層,是構成 Git 哲學不可或缺的部分。 若你在傳送過程中丟失信息或損壞文件,Git 就能發現。Git 用以計算校驗和的機制叫做 SHA-1 散列(hash,哈希)。 這是一個由 40 個十六進制字符(0-9 和 a-f)組成的字符串,基於 Git 中文件的內容或目錄結構計算出來。
  Git 管理的文件有三種狀態,你的文件可能處於其中之一:已提交(committed)、已修改(modified)和已暫存(staged)。由此引入 Git 項目的三個工作區域的概念:Git 倉庫、工作目錄以及暫存區域。

  • 工作目錄: 就是 Git 管理的文件夾。
  • 暫存區域: 暫存區域是一個文件,保存了下次將提交的文件列表信息,一般在 Git 倉庫目錄(.git)中。 有時候也被稱作“索引”。
  • Git 倉庫: Git 倉庫目錄是 Git 用來保存項目的元數據和對象數據庫的地方。主要就是我們工作目錄中的 .git 文件夾所在的文件夾

工作流程

根據是否使用遠程倉庫,工作流程可以分本地工作流程和遠程工作流程。

本地工作流程

主要是指的對於本地倉庫的各種操作!如下圖所示:
在這裏插入圖片描述
下面是實際的 Git 命令示例:

ZCShou@ZCShou-PC MINGW64 /e/N_W_Z/N_W_Z_3
$ git init
Initialized empty Git repository in E:/N_W_Z/N_W_Z_3/.git/

ZCShou@ZCShou-PC MINGW64 /e/N_W_Z/N_W_Z_3 (master)
$ vim a.txt

ZCShou@ZCShou-PC MINGW64 /e/N_W_Z/N_W_Z_3 (master)
$ git status
On branch master

No commits yet

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        a.txt

nothing added to commit but untracked files present (use "git add" to track)

ZCShou@ZCShou-PC MINGW64 /e/N_W_Z/N_W_Z_3 (master)
$ git add a.txt
warning: LF will be replaced by CRLF in a.txt.
The file will have its original line endings in your working directory

ZCShou@ZCShou-PC MINGW64 /e/N_W_Z/N_W_Z_3 (master)
$ git status
On branch master

No commits yet

Changes to be committed:
  (use "git rm --cached <file>..." to unstage)
        new file:   a.txt


ZCShou@ZCShou-PC MINGW64 /e/N_W_Z/N_W_Z_3 (master)
$ git commit -m "新增"
[master (root-commit) ba06d60] 新增
 1 file changed, 1 insertion(+)
 create mode 100644 a.txt

ZCShou@ZCShou-PC MINGW64 /e/N_W_Z/N_W_Z_3 (master)
$ git status
On branch master
nothing to commit, working tree clean

ZCShou@ZCShou-PC MINGW64 /e/N_W_Z/N_W_Z_3 (master)
$

遠程工作流程

  主要是指的本地倉庫與遠程倉庫的關聯同步的問題。在關聯了遠程倉庫後,我們本地倉庫有變動之後,通常還需要將變動推送到關聯的遠程倉庫。如下圖所示:
在這裏插入圖片描述
下圖是一個使用 Git 開源項目的典型工作流程
在這裏插入圖片描述

.git 目錄解析

  在 Git 倉庫初始化之後,會在指定的目錄下生一個名爲 .git 的文件夾。這個文件夾是個隱藏目錄,Windows 系統需要開啓顯示隱藏才能看到!對於.git 所在的倉庫的所有操作,都會記錄在該文件中的各文件中。下面我們就來分析一下這個目錄。

  • config 文件: 該文件主要記錄針對該項目的一些配置信息,例如是否以 bare 方式初始化、remote 的信息等,通過 git remote add 命令增加的遠程分支的信息就保存在這裏;
  • objects 文件夾: 該文件夾主要包含 git 對象。Git 中的文件和一些操作都會以 git 對象來保存,git 對象分爲 BLOB、tree 和 commit 三種類型,例如 git commit 便是 git 中的 commit 對象,而各個版本之間是通過版本樹來組織的,比如當前的 HEAD 會指向某個 commit 對象,而該 commit 對象又會指向幾個BLOB 對象或者 tree 對象。
    • 13、21 等文件夾: Git 對象保存在以其 sha-1 值的前兩位爲文件夾名,後 38 位爲文件名的文件中;Git 爲了節省存儲對象所佔用的磁盤空間,會定期對 Git 對象進行壓縮和打包!
    • pack 文件夾: 用於存儲打包壓縮的對象。
    • info 文件夾: 用於從打包的文件中查找 git 對象。
  • HEAD 文件: 該文件指向當前分支。比如當前分支是 master,則該文件就會指向 master。但是,並不是存儲一個 master 字符串,而是分支在 refs 中的表示,例如 ref: refs/heads/master。如下圖所示:
    在這裏插入圖片描述
  • index文件: 該文件保存了暫存區域的信息。該文件某種程度就是緩衝區(staging area),內容包括它指向的文件的時間戳、文件名、sha1值等;
  • refs 文件夾: 該文件夾存儲指向數據(分支)的提交對象的指針。
    • heads 文件夾: 存儲本地每一個分支最近一次 commit 的 sha-1 值(也就是commit對象的sha-1值),每個分支一個文件;如下圖所示:
      在這裏插入圖片描述
      上圖示例中, 分支 Dev 和 Feature 都是從 master 分支創建的,並且都還沒有任何提交,因此它們目前都執行同一次提交記錄。當在不同的分支進行提交之後,它們將指向不同的提交記錄。
    • remotes文件夾: 記錄你最後一次和每一個遠程倉庫的通信,Git 會把最後一次推送到這個 remote 的每個分支的值都記錄在這個文件夾中;
    • tag 文件夾: 這個是 Git 中一個概念,其實就是分支的別名
  • hooks文件夾: 主要定義了客戶端或服務端鉤子腳本,這些腳本主要用於在特定的命令和操作之前或者之後進行特定的處理,比如:當你把本地倉庫push到服務器的遠程倉庫時,可以在服務器倉庫的hooks文件夾下定義post_update腳本,在該腳本中可以通過腳本代碼將最新的代碼部署到服務器的web服務器上,從而將版本控制和代碼發佈無縫連接起來;
  • description文件: 僅供 GitWeb 程序使用
  • logs 文件夾: 記錄了本地倉庫和遠程倉庫的每一個分支的提交記錄,即所有的commit對象(包括時間、作者等信息)都會被記錄在這個文件夾中,因此這個文件夾中的內容是我們查看最頻繁的,不管是Git log命令還是tortoiseGit的show log,都需要從該文件夾中獲取提交日誌;
  • info文件夾: 保存了一份不希望在 .gitignore 文件中管理的忽略模式的全局可執行文件
  • COMMIT_EDITMSG 文件: 記錄了最後一次提交時的註釋信息。

參考

  1. https://git-scm.com/docs
  2. https://www.cnblogs.com/yelbosh/p/7471979.html
  3. git的基本架構欣賞 https://zhuanlan.zhihu.com/p/38245039
  4. Git的原理簡介和常用命令 https://www.cnblogs.com/yelbosh/p/7471979.html
  5. git工作流程一覽 https://www.cnblogs.com/yinn/archive/2018/01/23/7641507.html
  6. http://blog.didispace.com/gitflow-info/
  7. https://nvie.com/posts/a-successful-git-branching-model/
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章