對Git工作原理的一些理解

2021-09-22 22:35:40 字數 1772 閱讀 1896

網上有很多關於git的教程,或copy或不完整,且大多停留於表面,看完之後對git僅有非常淺顯的了解,有的只是對幾條簡單的命令進行了敘述。本文將結合git的設計原理和實現方法,幫助讀者理解git,減少讀者的學習成本。

git與其它版本控制系統(包括 subversion 和近似工具)的主要差別在於 git 對待資料的方法。 我們常見的版本控制工具,如cvs、subversion、perforce、bazaar 等等,則是將它們儲存的資訊看作是一組基本檔案和每個檔案隨時間逐步累積的差異,以檔案變更列表的方式儲存資訊。

而git更像是把資料看作是對小型檔案系統的一組快照,將使用者對**的修改用快照的方式進行記錄,主要對當時的全部檔案製作乙個快照並儲存這個快照的索引。git記錄資訊修改的方式可以被稱作為:快照流

比較上面兩張的內容可以清楚的理解git和其他版本控制管理工具再設計上的差異。

不同於其他型別vcs,git 中的絕大多數操作都**只需要訪問本地檔案和資源**,一般不需要來自網路上其它計算機的資訊,在本地磁碟上就有專案的完整歷史。只有當你需要將專案開源或者推送到遠端時,才需要通過網路傳輸資源。

正因為git將所有的資料都儲存在本地,如果你要瀏覽專案的歷史,git 不需外連到伺服器(中心伺服器)去獲取歷史,然後再顯示出來——它只需直接從本地資料庫中讀取。 你能立即看到專案歷史。 如果你想檢視當前版本與乙個月前的版本之間引入的修改,git 會查詢到乙個月前的檔案做一次本地的差異計算,而不是由遠端伺服器處理或從遠端伺服器拉回舊版本檔案再來本地處理。

git對檔案所處的狀態進行了區分,以更好地管理當前**。

git根據資料的狀態,將內容分為了三種狀態:

在我們使用git init命令初始化乙個倉庫,並向倉庫包含的目錄內放入了一些檔案,此時該目錄內的檔案的區域就是工作目錄,處於工作目錄的內容git不會對檔案修改進行記錄。

當我們完成了對幾個檔案的修改,可使用git add命令跟蹤檔案,此時檔案處於暫存狀態,將檔案的快照放入暫存區域。因為不是每乙個檔案都需要進行記錄,所以可使用git add [filename]選擇相應的檔案,也可用git add -a 快速新增當前目錄下的所有檔案至暫存區。(git add 命令是個多功能命令:可以用它開始跟蹤新檔案,或者把已跟蹤的檔案放到暫存區,還能用於合併時把有衝突的檔案標記為已解決狀態等。 將這個命令理解為「新增內容到下一次提交中」而不是「將乙個檔案新增到專案中」要更加合適)

我們在第2步已經記錄下了需要提交的可用**的列表,此時在完成了一階段或某一功能的開發後,便可使用git commit命令提交更新。找到暫存區域的檔案,將快照永久性儲存到 git 倉庫目錄。git倉庫目錄中的內容就是我們本地最終的可用**。

推送遠端倉庫:在完成了本地的commit操作後,倉庫處於已提交狀態(committed),此時可使用git push [本地分支別名] [遠端分支別名]將當前倉庫(repository)中本分支的內容提交至遠端相應分支進行儲存。(關於分支的操作會在後續進行介紹

ps. 如果 git 目錄中儲存著特定版本的檔案,就屬於已提交狀態。 如果作了修改並已放入暫存區域,就屬於已暫存狀態。 如果自上次取出後,作了修改但還沒有放到暫存區域,就是已修改狀態。

git檔案的宣告週期:

待續…

對Linux inode的一些理解

檔名 inode device block 一 inode是什麼?理解inode,要從檔案儲存說起。檔案儲存在硬碟上,硬碟的最小儲存單位叫做 扇區 sector 每個扇區儲存512位元組 相當於0.5kb 作業系統讀取硬碟的時候,不會乙個個扇區地讀取,這樣效率太低,而是一次性連續讀取多個扇區,即一次...

對棧的一些理解

之前總結過一篇有關函式棧幀的部落格 函式棧幀以及呼叫約定相關的一些總結 但是感覺自己還是有一點知識點沒有弄懂,今天中午跟郭哥吃過飯一起 有關殼的問題的時候,順便把這個問題請教了一下郭哥,終於弄明白了,在此要特地感謝他,這裡把一些心得體會寫出來 先看一幅圖 選自ida權威指南 注意圖中是基於esp的棧...

對EK的一些理解

首先是網路流問題的提出 乙個源點,乙個匯點,不斷又源點向匯點輸送,其中路徑上有最大速度,求匯點收貨的最大速度是多少。在求之前可以先模擬一下過程如果源點現在只能出乙個單位的貨,那麼他會找乙個未達到最大速度的路進行運輸,接著我們不斷將運輸的量放大,即不斷地從起點開始尋找增廣路,每次都對其進行增廣,直到源...