Git由淺入深之基礎理論

znzdl123 7年前發布 | 33K 次閱讀 Git 版本控制系統

Git由淺入深之基礎理論

萬丈高樓平地起,萬事只有打好基礎,才能有所成就,學習亦是一樣。本篇開始介紹Git基礎工作理論,學完本篇,我們應該知道什么是Git,Git是如何工作的,以及Git與SVN等分布式版本控制系統的主要區別。

什么是Git

一言以蔽之,Git是一個分布式版本控制系統(DVCS),大家都知道,那它與其他的集中式版本控制系統,如SVN等有什么差別呢?這就要從Git的特性開始介紹,介紹完,就清楚了Git是怎么工作的,及他與SVN等的差別。

快照(Snapshots)與記錄變更(Differences)

Git與SVN最大的差別在于它們如何處理數據:

  • SVN等大多數版本控制系統存儲的數據是一系列記錄項目文件變更的文件。

  • Git存儲的數據則更像是一個微型文件系統的一系列快照,即快照流。

每次提交或保存當前項目狀態,Git都會生成一個當前所有文件狀態的快照,并存儲一個對該快照的引用;而且文件沒有發生變化時,Git不會重復保存快照,而只是鏈接到之前的標識文件。

也許,你可以把Git想象成一個小型文件系統,而不僅僅是一個版本控制系統,這有助于你比較Git與其他版本控制系統。

操作本地化

在傳統的VCS中,大多數操作都依賴于網絡,特別在網絡延遲高時,那種痛苦感,相信你是不想有第二次體驗的;而Git的大部分操作都是基于本地文件和資源的,而不需要通過網絡從其他計算機獲取信息,Git將整個項目歷史保存在本地磁盤,使得大多數操作似乎沒有延遲感。

比如,需要查看項目歷史記錄時,Git不再需要從服務器獲取,可以直接從本地磁盤讀取,操作很快;又或者我們需要查看某一文件在兩個不同時間點的區別,Git可以查詢該文件不同時間點的狀態,并計算出變更,而不需要從服務器獲取不同版本文件或者請求服務器計算它們點變更。即使與服務器的連接斷開甚至網絡斷線,也不會受太大限制,我們可以在本地對文件進行編輯,保存,然后等連接正常時再上傳,而在其他的版本控制系統,這些幾乎不可能。

健全性

Git在存儲任何數據前都會先計算并存儲其校驗和,隨后通過該校驗和,而不是文件名訪問存儲數據,這意味著Git可以探測到任何文件或目錄的變更,即使數據發生丟失,Git也能知道。

Git生成校驗和的機制叫做SHA-1哈希,為什么通過該校驗和可以訪問到存儲數據呢?因為它是基于文件內容或目錄結構計算得出一個由40個十六進制字符組成的字符串,比如:24b9da6552252987aa493b52f8696cd6d3b00373。

操作數據

對數據進行版本管理,無非就是對數據進行增刪改并記錄,在傳統的VCS中,我們沒有提交至服務器的任何新增文件或變更,都很容易就可以被錯誤刪除或再次修改,這時我們是無法找回之前需要提交的內容的;然而在Git中,只要我們在本地提交了項目當前的快照,幾乎不會出現數據丟失的情況,而且無論是否提交數據到服務器我們都可以隨時找回之前保存過的內容或變更,即使在中途某次操作誤刪除或誤修改,因為Git中的幾乎所有操作,都是在向Git數據庫添加數據或變更記錄。

三種狀態

介紹到現在,終于進入本篇最重點的內容:Git的三種狀態。

在Git,文件可能有三種狀態:已提交(committed),已修改(modified),暫存(staged):

  • 已提交(commited),說明數據已經存儲在本地數據庫;
  • 已修改(modified),說明數據被修改,但是尚未存儲到本地數據庫;
  • 暫存(staged),說明已標記將一個被修改的文件(當前版本)添加到待提交的快照中。

這三種狀態分別對應Git項目的三大區塊:Git目錄,工作目錄,暫存區。

  • Git 目錄(repository),即Git存儲項目元數據和對象數據庫的地方,也就是我們克隆(clone)某項目倉庫時拷貝下的內容所在地;
  • 工作目錄(working directory),即從項目某版本中檢出的當前所處分支,也就是從Git目錄數據庫中拉取的文件在本地磁盤保存所在地;
  • 暫存區(staging area),即一個文件,通常包含在Git目錄中,存儲下一次需提交的內容,有時,它指向我們所說的“index”索引。

基本工作流程

我們使用Git時的一次基本工作流程如下:

  • 從Git目錄,檢出分支到工作目錄
  • 在工作目錄修改文件
  • 暫存文件,將其添加到待提交快照
  • 提交,將快照持久化提交到Git目錄

學完本篇,我們需要懂得什么是Git,Git與傳統集中式版本控制系統的主要區別,及Git的基本工作流程,下一篇將詳細介紹Git的使用與指令。

 

來自:http://blog.codingplayboy.com/2017/01/08/git_basic/

 

 本文由用戶 znzdl123 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!