GIT底層原理(一)
git暫存操作原理:git add
暫存操作會對先每一個檔案計算校驗和checksum(Git 使用SHA-1 演算法計算資料的校驗和,通過對檔案的內容或目錄的結構計算出一個SHA-1 雜湊值,作為指紋字串,該字串由40 個十六進位制字元,並將此結果作為資料的唯一標識和索引),然後把當前版本的檔案快照儲存到本地Git 倉庫中(Git 使用blob 型別的物件儲存這些檔案內容快照),並將校驗和加入暫存區域。
注意:所有儲存在Git 資料庫中的東西都是用此雜湊值來作索引的,不是靠檔名。
git commit 原理:
在使用git commit 新建一個提交物件前,Git 會先計算每一個子目錄(專案根目錄)的校驗和,然後在Git 倉庫中將這些目錄儲存為樹(tree)物件。之後Git 建立的提交物件,除了包含相關提交資訊以外,還包含著指向這個樹物件(專案根目錄)的指標,如此它就可以在將來需要的時候,重現此次快照的內容了。
例如:一個專案裡假如有三個檔案ReadME,LICENSE,test.rb,commit後倉庫裡會儲存五個物件。
之後修改後再次提交。那麼新的commit物件會包含上一次提交物件的指標parent。經過兩次提交後,倉庫歷史結構(git log)
git核心“分支“:
git的分支是十分的輕量級,git的新建分支,合併分支等操作幾乎是瞬間完成。
1、Git 建立一個新的分支僅僅是建立一個新的分支指標。如:git branch testing 建立一個testing分支;會commit 物件上新建一個分支指標並指向當前commit
2、,Git 是如何知道當前在哪個分支上工作的呢?有一個名為HEAD 的特別指標,執行git branch 命令,僅僅是建立了一個新的分支,但不會自動切換到這個分支中,所以當前我們仍然在master分支。
3、要切換到其他分支,執行git checkout 命令。我們現在轉換到新建的testing 分支:git checkout testing,git僅僅是將HEAD指標指向了testing,幾乎瞬間完成。
4、如果這時我們再次修改了檔案,並提交(git commit ),僅僅是testing分支指向了最新commit ,而master仍指向在原來的commit
5、使用git checkout master切換回master分支。git做了兩件事它把HEAD 指標移回到master 分支,並把工作目錄中的檔案換成了master 分支所指向的快照內容。
注意:以上1、2、3、4、5 圖中的箭頭僅僅為了展示git提交的前後順序。在git中新的commit物件中的parent是指向著上一個commit。
6、在master分支我們修改檔案再進行提交,這時專案提交歷史產生了分叉。
Git 中的分支實際上僅是一個包含所指物件校驗和(40 個字元長度SHA-1 字串)的檔案,所以建立和銷燬一個分支就變得非常廉價。新建一個分支就是向一個檔案寫入41 個位元組(外加一個換行符)。
如果我們有需要我們可以完全再次checkout到testing分支去開發新的功能。我們可以在分支間隨意切換,並且都是瞬間切換完成。這和之前大多數版本控制系統形成了鮮明對比,它們管理分支大多采取備份所有專案檔案到特定目錄的方式,所以根據專案檔案數量和大小不同,可能花費的時間也會有相當大的差別,快則幾秒,慢則數分鐘。而Git 的實現與專案複雜度無關,它永遠可以在幾毫秒的時間內完成分支的建立和切換。每次提交時都記錄了祖先資訊(譯註:即parent 物件),所以以後要合併分支時,尋找恰當的合併基礎(譯註:即共同祖先)的工作其實已經完成了一大半。
相關推薦
GIT底層原理(一)
git暫存操作原理:git add 暫存操作會對先每一個檔案計算校驗和checksum(Git 使用SHA-1 演算法計算資料的校驗和,通過對檔案的內容或目錄的結構計算出一個SHA-1 雜湊值,作為指紋字串,該字串由40 個十六進位制字元,並將此結果作為資料的唯一標識和索引)
一步步深入Java底層原理(一)
接觸Java也快半年時間了,但是對Java的底層原理還不是非常清楚,最近在看《Java虛擬機器(第二版)》,深有啟發,順便把Java知識梳理一下,以便更好的進行接下來的學習。 Java技術體系劃分(
一步步深入Java底層原理(四)
Java物件的建立: 在建立物件時通常只是一個new關鍵字,但是Java虛擬機器首先會檢查引數是否能在常量池中定位到一個類的符號引用,並檢查這個類是否已經被載入,解析和初始化過,如果沒有,那麼必須先執行類的載入。 類的載入、連線、初始化三個
一步步深入Java底層原理(三)
ArrayList的實現原理: 1. ArrayList概述: ArrayList是List介面的可變陣列的實現。實現了所有可選列表操作,並允許包括 null 在內的所有元素。除了實現 List
java併發機制的底層實現原理(一):volatile深入分析
java程式碼最終會被類載入器載入到JVM中,然後轉化為彙編指令在CPU上執行。java中所使用的併發機制依賴於JVM的實現和CPU的指令。 1.volatile的應用 volatile是一個輕量級的synchronize,它保證了共享變數的可見性,確保了所有執
android底層驅動學習之I2C概述及工作原理(一)
1.概述:I²C 是Inter-Integrated Circuit的縮寫,發音為"eye-squaredcee" or "eye-two-cee" , 它是一種兩線介面。I²C 只是用兩條雙向的線,一條 Serial Data Line (SDA) ,另一條Serial
socket 由淺入深系列------ 原理(一)
ora internal 概念 pro tcp協議 如何 控制 是的 depends 來自:網絡整理 個人覺得寫一個網絡應用程序沒有是一件非常easy的事。其實,我們剛開始的時候總覺得的原則: 建立------》連接套接字-------》接受一個連接----》發送數據
Git學習筆記(一)
git1、Git的介紹及安裝Git:全宇宙最牛的分布式版本控制軟件,Git是目前世界上最先進的分布式版本控制系統#CentOS7下git的安裝 [[email protected]/* */ ~]# yum -y install git #設置git賬號信息 [[email protec
solr搜索之入門及原理(一)
solr solr入門 1 solr簡介solr官方文檔:http://wiki.apache.org/solr/DataImportHandler 下載地址:http://www.apache.org/dyn/closer.cgi/lucene/solr/2 solr入門我們使
Git學習筆記(一) --- --- git的安裝及本地倉庫的創建,github上倉庫的連接方式
由於 分布式版本控制 是我 控制系統 路徑 一行代碼 信息 控制 fff 首先了解git的作用是什麽,本地倉庫,中央倉庫都是幹什麽的? Git是分布式版本控制系統,同一個Git倉庫,可以分布到不同的機器上。實際情況往往是這樣,找一臺電腦充當服務器的角色,每天24小時開機,其
Git常用命令(一)------ 本地操作
mov ast 常用 stage director git reset 本地 posit 自動 本文總結自廖雪峰的網站。 幾個名詞: 工作區(Working Directory):電腦裏能看到的目錄 版本庫(Repository):包含暫存區和master 暫存區(Stag
QR二維碼原理(一)
info 分別是 最大 mask 多字節字符 包含 多字節 版本 錯誤 一、什麽是QR碼 QR碼屬於矩陣式二維碼中的一個種類,由DENSO(日本電裝)公司開發,由JIS和ISO將其標準化。QR碼的樣子其實在很多場合已經能夠被看到了,我這還是貼個圖展示一下: 這個圖如果被正確
React-Native系列Android——Native與Javascript通信原理(一)
from 直接 最新 一點 明顯 rem 負責 receive esp React-Native最核心的是Native與Javascript之間的通信,並且是雙向通信
Git安裝教程(一)
因此 自己的 ... 不同的 zed ruby ron diff log 1.安裝下載 在Windows上使用Git,可以從Git官網直接下載安裝程序,(網速慢的同學請移步國內鏡像),然後按默認選項安裝即可。 安裝完成後,在開始菜單裏找到“Git”->“Git Bas
git 命令行(一)
IT 暫存區 round 不同版本 版本控制 p s OS ref 修改 1. 版本回退 在實際工作中,我們腦子裏怎麽可能記得一個幾千行的文件每次都改了什麽內容,不然要版本控制系統幹什麽。版本控制系統肯定有某個命令可以告訴我們歷史記錄,在Git中,我們用 git log
Android插件化原理(一)Activity插件化
ssa AS 直接 接收 hat ati 操作 運行 for Android深入四大組件系列 Android解析AMS系列 Android解析ClassLoader系列 前言 四大組件的插件化是插件化技術的核心知識點,而Activity插件化更是重中之重,Activity插
虛擬化技術基礎原理(一)
jvm 方案 versions -m style work viso The tag 虛擬化技術: 虛擬化技術類型: 主機虛擬化:xen, kvm, virtualbox, ... 容器(用戶空間隔離): lxc(LinuX Container), openvz, ..
GCC編譯器原理(一)------交叉編譯器制作和GCC組件及命令
bst share 因此 armv4t 前端 通信 定義 arm 文件名 1.1 交叉編譯器制作 默認安裝的 GCC 編譯系統所產生的代碼適用於本機,即運行 GCC 的機器,但也可將 GCC 安裝成能夠生成其他的機器代碼。安裝一些必須的模塊,就可產生多種目標機器代碼,而且可
Vue原理(一)——初始化data屬性
插入 一個 date pda 屬性 data屬性 bject 個數 [] let app = new Vue({ data: { text: "text", text2: "text2" } }) 第一步: 使用observe
在Mac上Git的使用(一)
Windows版本大家都操作很熟悉了現在來說說Mac 1、在你的Mac上指定的目錄下,新建一個“本地倉庫”,命令如下: [plain] view plain copy git